Membangun agen penalaran ReWOO menggunakan IBM Granite

Penulis

Jobit Varughese

Technical Content Writer

IBM

Model bahasa besar (LLM) dan varian yang disempurnakan, model bahasa tambahan (ALM), telah menjadi tulang punggung sistem AI modern. Dengan menggabungkan generasi bahasa yang kuat dengan teknik pengambilan pengetahuan eksternal seperti generasi dengan dukungan pengambilan data (RAG), mereka memungkinkan penalaran lanjutan, penjawab pertanyaan, dan otomatisasi tugas di berbagai domain. Namun, terlepas dari kemampuan yang luar biasa, model ini sering menghadapi tantangan seperti ketahanan yang tidak konsisten di seluruh sistem, penggunaan token yang tinggi, waktu tanggapan yang lambat, dan inefisiensi yang disebabkan oleh dorongan berulang dan konteks yang berlebihan, ketika menangani tugas-tugas yang kompleks. Keterbatasan tersebut meningkatkan biaya operasional dan menghambat skalabilitas dan kinerja real-time.

Untuk mengatasi masalah ini, kerangka kerja ReWOO (penalaran tanpa pengamatan) menawarkan pendekatan baru yang berfokus pada pemisahan penalaran dari pengambilan pengetahuan eksternal. Alih-alih menggunakan satu LLM untuk mencoba menalar, bertindak, dan mengamati secara bergantian, ReWOO memisahkan fungsi-fungsi ini ke dalam modul-modul terpisah, masing-masing berpotensi didukung oleh LLM, tetapi dengan peran yang spesifik. Dengan memodularisasi proses menjadi tahap-tahap perencanaan, pengumpulan bukti, dan sintesis yang terpisah, ReWOO meningkatkan efisiensi dan akurasi token. Ini juga membuat sistem lebih mudah untuk di-debug dan memungkinkan alur kerja AI yang lebih efisien dan efektif.

Metodologi di balik ReWOO

Alur kerja ReWoo berkisar pada tiga komponen utama: penalaran bertahap, pemanggilan alat, dan peringkasan. Komponen-komponen ini diimplementasikan dalam struktur modular yang terdiri dari tiga bagian: perencana, pekerja, dan pemecah masalah.

Perencana

Perencana memecah tugas utama menjadi urutan subpertanyaan yang terfokus, menciptakan cetak biru yang jelas. Alih-alih meminta LLM untuk menjawab pertanyaan kompleks sekaligus yang dapat menyebabkan penggunaan token yang berlebihan dan tanggapan yang kacau, perencana membuat cetak biru atau peta jalan. Perincian bertahap ini memandu alur kerja dan menjaga proses penalaran tetap terstruktur.

Pekerja

Pekerja menggunakan alat eksternal seperti mesin pencari atau database untuk mengambil informasi dan bukti yang relevan yang diperlukan untuk menjawab subpertanyaan. Ini menggunakan LLM untuk merumuskan jawaban yang jelas dan ringkas hanya berdasarkan informasi yang diambil ini. Fase pengamatan eksternal ini dipisahkan dari proses penalaran untuk menghindari pengulangan prompt yang tidak perlu dan untuk mengurangi konsumsi token.

Pemecah masalah

Pemecah masalah mensintesis semua insight yang dikumpulkan untuk menghasilkan respons akhir baru yang terstruktur dengan baik. Pemisahan modular ini membantu memastikan penalaran yang efisien, akurat, dan dapat diskalakan dengan model bahasa yang besar.

Kerangka kerja seperti LangChain dan LangGraph menyediakan alat yang tangguh untuk mengimplementasikan arsitektur ReWOO menggunakan model dari OpenAI, IBM Granite, atau alat khusus seperti Serper dan Tavily untuk pencarian.

Dalam tutorial ini, Anda akan menjelajahi cara membangun agen ReWOO yang melakukan tugas ringkasan konten. Agen ini dapat:

  • Memecah tugas tingkat tinggi menjadi subpertanyaan
  • Menggunakan penelusuran web untuk mengumpulkan konteks yang relevan untuk setiap subpertanyaan
  • Menghasilkan jawaban dengan menggunakan IBM Granite
  • Meringkas hasil menjadi respons akhir

Arsitektur ini berguna untuk:

  • Tugas peringkasan
  • Jawaban pertanyaan atas pengetahuan eksternal
  • Penalaran dinamis yang didukung alat

Teknologi yang digunakan

Tutorial langkah demi langkah ini memanfaatkan teknologi AI mutakhir, termasuk:

  1. IBM Granite Instruct: Sebuah model bahasa besar (LLM) yang andal dalam mengikuti instruksi umum, ideal untuk asisten AI di bidang bisnis dan domain lainnya.
  2. Transformers: Pustaka Python yang banyak digunakan yang menyediakan alat untuk memuat, membagi menjadi token, dan menjalankan model bahasa seperti IBM Granite. Hal ini memungkinkan pemrosesan input teks yang efisien dan pembuatan output model.

Langkah

Langkah 1: Siapkan lingkungan Anda

Tutorial ini memandu Anda melalui pengaturan lingkungan pengembangan lokal Anda untuk menjalankan pipeline penalaran gaya Rewoo dengan menggunakan Jupyter Notebook. Anda akan menggunakan model bahasa IBM Granite dan Serper.dev untuk pengambilan penelusuran web langsung.

Catatan: Tidak diperlukan GPU, tetapi eksekusi dapat lebih lambat pada sistem berbasis CPU. Langkah ini akan membuka lingkungan notebook tempat Anda dapat menyalin kode dari tutorial ini. Tutorial ini juga tersedia di GitHub.

Langkah 2: Instal dependensi yang diperlukan

Pustaka ini diperlukan untuk menjalankan pipeline reWOO dan berinteraksi dengan alat eksternal:

transformer: Memuat dan menjalankan model bahasa besar IBM Granite.

torch: kerangka kerja pembelajaran mendalam yang diperlukan untuk menjalankan model dengan efisien.

accelerate: Mengoptimalkan kinerja model di seluruh perangkat keras (opsional).

Permintaan: Mengirim permintaan HTTP POST ke API eksternal (seperti Serper).

!pip install transformers accelerate torch requests

Langkah 3: Impor pustaka yang diperlukan

Pada langkah ini, impor pustaka Python yang diperlukan untuk membangun komponen inti dari pipeline ReWooo.

transformers.AutoTokenizer: Memuat tokenizer yang mengubah teks menjadi token yang kompatibel dengan model bahasa.

transformers.AutoModelForCausalLM: Memuat model bahasa IBM Granite yang telah dilatih sebelumnya untuk menghasilkan respons.

transformers.pipeline: Menyediakan antarmuka tingkat tinggi untuk membuat pipeline pembuatan teks dengan cepat menggunakan tokenizer dan model.

import requests
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline

Langkah 4: Muat model IBM Granite dan buat pipeline pembuatan teks

Pada langkah ini, kita memuat model bahasa IBM Granite dan menginisialisasi pipeline pembuatan teks dengan menggunakan pustaka transformer Hugging Face. Jelajahi model Granite 3.2 2B Instruct di Hugging Face di sini.

model_id = "ibm-granite/granite-3.2-2b-instruct": Menentukan nama pos pemeriksaan model Granite IBM yang dihosting di Hugging Face. Model ini dioptimalkan untuk tugas-tugas mengikuti instruksi.

AutoTokenizer.from_pretrained(model_id): Memuat tokenizer yang terkait dengan model yang ditentukan. Ini bertanggung jawab untuk mengubah teks input menjadi token dan mendekode output token kembali menjadi teks.

AutoModelForCausAllm.from_pretrained (model_id): Memuat model bahasa (instruksi Granite 3.2 2B) untuk tugas pembuatan teks seperti menjawab pertanyaan atau ringkasan.

pipeline("text-generation", model=model, tokenizer=tokenizer): Membuat pipeline generasi teks tingkat tinggi yang menggabungkan model dan tokenizer, sehingga memudahkan untuk menghasilkan respons dari prompt.

model_id = "ibm-granite/granite-3.2-2b-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)
generator = pipeline("text-generation", model=model, tokenizer=tokenizer)

Langkah 5: Siapkan API Serper untuk pengambilan pencarian web

Pada langkah ini, kita mendefinisikan fungsi yang bertindak sebagai Pekerja dalam arsitektur reWOO. Pekerja ini menggunakan alat pencarian web, Serper.dev, untuk mengambil informasi yang relevan dan terkini dari internet untuk mendukung penalaran dan pembuatan jawaban. Serper.dev adalah API cepat dan ringan yang menyediakan hasil Google Penelusuran dalam format terstruktur, sehingga ideal untuk pengambilan informasi real-time dalam alur kerja AI.

Penyiapan ini memungkinkan sistem ReWOO untuk "mengamati" dunia nyata dengan menanyakan sumber pengetahuan eksternal sebelum LLM mengambil keputusan akhir.

Untuk menggunakan Serper di saluran ReWooo:

  1. Kunjungi https://serper.dev dan buat akun gratis.
  2. Setelah mendaftar, navigasikan ke Dasbor dan salin kunci API.
  3. Simpan kunci API dengan aman di dalam kode. Untuk saat ini, tetapkan secara langsung seperti yang ditunjukkan setelah ini:

SERPER_API_KEY = "<YOUR_API_KEY>" # Ganti ini dengan kunci API Anda yang sebenarnya

Catatan: Jangan pernah mengunggah kunci API Anda ke repositori publik. Untuk pengaturan produksi atau tim, gunakan.env file atau variabel lingkungan untuk menjaganya tetap aman.

Tangkapan layar ReWOO

def query_serper(pertanyaan, jumlah_hasil=3): Menentukan fungsi yang menerima pertanyaan pencarian dan mengembalikan cuplikan relevan dari hasil pencarian teratas.

payload = {"q": question, "num": num_results}: Memper siapkan payload kueri dengan istilah pencarian dan jumlah hasil yang akan dikembalikan.

response = requests.post(...): Mengirimkan permintaan POST ke API Serper dengan kueri dan header Anda.

response.raise_for_status(): Memunculkan kesalahan jika respons API tidak valid atau gagal.

snippets = [...]: Mengekstrak teks cuplikan dari hasil pencarian organik.

mengembalikan "\n".join(cuplikan): Menggabungkan dan mengembalikan cuplikan sebagai string tunggal, berfungsi sebagai konteks untuk model bahasa.

Catatan: Fungsi ini merupakan inti dari langkah "pengamatan" ReWOO, di mana bukti eksternal dikumpulkan untuk proses penalaran lebih lanjut. Pastikan kunci API Anda valid dan tidak terbatas pada tingkat saat pengujian.

SERPER_API_KEY = "your_serper_api_key_here" # Replace with your actual key
def query_serper(question, num_results=3):
    url = "https://google.serper.dev/search"
    headers = {
            "X-API-KEY": SERPER_API_KEY,
            "Content-Type": "application/json"
}
    payload = {"q": question, "num": num_results}
    response = requests.post(url, headers=headers, json=payload)
    response.raise_for_status()
    data = response.json()
    snippets = [item.get("snippet", "") for item in data.get("organic", [])]
    return "\n".join(snippets)

Langkah 6: Hasilkan jawaban berdasarkan informasi dengan menggunakan fungsi pakar

Pada langkah ini, kami mendefinisikan fungsi pakar(), yang berfungsi sebagai pemecah dalam arsitektur ReWOO. Pemecah mensintesis bukti eksternal yang diambil dan menghasilkan respons akhir dengan menggunakan model bahasa.

def pakar(pertanyaan: str) -> str: Fungsi pakar() mengambil pertanyaan (string) dan mengembalikan jawaban (string) yang dihasilkan oleh model Granite. Ia bekerja dengan mencari web dengan Serper.dev, mengumpulkan informasi yang relevan dan dengan menggunakannya untuk menghasilkan respons yang jelas dan lengkap.

context = query_serper(pertanyaan): Menggunakan alat pencarian web Serper untuk mengambil informasi yang relevan (pekerja).

prompt = f"""...""": Membangun prompt yang menginstruksikan model untuk menjawab hanya menggunakan konteks yang telah diambil.

generator(...): Memanggil model Granite untuk menghasilkan jawaban berdasarkan prompt input.

for _ in range(5): Pengulangan ini memungkinkan model menghasilkan jawaban secara bertahap, hingga 5 kali. Ini membantu jika jawabannya panjang dan tidak dapat diselesaikan sekaligus.

generated_text += new_text: Menambahkan setiap potongan teks baru ke dalam teks jawaban lengkap.

Jika new_text.endswith(...): Jika jawaban tampak lengkap (berakhir dengan titik, tanda tanya, atau tanda seru), dan memiliki cukup kata (lebih dari 50), maka pengulangan dihentikan.

tampilkan generated_text.strip(): Menampilkan jawaban akhir yang sudah dibersihkan.

Catatan:  Format prompt sangat penting, karena memastikan model tidak "berhalusinasi" atau keluar dari topik. Ini harus berfokus pada apa yang ada dalam konteks. Kami membatasi setiap potongan generasi hingga 120 token untuk mengontrol panjang output dan mengelola penggunaan sumber daya secara efisien sambil mencegah penggunaan token yang berlebihan.

def expert(question: str) -> str:
    context = query_serper(question) # your retrieval function
    prompt = f"""You are a knowledgeable expert. Based ONLY on the context below, answer the question clearly and concisely in your own words.
Do NOT mention any sources or references.
Context:
{context}
Question: {question}
Answer:"""
    input_prompt = prompt
    generated_text = ""
    last_generated = ""
    for _ in range(5): # up to 5 chunks
        outputs = generator(
            input_prompt,
            max_new_tokens=120,
            do_sample=False,
            eos_token_id=tokenizer.eos_token_id,
            # no invalid flags like 'temperature' here
        )
        text = outputs[0]["generated_text"]
        new_text = text[len(input_prompt):].strip()
        # Stop if no new content
        if new_text == last_generated:
            break
        generated_text += new_text + " "
        input_prompt = prompt + generated_text
        last_generated = new_text
        if new_text.endswith(('.', '!', '?')) and len(generated_text.split()) > 50:
            break
    return generated_text.strip()

Langkah 7: Tentukan modul perencana

Pada langkah ini, kami mendefinisikan fungsi Perencana, yang memecah tugas input yang luas menjadi subpertanyaan yang lebih kecil dan terdefinisi dengan baik, prinsip inti dari penalaran bertahap ReWooo.

def planner(task: str): Ini mendefinisikan fungsi bernama perencana yang menerima satu argumen tugas string yang menggambarkan tugas yang akan dilakukan).

topic = task.replace("Summarize", "").replace("the novella", "").strip(): Ekstrak subjek utama (misalnya, judul atau tema) dari tugas. Ini membersihkan input dengan menghapus frasa prompt umum seperti "Summarize" dan "the novella", lalu memangkas spasi putih di depan dan di belakang untuk mengisolasi topik inti.

return [ ... ]: Menampilkan daftar pertanyaan spesifik yang memandu modul Pekerja.

Catatan: Anda dapat memperluas daftar ini dengan subpertanyaan yang lebih spesifik tergantung kedalaman dan sifat input.

def planner(task: str):
topic = task.replace("Summarize", "").replace("the novella", "").strip()
return [
f"What is the main plot related to {topic}?",
f"Who are the key characters in {topic}?",
f"What themes are explored in {topic}?"
]

Langkah 8: Tentukan ringkasan akhir (modul pemecah masalah)

Pada langkah ini, kita mendefinisikan fungsi final_summarizer, yang bertindak sebagai pemecah masalah dalam pipeline reWOO. Fungsi ini mengambil subjawaban (bukti) yang disediakan oleh pekerja dan menghasilkan ringkasan baru yang koheren dengan menggunakan model bahasa.

def final_summarizer(task: str, sub_answers: dict) -> str: Menentukan fungsi yang menerima tugas asli dan subjawaban, dan mengembalikan ringkasan yang ringkas.

insight = "\n".join(sub_answers.values()): Menggabungkan semua jawaban menjadi satu string yang dipisahkan oleh baris baru untuk dimasukkan ke dalam prompt.

base_prompt = f"""...""": Membangun prompt yang menginstruksikan model untuk meringkas insight yang diberikan. Ini memandu model untuk menghasilkan ringkasan baru hanya berdasarkan subjawaban.

max_total_tokens = 400: Menetapkan batas atas untuk jumlah token yang dihasilkan guna menghindari output yang terlalu panjang.

max_loops = 5: Memungkinkan hingga 5 iterasi generasi untuk secara bertahap menyusun ringkasan.

for in range(maxloops): Iterasi untuk menghasilkan potongan teks menggunakan model bahasa.

response = generator(..., max_new_tokens=100, ...): Menggunakan generator (objek pipeline) untuk menghasilkan hingga 100 token baru dalam setiap pengulangan. Mode sampling (do_sample=true) memungkinkan variasi dan kreativitas dalam tanggapan.

if summary.endswith(...) or total_tokens_used >= max_total_tokens: Mengakhiri siklus jika ringkasan diakhiri dengan tanda baca yang benar atau mencapai batas token.

return summary.strip(): Menampilkan ringkasan akhir yang dipoles tanpa spasi di belakang.

def final_summarizer(task: str, sub_answers: dict) -> str:
    insights = "\n".join(sub_answers.values())
    base_prompt = f"""You are an expert summarizer. Based on the following insights, write a fresh, concise summary of the text. The summary must be newly written and must end in a complete sentence with proper punctuation.
Insights:
{insights}
Summary:"""
    summary = ""
    current_prompt = base_prompt
    max_total_tokens = 400
    total_tokens_used = 0
    max_loops = 5
    for _ in range(max_loops):
        response = generator(current_prompt, max_new_tokens=100, do_sample=True, top_p=0.9, eos_token_id=tokenizer.eos_token_id)
        chunk = response[0]["generated_text"][len(current_prompt):].strip()
        summary += " " + chunk
        summary = summary.strip()
        total_tokens_used += len(chunk.split())
        if summary.endswith(('.', '!', '?')) or total_tokens_used >= max_total_tokens:
            break
        # Prepare prompt for next loop
        current_prompt = base_prompt + summary
    return summary.strip()

Langkah 9: Mengorkestrasi agen reWOO dengan fungsi pemecah masalah

Pada langkah ini, kita mendefinisikan fungsi pemecah masalah, yang mewakili tahap akhir dalam pipeline reWOO. Ini mengatur proses penuh dengan menggunakan perencana, memanggil pakar (pekerja) dan menghasilkan ringkasan dengan menggunakan final_summarizer (pemecah masalah). Arsitektur ReWOO memungkinkan penalaran multilangkah dengan memecah tugas utama menjadi subpertanyaan menggunakan sebuah perencana. Setiap subpertanyaan dijawab secara mandiri oleh modul pakar, dan peringkas akhir merangkum semua jawaban menjadi tanggapan yang koheren. Pendekatan modular ini memungkinkan sistem untuk menangani tugas-tugas kompleks dengan lebih efektif.

def solver(task: str): Menentukan fungsi pengendali utama untuk menjalankan seluruh alur kerja ReWOO.

subquestions = planner(task): Menggunakan perencana untuk memecah tugas input menjadi subpertanyaan terfokus.

ans = pakar(q): Untuk setiap subpertanyaan, memanggil fungsi pakar untuk mengambil bukti berbasis web dan menghasilkan jawaban yang relevan. Setiap subpertanyaan yang dihasilkan oleh perencana diteruskan ke pakar sebagai input alat. Modul pakar memproses input dengan menggunakan model bahasa. Ini dapat dilihat sebagai mengeksekusi alat untuk subtugas tertentu.

answers[q] = ans: Menyimpan setiap jawaban yang diindeks berdasarkan pertanyaan yang sesuai untuk disimpulkan nanti.

final_summary = final_summarizer(task, answers): Memasukkan semua jawaban yang telah dikumpulkan ke dalam final_summarizer untuk menghasilkan ringkasan yang bersih dan koheren.

print(final_summary) dan return final_summary: Menampilkan dan mengembalikan ringkasan lengkap untuk tugas asli.

Catatan: Waktu total yang dibutuhkan oleh fungsi solver() dapat bervariasi antar sistem karena perbedaan kecepatan CPU, jumlah RAM yang tersedia, dan seberapa efisien model berjalan pada konfigurasi perangkat keras yang berbeda. Karena kode menggunakan strategi pembuatan berulang dengan model bahasa, sistem dengan kekuatan pemrosesan atau memori yang lebih rendah dapat memakan waktu yang jauh lebih lama. Pengambilan berbasis jaringan dan ukuran prompt yang besar juga dapat berkontribusi pada lamanya durasi. Untuk meningkatkan kinerja, pertimbangkan untuk mengurangi max_loops dengan menggunakan model yang lebih kecil atau terkuantisasi, mengoptimalkan pipeline tokenizer dan generator, atau menjalankan kode dalam lingkungan yang mendukung GPU seperti Google Colab atau Kaggle Notebooks.

def solver(task: str):
    print(f"Planner: Breaking down '{task}' into sub-questions...\n")
    subquestions = planner(task)
    answers = {}
    for q in subquestions:
        print(f"🔎 Expert answering: {q}")
        ans = expert(q)
        print(f"➡ Answer: {ans}\n")
        answers[q] = ans
    print("=== Final Summary ===\n")
    final_summary = final_summarizer(task, answers)
    print(final_summary)
    return final_summary

Langkah 10: Jalankan pipeline ReWOO untuk menghasilkan ringkasan akhir.

Pada langkah terakhir ini, kita menjalankan pipeline reWOO penuh dengan memanggil fungsi pemecah masalah dengan tugas tertentu.

solver("Summarize the novella The Metamorphosis"): Memicu seluruh proses ReWOO; perencanaan, pengambilan bukti, dan pembuatan ringkasan untuk tugas input: meringkas kumpulan data The Metamorphosis.

Langkah ini menghasilkan ringkasan akhir dan menunjukkan bagaimana komponen ReWOO bekerja sama secara end-to-end untuk contoh penggunaan nyata.

solver("Summarize the novella The Metamorphosis")

Poin-poin penting

  1. Agen ReWOO berhasil memecah tugas ("Ringkas novela The Metamorphosis") menjadi subpertanyaan yang bermakna tentang alur cerita, karakter, dan tema, sehingga memungkinkan pengambilan informasi yang terfokus.
  2. Setiap subpertanyaan dijawab menggunakan pencarian web real-time (Serper.dev) dan IBM Granite, sehingga menghasilkan jawaban yang relevan dan terstruktur dengan baik yang menangkap elemen inti dari teks.
  3. Jawaban akhir yang dihasilkan koheren, ditulis ulang dengan baik, dan akurat, menunjukkan bahwa generasi dengan dukungan pengambilan data dapat menghasilkan ringkasan berkualitas tinggi dan mirip manusia untuk tugas analisis sastra.

Catatan: Untuk meningkatkan kinerja dan keandalan saluran reWOO, penting untuk meningkatkan metrik evaluasi seperti kualitas ringkasan, koherensi, dan latensi pembuatan respons. Metrik ini membantu menilai seberapa baik kinerja sistem di berbagai tugas dan penyiapan perangkat keras. Arsitektur dapat diperluas dengan mengintegrasikan algoritma cerdas untuk memecah pertanyaan besar menjadi pertanyaan lebih kecil dan mengurutkan jawaban yang paling berguna. Peningkatan ini akan memungkinkan penalaran yang lebih akurat dan efisien, mengurangi waktu pembuatan respons, dan meningkatkan kualitas keseluruhan output akhir.

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