在之前的文章中,我们探讨了文档问答、对话系统、RAG管道和系统监控。今天,我们将深入学习如何使用LlamaIndex构建AI智能体(Agent),特别是采用ReAct(Reasoning and Acting)模式的智能体,让AI能够进行推理并执行具体操作。
1. ReAct模式简介
ReAct是一种结合了推理(Reasoning)和行动(Acting)的AI模式:
- 推理:分析问题并制定解决方案
- 行动:执行具体的操作步骤
- 观察:评估执行结果
- 思考:根据观察结果调整策略
2. 基础环境配置
import os
from dotenv import load_dotenv
from llama_index.core.agent import ReActAgent
from llama_index.llms.openai import OpenAI
from llama_index.core.tools import FunctionTool
load_dotenv()
3. 构建基础工具集
首先,我们需要定义一些基础工具供智能体使用:
# 数学运算工具
def multiply(a: float, b: float) -> float:
"""将两个数相乘并返回结果"""
return a * b
def add(a: float, b: float) -> float:
"""将两个数相加并返回结果"""
return a + b
def subtract(a: float, b: float) -> float:
"""将两个数相减并返回差值"""
return a - b
def divide(a: float, b: float) -> float:
"""将两个数相除并返回商"""
return a / b
# 将函数转换为工具
multiply_tool = FunctionTool.from_defaults(fn=multiply)
add_tool = FunctionTool.from_defaults(fn=add)
subtract_tool = FunctionTool.from_defaults(fn=subtract)
divide_tool = FunctionTool.from_defaults(fn=divide)
4. 创建ReAct智能体
# 初始化语言模型
llm = OpenAI(model="gpt-4", temperature=0)
# 创建ReAct智能体
agent = ReActAgent.from_tools(
tools=[multiply_tool, add_tool, subtract_tool, divide_tool],
llm=llm,
verbose=True
)
5. 实现复杂计算示例
def solve_math_problem():
# 解决复杂数学问题
response = agent.chat(
"What is 20+(2*4)/(5-1)? Use a tool to calculate every step."
)
print(response)
6. 扩展工具集
6.1 文件操作工具
def read_file(file_path: str) -> str:
"""读取文件内容"""
with open(file_path, 'r') as f:
return f.read()
def write_file(file_path: str, content: str) -> bool:
"""写入文件内容"""
try:
with open(file_path, 'w') as f:
f.write(content)
return True
except Exception as e:
return False
# 转换为工具
file_tools = [
FunctionTool.from_defaults(fn=read_file),
FunctionTool.from_defaults(fn=write_file)
]
6.2 网络请求工具
import requests
def fetch_web_content(url: str) -> str:
"""获取网页内容"""
try:
response = requests.get(url)
return response.text
except Exception as e:
return str(e)
web_tool = FunctionTool.from_defaults(fn=fetch_web_content)
7. 高级智能体配置
7.1 自定义推理链
from llama_index.core.agent import ReActChatFormatter
# 自定义推理格式化器
custom_formatter = ReActChatFormatter(
system_header="你是一个专业的助手,擅长解决复杂问题。",
system_footer="记住要逐步思考并使用工具。"
)
# 创建带有自定义推理的智能体
advanced_agent = ReActAgent.from_tools(
tools=[multiply_tool, add_tool, subtract_tool, divide_tool],
llm=llm,
chat_formatter=custom_formatter,
verbose=True
)
7.2 错误处理
def safe_agent_call(agent, query):
try:
response = agent.chat(query)
return response
except Exception as e:
print(f"执行出错: {str(e)}")
return None
总结
通过本文,我们学习了:
- ReAct模式的基本原理
- 如何构建基础工具集
- 创建和配置ReAct智能体
在下一篇文章中,我们将探讨如何使用LlamaParse处理复杂的PDF文档,进一步提升文档处理能力。