原文出处:Hugging Face Agents Course · units/zh-CN/unit2/llama-index/agents.mdx 原作者:Hugging Face · 许可证:Apache-2.0 License 本篇为课程官方中文译文(Hugging Face 社区翻译),诸葛AI学院仅做格式整理(去除图片与交互组件),版权归原作者所有。
在 LlamaIndex 中使用智能体
还记得我们之前那位得力的管家智能体 Alfred 吗?现在他要迎来重大升级了! 在了解了 LlamaIndex 中的工具后,我们可以赋予 Alfred 新的能力来更好地服务我们。
不过在继续之前,让我们先回顾一下智能体(如 Alfred)的核心机制。 在第一单元中我们学习到:
智能体是一个利用 AI 模型与环境交互以实现用户定义目标的系统。它通过结合推理、规划和动作执行(通常通过外部工具)来完成各种任务。
LlamaIndex 支持三种主要类型的推理智能体:
函数调用智能体- 适用于支持调用特定函数的 AI 模型ReAct 智能体- 适用于具有聊天或文本完成能力的 AI 模型,擅长处理复杂推理任务高级自定义智能体- 使用更复杂的方法处理高阶任务和工作流
有关高级智能体的更多信息,请访问 BaseWorkflowAgent
初始化智能体
您可以通过 这个 Notebook 跟随代码实践(使用 Google Colab 运行)。
创建智能体时,我们首先需要为其提供定义其能力的功能/工具集合。 让我们看看如何使用基础工具创建智能体。当前实现中,智能体会自动使用函数调用 API(如果可用),或标准的 ReAct 智能体循环。
支持工具/函数 API 的 LLM 是相对较新的技术,它们通过避免特定提示工程、允许 LLM 根据提供的模式创建工具调用,提供了强大的工具调用能力。
ReAct 智能体同样擅长复杂推理任务,可与任何具备聊天或文本完成能力的 LLM 配合使用。这类智能体的响应更详细,会展示其决策背后的推理过程。
```python 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 对象。
这在需要记忆历史交互的场景中非常有用,例如:需要跨消息保持上下文的聊天机器人,或需要追踪长期任务进度的任务管理器。
```python
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:
```python 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 中的智能体也可直接作为其他智能体的工具,这种设计支持构建复杂的定制化场景:
```python 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 来创建可配置、易管理的工作流!