Agen Riset dengan Gemini 2.5 Pro dan LlamaIndex

LlamaIndex adalah framework untuk membangun agen pengetahuan menggunakan LLM yang terhubung ke data Anda. Contoh ini menunjukkan cara membuat alur kerja multi-agen untuk Agen Riset. Di LlamaIndex, Workflows adalah komponen penyusun sistem agen atau multi-agen.

Anda memerlukan kunci Gemini API. Jika Anda belum memilikinya, Anda dapat mendapatkannya di Google AI Studio. Pertama, instal semua library LlamaIndex yang diperlukan.LlamaIndex menggunakan paket google-genai di balik layar.

pip install llama-index llama-index-utils-workflow llama-index-llms-google-genai llama-index-tools-google

Menyiapkan Gemini 2.5 Pro di LlamaIndex

Mesin agen LlamaIndex adalah LLM yang menangani penalaran dan pemrosesan teks. Contoh ini menggunakan Gemini 2.5 Pro. Pastikan Anda menetapkan kunci API sebagai variabel lingkungan.

from llama_index.llms.google_genai import GoogleGenAI

llm = GoogleGenAI(model="gemini-2.5-pro")

Alat pembuat

Agen menggunakan alat untuk berinteraksi dengan dunia luar, seperti menelusuri web atau menyimpan informasi. Alat di LlamaIndex dapat berupa fungsi Python biasa, atau diimpor dari ToolSpecs yang sudah ada. Gemini dilengkapi dengan alat bawaan untuk menggunakan Google Penelusuran yang digunakan di sini.

from google.genai import types

google_search_tool = types.Tool(
    google_search=types.GoogleSearch()
)

llm_with_search = GoogleGenAI(
    model="gemini-2.5-pro",
    generation_config=types.GenerateContentConfig(tools=[google_search_tool])
)

Sekarang uji instance LLM dengan kueri yang memerlukan penelusuran:

response = llm_with_search.complete("What's the weather like today in Biarritz?")
print(response)

Agen Riset akan menggunakan fungsi Python sebagai alat. Ada banyak cara yang dapat Anda lakukan untuk membangun sistem yang dapat melakukan tugas ini. Dalam contoh ini, Anda akan menggunakan hal berikut:

  1. search_web menggunakan Gemini dengan Google Penelusuran untuk menelusuri web guna mendapatkan informasi tentang topik yang diberikan.
  2. record_notes menyimpan riset yang ditemukan di web ke status sehingga alat lain dapat menggunakannya.
  3. write_report menulis laporan menggunakan informasi yang ditemukan oleh ResearchAgent
  4. review_report meninjau laporan dan memberikan masukan.

Class Context meneruskan status antar-agen/alat, dan setiap agen akan memiliki akses ke status sistem saat ini.

from llama_index.core.workflow import Context

async def search_web(ctx: Context, query: str) -> str:
    """Useful for searching the web about a specific query or topic"""
    response = await llm_with_search.acomplete(f"""Please research given this query or topic,
    and return the result\n<query_or_topic>{query}</query_or_topic>""")
    return response

async def record_notes(ctx: Context, notes: str, notes_title: str) -> str:
    """Useful for recording notes on a given topic."""
    current_state = await ctx.store.get("state")
    if "research_notes" not in current_state:
        current_state["research_notes"] = {}
    current_state["research_notes"][notes_title] = notes
    await ctx.store.set("state", current_state)
    return "Notes recorded."

async def write_report(ctx: Context, report_content: str) -> str:
    """Useful for writing a report on a given topic."""
    current_state = await ctx.store.get("state")
    current_state["report_content"] = report_content
    await ctx.store.set("state", current_state)
    return "Report written."

async def review_report(ctx: Context, review: str) -> str:
    """Useful for reviewing a report and providing feedback."""
    current_state = await ctx.store.get("state")
    current_state["review"] = review
    await ctx.store.set("state", current_state)
    return "Report reviewed."

Membangun asisten multi-agen

Untuk membangun sistem multi-agen, Anda menentukan agen dan interaksinya. Sistem Anda akan memiliki tiga agen:

  1. ResearchAgent menelusuri web untuk mencari informasi tentang topik yang diberikan.
  2. WriteAgent menulis laporan menggunakan informasi yang ditemukan oleh ResearchAgent.
  3. ReviewAgent meninjau laporan dan memberikan masukan.

Contoh ini menggunakan class AgentWorkflow untuk membuat sistem multi-agen yang akan mengeksekusi agen ini secara berurutan. Setiap agen mengambil system_prompt yang memberi tahu apa yang harus dilakukan, dan menyarankan cara bekerja dengan agen lain.

Secara opsional, Anda dapat membantu sistem multi-agen dengan menentukan agen lain yang dapat diajak berkomunikasi menggunakan can_handoff_to (jika tidak, sistem akan mencoba mencari tahu sendiri).

from llama_index.core.agent.workflow import (
    AgentInput,
    AgentOutput,
    ToolCall,
    ToolCallResult,
    AgentStream,
)
from llama_index.core.agent.workflow import FunctionAgent, ReActAgent

research_agent = FunctionAgent(
    name="ResearchAgent",
    description="Useful for searching the web for information on a given topic and recording notes on the topic.",
    system_prompt=(
        "You are the ResearchAgent that can search the web for information on a given topic and record notes on the topic. "
        "Once notes are recorded and you are satisfied, you should hand off control to the WriteAgent to write a report on the topic."
    ),
    llm=llm,
    tools=[search_web, record_notes],
    can_handoff_to=["WriteAgent"],
)

write_agent = FunctionAgent(
    name="WriteAgent",
    description="Useful for writing a report on a given topic.",
    system_prompt=(
        "You are the WriteAgent that can write a report on a given topic. "
        "Your report should be in a markdown format. The content should be grounded in the research notes. "
        "Once the report is written, you should get feedback at least once from the ReviewAgent."
    ),
    llm=llm,
    tools=[write_report],
    can_handoff_to=["ReviewAgent", "ResearchAgent"],
)

review_agent = FunctionAgent(
    name="ReviewAgent",
    description="Useful for reviewing a report and providing feedback.",
    system_prompt=(
        "You are the ReviewAgent that can review a report and provide feedback. "
        "Your feedback should either approve the current report or request changes for the WriteAgent to implement."
    ),
    llm=llm,
    tools=[review_report],
    can_handoff_to=["ResearchAgent","WriteAgent"],
)

Agen telah ditentukan, sekarang Anda dapat membuat AgentWorkflow dan menjalankannya.

from llama_index.core.agent.workflow import AgentWorkflow

agent_workflow = AgentWorkflow(
    agents=[research_agent, write_agent, review_agent],
    root_agent=research_agent.name,
    initial_state={
        "research_notes": {},
        "report_content": "Not written yet.",
        "review": "Review required.",
    },
)

Selama eksekusi alur kerja, Anda dapat melakukan streaming peristiwa, panggilan alat, dan update ke konsol.

from llama_index.core.agent.workflow import (
    AgentInput,
    AgentOutput,
    ToolCall,
    ToolCallResult,
    AgentStream,
)

research_topic = """Write me a report on the history of the web.
Briefly describe the history of the world wide web, including
the development of the internet and the development of the web,
including 21st century developments"""

handler = agent_workflow.run(
    user_msg=research_topic
)

current_agent = None
current_tool_calls = ""
async for event in handler.stream_events():
    if (
        hasattr(event, "current_agent_name")
        and event.current_agent_name != current_agent
    ):
        current_agent = event.current_agent_name
        print(f"\n{'='*50}")
        print(f"🤖 Agent: {current_agent}")
        print(f"{'='*50}\n")
    elif isinstance(event, AgentOutput):
        if event.response.content:
            print("📤 Output:", event.response.content)
        if event.tool_calls:
            print(
                "🛠️  Planning to use tools:",
                [call.tool_name for call in event.tool_calls],
            )
    elif isinstance(event, ToolCallResult):
        print(f"🔧 Tool Result ({event.tool_name}):")
        print(f"  Arguments: {event.tool_kwargs}")
        print(f"  Output: {event.tool_output}")
    elif isinstance(event, ToolCall):
        print(f"🔨 Calling Tool: {event.tool_name}")
        print(f"  With arguments: {event.tool_kwargs}")

Setelah alur kerja selesai, Anda dapat mencetak output akhir laporan, serta status peninjauan akhir dari agen peninjau.

state = await handler.ctx.store.get("state")
print("Report Content:\n", state["report_content"])
print("\n------------\nFinal Review:\n", state["review"])

Lakukan lebih banyak hal dengan alur kerja kustom

AgentWorkflow adalah cara yang bagus untuk mulai menggunakan sistem multi-agen. Namun, bagaimana jika Anda memerlukan kontrol yang lebih besar? Anda dapat membuat alur kerja dari awal. Berikut beberapa alasan mengapa Anda mungkin ingin membuat alur kerja sendiri:

  • Kontrol yang lebih besar atas prosesnya: Anda dapat menentukan jalur persis yang akan dilalui agen Anda. Hal ini mencakup pembuatan loop, pengambilan keputusan pada titik tertentu, atau membuat agen bekerja secara paralel pada tugas yang berbeda.
  • Gunakan data kompleks: Jangan hanya menggunakan teks sederhana. Alur kerja kustom memungkinkan Anda menggunakan data yang lebih terstruktur, seperti objek JSON atau class kustom, untuk input dan output.
  • Bekerja dengan berbagai media: Bangun agen yang dapat memahami dan memproses tidak hanya teks, tetapi juga gambar, audio, dan video.
  • Perencanaan yang lebih cerdas: Anda dapat mendesain alur kerja yang pertama-tama membuat rencana terperinci sebelum agen mulai bekerja. Hal ini berguna untuk tugas kompleks yang memerlukan beberapa langkah.
  • Aktifkan koreksi mandiri: Buat agen yang dapat meninjau pekerjaannya sendiri. Jika output tidak cukup baik, agen dapat mencoba lagi, membuat loop peningkatan hingga hasilnya sempurna.

Untuk mempelajari lebih lanjut LlamaIndex Workflows, lihat Dokumentasi LlamaIndex Workflows.