在 LlamaIndex 中使用智能体

还记得我们之前那位得力的管家智能体 Alfred 吗?现在他要迎来重大升级了!在了解了 LlamaIndex 中的工具后,我们可以赋予 Alfred 新的能力来更好地服务我们。

不过在继续之前,让我们先回顾一下智能体(如 Alfred)的核心机制。在第一单元中我们学习到:

智能体是一个利用 AI 模型与环境交互以实现用户定义目标的系统。它通过结合推理、规划和动作执行(通常通过外部工具)来完成各种任务。

LlamaIndex 支持三种主要类型的推理智能体:

  1. 函数调用智能体 - 适用于支持调用特定函数的 AI 模型
  2. ReAct 智能体 - 适用于具有聊天或文本完成能力的 AI 模型,擅长处理复杂推理任务
  3. 高级自定义智能体 - 使用更复杂的方法处理高阶任务和工作流

提示:有关高级智能体的更多信息,请访问 BaseWorkflowAgent。

初始化智能体

提示:您可以通过 这个 Notebook 跟随代码实践(使用 Google Colab 运行)。

创建智能体时,我们首先需要为其提供定义其能力的功能/工具集合。让我们看看如何使用基础工具创建智能体。当前实现中,智能体会自动使用函数调用 API(如果可用),或标准的 ReAct 智能体循环。

支持工具/函数 API 的 LLM 是相对较新的技术,它们通过避免特定提示工程、允许 LLM 根据提供的模式创建工具调用,提供了强大的工具调用能力。

ReAct 智能体同样擅长复杂推理任务,可与任何具备聊天或文本完成能力的 LLM 配合使用。这类智能体的响应更详细,会展示其决策背后的推理过程。

from llama_index.llms.huggingface_api import HuggingFaceInferenceAPI
from llama_index.core.agent.workflow import AgentWorkflow
from llama_index.core.tools import FunctionTool

# 定义示例工具--类型注释、函数名和 docstrings 都包含在解析的模式中!
def multiply(a: int, b: int) -> int:
    """Multiplies two integers and returns the resulting integer"""
    return a * b

# 初始化 llm
llm = HuggingFaceInferenceAPI(model_name="Qwen/Qwen2.5-Coder-32B-Instruct")

# 初始化 agent
agent = AgentWorkflow.from_tools_or_functions(
    [FunctionTool.from_defaults(multiply)],
    llm=llm
)

智能体默认是无状态的,如需记忆过往交互,需显式使用 Context 对象。这在需要记忆历史交互的场景中非常有用,例如:需要跨消息保持上下文的聊天机器人,或需要追踪长期任务进度的任务管理器。

# stateless
response = await agent.run("What is 2 times 2?")

# remembering state
from llama_index.core.workflow import Context

ctx = Context(agent)

response = await agent.run("My name is Bob.", ctx=ctx)
response = await agent.run("What was my name again?", ctx=ctx)

您会注意到 LlamaIndex 中的智能体采用异步模式(使用 Python 的 await 操作符)。如果您是 Python 异步编程的新手,或需要复习相关知识,请参考 官方异步编程指南。

现在我们已经掌握基础知识,接下来让我们探索如何为智能体赋予更复杂的工具能力。

使用 QueryEngineTools 创建 RAG 智能体

智能体增强检索(Agentic RAG) 是通过智能体实现数据问答的强大范式。我们可以为 Alfred 配备多种工具来辅助问题解答。但不同于传统 RAG 直接基于文档回答问题,Alfred 能够自主决定是否使用其他工具或流程来响应查询。

将 QueryEngine 封装为智能体工具非常简单。在此过程中,我们需要定义工具名称和描述,这些元数据将帮助 LLM 正确选择和使用工具。以下示例演示如何基于组件章节创建的 QueryEngine 加载 QueryEngineTool:

from llama_index.core.tools import QueryEngineTool

query_engine = index.as_query_engine(llm=llm, similarity_top_k=3) # as shown in the previous section

query_engine_tool = QueryEngineTool.from_defaults(
    query_engine=query_engine,
    name="name",
    description="a specific description",
    return_direct=False,
)

query_engine_agent = AgentWorkflow.from_tools_or_functions(
    [query_engine_tool],
    llm=llm,
    system_prompt="You are a helpful assistant that has access to a database containing persona descriptions. "
)

创建多智能体系统

AgentWorkflow 类原生支持多智能体系统。通过为每个智能体分配名称和描述,系统可维护单一活跃会话主体,同时允许智能体之间进行任务交接。

通过精准定义每个智能体的职责边界,我们能够有效提升系统响应消息时的整体准确性。

LlamaIndex 中的智能体也可直接作为其他智能体的工具,这种设计支持构建复杂的定制化场景:

from llama_index.core.agent.workflow import (
    AgentWorkflow,
    FunctionAgent,
    ReActAgent,
)

# Define some tools
def add(a: int, b: int) -> int:
    """Add two numbers."""
    return a + b


def subtract(a: int, b: int) -> int:
    """Subtract two numbers."""
    return a - b


# 创建智能体配置
# 注意:我们可以在此使用 FunctionAgent 或 ReActAgent。
# FunctionAgent 适用于具有函数调用 API 的 LLM。
# ReActAgent 适用于任何 LLM。
calculator_agent = ReActAgent(
    name="calculator",
    description="Performs basic arithmetic operations",
    system_prompt="You are a calculator assistant. Use your tools for any math operation.",
    tools=[add, subtract],
    llm=llm,
)

query_agent = ReActAgent(
    name="info_lookup",
    description="Looks up information about XYZ",
    system_prompt="Use your tool to query a RAG system to answer information about XYZ",
    tools=[query_engine_tool],
    llm=llm
)

# 创建并运行工作流程
agent = AgentWorkflow(
    agents=[calculator_agent, query_agent], root_agent="calculator"
)

# 运行系统
response = await agent.run(user_msg="Can you add 5 and 3?")

提示:还没学够吗?在 《AgentWorkflow 基本介绍》 或 《Agent 学习指南》 中,您可以了解到更多关于流媒体、上下文序列化和人在环路中的信息!

现在我们已经掌握了 LlamaIndex 中智能体和工具的基础知识,接下来让我们探索如何利用 LlamaIndex 来创建可配置、易管理的工作流!

小结

  • LlamaIndex 支持三类推理智能体:函数调用智能体、ReAct 智能体、高级自定义智能体。
  • 创建智能体需先提供工具集合;可用函数调用 API 或标准 ReAct 循环。
  • 智能体默认无状态,需显式使用 Context 对象来记忆历史交互。
  • 用 QueryEngineTool 可将检索器封装为工具,实现 Agentic RAG。
  • AgentWorkflow 原生支持多智能体系统,且一个智能体可直接作为另一个智能体的工具。

参考与延伸阅读