Skip to content

智能体#

在LlamaIndex中,我们将"智能体"定义为一种特定系统,它利用大语言模型(LLM)、记忆模块和工具集来处理外部用户的输入。这与"智能体化"(agentic)概念不同,后者泛指所有包含LLM决策过程的系统大类。

在LlamaIndex中创建智能体仅需几行代码:

import asyncio
from llama_index.core.agent.workflow import FunctionAgent
from llama_index.llms.openai import OpenAI


# 定义简单计算器工具
def multiply(a: float, b: float) -> float:
    """Useful for multiplying two numbers."""
    return a * b


# 使用计算器工具创建智能体工作流
agent = FunctionAgent(
    tools=[multiply],
    llm=OpenAI(model="gpt-4o-mini"),
    system_prompt="You are a helpful assistant that can multiply two numbers.",
)


async def main():
    # 运行智能体
    response = await agent.run("What is 1234 * 4567?")
    print(str(response))


# 运行智能体
if __name__ == "__main__":
    asyncio.run(main())

调用该智能体会触发特定动作循环:

  • 智能体获取最新消息和聊天历史记录
  • 工具模式和聊天历史通过API发送
  • 智能体直接响应或返回工具调用列表
    • 执行每个工具调用
    • 工具调用结果加入聊天历史
    • 智能体根据更新后的历史再次被调用,选择直接响应或继续调用工具

FunctionAgent是一种利用LLM提供商的函数/工具调用能力来执行工具的智能体。其他类型智能体如ReActAgentCodeActAgent则使用不同的提示策略来执行工具。

工具集#

工具可以简单定义为Python函数,或通过FunctionToolQueryEngineTool等类进一步定制。LlamaIndex还通过Tool Specs为常见API提供预定义工具集。

更多工具配置信息请参阅工具指南

记忆模块#

记忆是构建智能体的核心组件。默认情况下,所有LlamaIndex智能体都使用ChatMemoryBuffer作为记忆模块。

如需自定义,可先声明再传入智能体:

from llama_index.core.memory import ChatMemoryBuffer

memory = ChatMemoryBuffer.from_defaults(token_limit=40000)

response = await agent.run(..., memory=memory)

更多记忆配置信息请参阅记忆指南

多模态智能体#

部分LLM支持多模态输入(如图像和文本)。通过内容块形式的聊天消息,我们可以向智能体传递图像进行推理。

例如,假设您有此演示文稿中某张幻灯片的截图。

您可以将图像传递给智能体进行推理,观察其读取图像并作出相应反应:

from llama_index.core.agent.workflow import FunctionAgent
from llama_index.core.llms import ChatMessage, ImageBlock, TextBlock
from llama_index.llms.openai import OpenAI

llm = OpenAI(model="gpt-4o-mini", api_key="sk-...")


def add(a: int, b: int) -> int:
    """Useful for adding two numbers together."""
    return a + b


workflow = FunctionAgent(
    tools=[add],
    llm=llm,
)

msg = ChatMessage(
    role="user",
    blocks=[
        TextBlock(text="Follow what the image says."),
        ImageBlock(path="./screenshot.png"),
    ],
)

response = await workflow.run(msg)
print(str(response))

多智能体系统#

您可以将多个智能体组合成多智能体系统,各智能体在完成任务过程中能够相互协调控制权转移:

from llama_index.core.agent.workflow import AgentWorkflow

multi_agent = AgentWorkflow(agents=[FunctionAgent(...), FunctionAgent(...)])

resp = await agent.run("query")

这只是构建多智能体系统的一种方式。了解更多请阅读多智能体系统

手动构建智能体#

虽然FunctionAgentReActAgentCodeActAgentAgentWorkflow等智能体类抽象了大量细节,但有时需要构建更底层的自定义智能体。

直接使用LLM对象,您可以快速实现基础智能体循环,同时完全掌控工具调用和错误处理机制:

from llama_index.core.llms import ChatMessage
from llama_index.core.tools import FunctionTool
from llama_index.llms.openai import OpenAI


def select_song(song_name: str) -> str:
    """Useful for selecting a song."""
    return f"Song selected: {song_name}"


tools = [FunctionTool.from_defaults(select_song)]
tools_by_name = {t.metadata.name: t for t in [tool]}

# 使用初始工具和聊天历史调用LLM
chat_history = [ChatMessage(role="user", content="Pick a random song for me")]
resp = llm.chat_with_tools([tool], chat_history=chat_history)

# 从响应解析工具调用
tool_calls = llm.get_tool_calls_from_response(
    resp, error_on_no_tool_call=False
)

# 当存在待调用工具时循环执行
while tool_calls:
    # 将LLM响应加入聊天历史
    chat_history.append(resp.message)

    # 调用每个工具并将结果加入聊天历史
    for tool_call in tool_calls:
        tool_name = tool_call.tool_name
        tool_kwargs = tool_call.tool_kwargs

        print(f"Calling {tool_name} with {tool_kwargs}")
        tool_output = tool(**tool_kwargs)
        chat_history.append(
            ChatMessage(
                role="tool",
                content=str(tool_output),
                # 多数LLM(如OpenAI)需要知道工具调用ID
                additional_kwargs={"tool_call_id": tool_call.tool_id},
            )
        )

        # 检查LLM能否生成最终响应或调用更多工具
        resp = llm.chat_with_tools([tool], chat_history=chat_history)
        tool_calls = llm.get_tool_calls_from_response(
            resp, error_on_no_tool_call=False
        )

# 打印最终响应
print(resp.message.content)

示例/模块指南#

更完整的示例列表和模块指南请参见模块指南页