Pemanggilan Alat dengan Ollama

Penulis

Joshua Noble

Data Scientist

Pemanggilan Alat dengan Ollama

Pemanggilan alat dalam Model Bahasa Besar (LLM) adalah kemampuan LLM untuk berinteraksi dengan alat eksternal, layanan, atau antarmuka pemrograman aplikasi (API) untuk melaksanakan tugas. Hal ini memungkinkan LLM untuk memperluas fungsionalitasnya, meningkatkan kemampuannya dalam menangani tugas-tugas dunia nyata yang mungkin memerlukan akses ke data eksternal, informasi real-time, atau aplikasi spesifik. Ketika sebuah LLM menggunakan alat pencarian web, ia dapat mengakses web untuk mengambil data real-time yang tidak tersedia dalam data pelatihan model. Jenis alat lain yang mungkin digunakan meliputi Python untuk perhitungan, analisis data, atau visualisasi, atau memanggil titik akhir layanan untuk data. Pemanggilan alat dapat membuat chatbot lebih dinamis dan mudah beradaptasi, memungkinkannya memberikan tanggapan yang lebih akurat, relevan, dan terperinci berdasarkan data langsung atau tugas khusus di luar basis pengetahuan langsungnya. Kerangka kerja populer untuk pemanggilan alat termasuk Langchain dan sekarang ollama.

Ollama adalah platform yang menawarkan model AI sumber terbuka untuk digunakan pada perangkat pribadi sehingga pengguna dapat menjalankan LLM langsung di komputer mereka. Tidak seperti layanan seperti OpenAI API, Ollama tidak memerlukan akun karena modelnya ada di mesin lokal Anda. Ollama berfokus pada privasi, kinerja, dan kemudahan penggunaan, memungkinkan pengguna untuk mengakses dan berinteraksi dengan model AI tanpa mengirim data ke server eksternal. Hal ini dapat menjadi pilihan yang menarik bagi mereka yang peduli dengan privasi data atau ingin menghindari ketergantungan pada API eksternal. Platform Ollama dirancang agar mudah disiapkan dan digunakan, dan mendukung berbagai model, memberi pengguna berbagai alat untuk pemrosesan bahasa alami, pembuatan kode, dan tugas AI lainnya langsung di perangkat keras mereka sendiri. Arsitektur ini sangat cocok untuk arsitektur berbasis alat karena dapat mengakses semua kemampuan lingkungan lokal, termasuk data, program, dan perangkat lunak kustom.

Dalam tutorial ini, Anda akan belajar cara menyiapkan pemanggilan alat menggunakan Ollama untuk menjelajahi sistem file lokal, suatu tugas yang akan sulit dilakukan dengan LLM jarak jauh. Banyak model Ollama tersedia untuk pemanggilan alat dan membangun agen AI seperti Mistral dan Llama 3.2, daftar lengkapnya tersedia di situs web Ollama. Dalam hal ini kita akan menggunakan IBM Granite 3.2 Dense yang memiliki dukungan alat. Model 2B dan 8B adalah LLM padat hanya teks yang dilatih untuk mendukung contoh penggunaan berbasis alat dan untuk generasi dengan dukungan pengambilan data (RAG), menyederhanakan pembuatan kode, terjemahan, dan perbaikan bug.

Notebook untuk tutorial ini dapat diunduh dari Github di sini.

Langkah 1: Instal Ollama

Pertama, Anda akan mengunduh ollama dari https://ollama.com/download dan menginstalnya untuk sistem operasi Anda. Pada OSX, langkah ini dilakukan melalui file .dmg, di Linux melalui perintah shell tunggal, dan di Windows dengan penginstal. Anda mungkin memerlukan akses admin pada mesin Anda untuk menjalankan penginstal.

Anda dapat menguji apakah ollama diinstal dengan benar dengan membuka terminal atau command prompt dan memasukkan:

ollama -v 

 

Langkah 2: Instal pustaka

Selanjutnya, Anda akan menambahkan impor awal. Demo ini akan menggunakan pustaka python ollama untuk berkomunikasi dengan ollama dan pustaka pymupdf untuk membaca file PDF dalam sistem file.

!pip install pymupdf

import ollama
import os
import pymupdf

 

Selanjutnya Anda akan mengambil model yang akan Anda gunakan sepanjang tutorial ini. Langkah ini akan mengunduh bobot model dari ollama ke komputer lokal Anda dan menyimpannya untuk digunakan tanpa perlu melakukan panggilan API jarak jauh di waktu berikutnya.

!ollama pull granite3.2
!ollama pull granite3.2-vision

Langkah 3: Tentukan alat-alat yang diperlukan

Sekarang Anda akan menentukan alat yang akan diakses oleh instance alat ollama. Karena tujuan dari alat ini adalah untuk membaca file dan melihat-lihat gambar di sistem file lokal, Anda akan membuat dua fungsi python untuk masing-masing alat tersebut. Yang pertama disebutsearch_text_files dan memerlukan kata kunci yang akan dicari di file lokal. Untuk keperluan demo ini, kode hanya mencari file di folder tertentu, tetapi dapat diperluas untuk menyertakan parameter kedua yang menetapkan folder mana yang akan menjadi lokasi pencarian oleh alat ini.

Anda dapat menggunakan pencocokan string sederhana untuk melihat apakah kata kunci ada dalam dokumen. Namun, karena ollama membuat pemanggilan LLM lokal dengan mudah,search_text_files akan menggunakan Granite 3.2 untuk menentukan apakah kata kunci menggambarkan teks dokumen. Hal ini dilakukan dengan membaca dokumen menjadi string yang disebutdocument_text . Fungsi tersebut kemudian memanggil ollama.chat dan memberikan prompt berikut pada model:

"Respond only 'yes' or 'no', do not add any additional information. Is the following text about " + keyword + "? " + document_text 

Jika model merespons 'yes', maka fungsi menampilkan nama file yang berisi kata kunci yang ditunjukkan pengguna dalam prompt. Jika tidak ada file yang tampaknya berisi informasi, maka fungsi menampilkan 'None' sebagai string.

Fungsi ini mungkin berjalan lambat pertama kali karena ollama akan mengunduh Granite 3.2 Dense. 

def search_text_files(keyword: str) -> str:
  
  directory = os.listdir("./files/")
  for fname in directory:
    
    # look through all the files in our directory that aren't hidden files
    if os.path.isfile("./files/" + fname) and not fname.startswith('.'):

        if(fname.endswith(".pdf")):
           
           document_text = ""
           doc = pymupdf.open("./files/" + fname)

           for page in doc: # iterate the document pages
               document_text += page.get_text() # get plain text (is in UTF-8)
               
           doc.close()

           prompt = "Respond only 'yes' or 'no', do not add any additional information. Is the following text about " + keyword + "? " + document_text 

           res = ollama.chat(
                model="granite3.2:8b",
                messages=[{'role': 'user', 'content': prompt}]
            )

           if 'Yes' in res['message']['content']:
                return "./files/" + fname

        elif(fname.endswith(".txt")):

            f = open("./files/" + fname, 'r')
            file_content = f.read()
            
            prompt = "Respond only 'yes' or 'no', do not add any additional information. Is the following text about " + keyword + "? " + file_content 

            res = ollama.chat(
                model="granite3.2:8b",
                messages=[{'role': 'user', 'content': prompt}]
            )
           
            if 'Yes' in res['message']['content']:
                f.close()
                return "./files/" + fname

  return "None"

Alat kedua disebut search_image_files  dan memerlukan kata kunci yang akan dicari di foto lokal. Pencarian dilakukan dengan menggunakan model deskripsi gambar Granite 3.2 Vision melalui ollama. Model ini akan menampilkan teks deskripsi setiap file gambar dalam folder dan mencari kata kunci dalam deskripsi. Salah satu kelebihan menggunakan ollama adalah sistem multi-agen dapat dengan mudah dibangun untuk memanggil satu model dengan model lainnya.

Fungsi menampilkan sebuah string, yaitu nama file yang deskripsi -nya berisi kata kunci yang ditunjukkan pengguna dalam prompt.

def search_image_files(keyword:str) -> str:

    directory = os.listdir("./files/")
    image_file_types = ("jpg", "png", "jpeg")

    for fname in directory:

        if os.path.isfile("./files/" + fname) and not fname.startswith('.') and fname.endswith(image_file_types):
            res = ollama.chat(
                model="granite3.2-vision",
                messages=[
                    {
                        'role': 'user',
                        'content': 'Describe this image in short sentences. Use simple phrases first and then describe it more fully.',
                        'images': ["./files/" + fname]
                    }
                ]
            )

            if keyword in res['message']['content']:
                return "./files/" + fname
    
    return "None"

Langkah 4: Tentukan alat-alat yang akan digunakan untuk Ollama

Setelah fungsi yang akan dipanggil ollama telah ditentukan, Anda akan mengonfigurasi informasi alat untuk ollama itu sendiri. Langkah pertama adalah membuat objek yang memetakan nama alat ke fungsi untuk pemanggilan fungsi ollama:

available_functions = {
  'Search inside text files':search_text_files,
  'Search inside image files':search_image_files
}

Selanjutnya, konfigurasikan array alat untuk memberi tahu ollama alat apa yang akan diaksesnya dan apa yang dibutuhkan alat tersebut. Array ini berisi satu skema objek per alat yang memberi tahu kerangka kerja pemanggilan alat ollama cara memanggil alat dan apa yang ditampilkannya.

Terkait kedua alat yang Anda buat sebelumnya, keduanya adalah fungsi yang memerlukan parameter keyword ini. Saat ini hanya fungsi yang didukung meskipun ini dapat berubah di masa mendatang. Deskripsi fungsi dan parameter membantu model memanggil alat dengan benar. Parameter Deskripsi untuk fungsi setiap alat diteruskan ke LLM ketika fungsi tersebut memilih alat mana yang akan digunakan. Parameter Deskripsi dari kata kunci diteruskan ke model ketika fungsi tersebut menghasilkan parameter yang akan diteruskan ke alat. Kedua hal ini merupakan tempat yang mungkin perlu Anda perhatikan untuk menyempurnakan prompt ketika Anda membuat aplikasi pemanggilan alat Anda sendiri dengan ollama.

# tools don't need to be defined as an object but this helps pass the correct parameters
# to the tool call itself by giving the model a prompt of how the tool is to be used
ollama_tools=[
     {
      'type': 'function',
      'function': {
        'name': 'Search inside text files',
        'description': 'This tool searches in PDF or plaintext or text files in the local file system for descriptions or mentions of the keyword.',
        'parameters': {
          'type': 'object',
          'properties': {
            'keyword': {
              'type': 'string',
              'description': 'Generate one keyword from the user request to search for in text files',
            },
          },
          'required': ['keyword'],
        },
      },
    },
    {
      'type': 'function',
      'function': {
        'name': 'Search inside image files',
        'description': 'This tool searches for photos or image files in the local file system for the keyword.',
        'parameters': {
          'type': 'object',
          'properties': {
            'keyword': {
              'type': 'string',
              'description': 'Generate one keyword from the user request to search for in image files',
            },
          },
          'required': ['keyword'],
        },
      },
    },
  ]


Anda akan menggunakan definisi alat ini ketika Anda memanggil ollama dengan input pengguna.

Langkah 5: Berikan input pengguna ke Ollama

Sekarang saatnya untuk meneruskan input pengguna ke ollama dan membuatnya menampilkan hasil panggilan alat. Pertama, pastikan bahwa ollama berjalan di sistem Anda:

# if ollama is not currently running, start it
import subprocess
subprocess.Popen(["ollama","serve"], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)

Jika berjalan, Ollama akan menampilkan:

<Popen: returncode: None args: ['ollama', 'serve']>

Sekarang minta input dari pengguna. Anda juga dapat melakukan hardcode input atau mengambil dari antarmuka obrolan, tergantung konfigurasi aplikasi Anda. Fungsi input  akan menunggu input pengguna sebelum melanjutkan.

# input
user_input = input("What would you like to search for?")
print(user_input)

Sebagai contoh, jika pengguna memasukkan "Information about dogs (Informasi tentang anjing)" sel ini akan mencetak:

Information about dogs

Sekarang permintaan pengguna diteruskan ke ollama. Pesan ini membutuhkan peran untuk pengguna dan konten yang diinput pengguna. Pesan ini diteruskan ke ollama menggunakan fungsi chat ini. Parameter pertama adalah model yang ingin Anda gunakan, dalam hal ini Granite 3.2 Dense, lalu pesan dengan input pengguna, dan akhirnya array alat yang Anda konfigurasi sebelumnya.

Fungsi chat akan menghasilkan output yang memilih alat mana yang akan digunakan dan parameter apa yang harus diteruskan ke alat tersebut dalam panggilan alat berikutnya.

messages = [{'role': 'user', 'content':user_input}]

response: ollama.ChatResponse = ollama.chat(
   
  # set which model we're using
  'granite3.2:8b',

  # use the message from the user
  messages=messages,

  tools=ollama_tools
)

Sekarang setelah model menghasilkan panggilan alat di output, jalankan semua panggilan alat dengan parameter yang dihasilkan model dan periksa outputnya. Dalam aplikasi ini, Granite 3.2 Dense digunakan untuk menghasilkan output akhir juga, sehingga hasil panggilan alat ditambahkan ke input pengguna awal dan kemudian diteruskan ke model.

Beberapa panggilan alat dapat menampilkan kecocokan file, sehingga respons dikumpulkan dalam array yang kemudian diteruskan ke Granite 3.2 untuk menghasilkan respons. Prompt yang mendahului data memberi instruksi untuk model tentang cara merespons:

If the tool output contains one or more file names, then give the user only the filename found. Do not add additional details. 
If the tool output is empty ask the user to try again. Here is the tool output: 

Output akhir kemudian dihasilkan menggunakan nama file yang ditunjukkan atau 

# this is a place holder that to use to see whether the tools return anything 
output = []

if response.message.tool_calls:
  
  # There may be multiple tool calls in the response
  for tool_call in response.message.tool_calls:

    # Ensure the function is available, and then call it
    if function_to_call := available_functions.get(tool_call.function.name):
      print('Calling tool: ', tool_call.function.name, ' \n with arguments: ', tool_call.function.arguments)
      tool_res = function_to_call(**tool_call.function.arguments)

      print(" Tool response is " + str(tool_res))

      if(str(tool_res) != "None"):
        output.append(str(tool_res))
        print(tool_call.function.name, ' has output: ', output)
    else:
      print('Could not find ', tool_call.function.name)

  # Now chat with the model using the tool call results
  # Add the function response to messages for the model to use
  messages.append(response.message)

  prompt = '''
    If the tool output contains one or more file names, 
    then give the user only the filename found. Do not add additional details. 
    If the tool output is empty ask the user to try again. Here is the tool output: 
  '''

  messages.append({'role': 'tool', 'content': prompt + " " + ", ".join(str(x) for x in output)})
  
  # Get a response from model with function outputs
  final_response = ollama.chat('granite3.2:8b', messages=messages)
  print('Final response:', final_response.message.content)

else:

  # the model wasn't able to pick the correct tool from the prompt
  print('No tool calls returned from model')

Menggunakan file yang disediakan untuk tutorial ini, prompt " Information about dogs (Informasi tentang anjing" akan menampilkan:

    Calling tool:  Search inside text files  
     with arguments:  {'keyword': 'dogs'}
     Tool response is ./files/File4.pdf
    Search inside text files  has output:  ['./files/File4.pdf']
    Calling tool:  Search inside image files  
     with arguments:  {'keyword': 'dogs'}
     Tool response is None
    Final response: The keyword "dogs" was found in File4.pdf.

Anda dapat melihat bahwa Granite 3.2 memilih kata kunci yang benar dari input, 'dogs', dan mencari melalui file di folder, kemudian menemukan kata kunci dalam file PDF. Karena hasil LLM tidak sepenuhnya deterministik, Anda mungkin mendapatkan hasil yang sedikit berbeda dengan prompt yang sama atau prompt yang sangat mirip.

Solusi terkait
Agen AI untuk bisnis

Bangun, terapkan, dan kelola asisten dan agen AI yang kuat yang mengotomatiskan alur kerja dan proses dengan AI generatif.

    Menjelajahi watsonx Orchestrate
    Solusi agen AI IBM

    Bangun masa depan bisnis Anda dengan solusi AI yang dapat Anda percaya.

    Jelajahi solusi agen AI
    Layanan AI IBM Consulting

    Layanan IBM Consulting AI membantu merancang ulang cara kerja bisnis dengan AI untuk transformasi.

    Jelajahi layanan kecerdasan buatan
    Ambil langkah selanjutnya

    Baik Anda memilih untuk menyesuaikan aplikasi dan keterampilan yang dibangun sebelumnya atau membangun dan menerapkan layanan agen khusus menggunakan studio AI, platform IBM watsonx siap membantu Anda.

    Menjelajahi watsonx Orchestrate Jelajahi watsonx.ai