通过这个最小化的实现,你将掌握:
- 智能代理的核心原理
- ReAct(推理-行动)模式
- 工具调用机制
- LLM集成方法
- 异步编程实践
# 核心概念
Message # 消息类型:用户、助手、工具
Memory # 记忆系统:保存对话历史
AgentState # 代理状态:空闲、运行中、完成关键点:
- Message类设计了完整的对话流
- Memory管理对话历史和上下文
- 状态管理确保执行流程可控
class BaseTool(ABC):
"""所有工具的基类"""
@abstractmethod
async def execute(self, **kwargs) -> ToolResult:
"""统一的执行接口"""
pass学习重点:
- 抽象接口设计:所有工具都有统一的
execute方法 - OpenAI函数格式:
to_function_def()转换为LLM可理解的格式 - 具体实现:Python执行、文件操作、命令行执行
class SimpleLLM:
async def chat(self, messages, system_prompt=None, tools=None):
"""与语言模型交互的核心方法"""核心机制:
- 构建符合OpenAI API的请求格式
- 处理工具调用响应
- 解析结构化输出
这是整个系统的核心,实现了ReAct模式:
async def run(self, user_input: str):
while self.state == AgentState.RUNNING:
# Think: 分析当前状态,选择行动
should_continue = await self.think()
# Act: 执行选定的工具
if should_continue:
await self.act()关键流程:
-
Think阶段:
- 将对话历史发送给LLM
- LLM分析需要执行什么工具
- 返回工具调用指令
-
Act阶段:
- 解析工具调用参数
- 执行具体工具
- 将结果添加到对话历史
# 不同的工具实现不同的策略
PythonExecutor # 代码执行策略
FileEditor # 文件操作策略
BashExecutor # 命令行策略# Memory系统观察并记录所有交互
self.memory.add_message(message)# ToolCollection管理工具实例
self.tools.execute_tool(name, **kwargs)以"在当前目录创建hello.txt文件"为例:
用户: "在当前目录创建一个hello.txt文件,内容是Hello World"
# 代理发送给LLM的消息
messages = [
{"role": "user", "content": "在当前目录创建一个hello.txt文件,内容是Hello World"}
]
# LLM返回工具调用
tool_calls = [{
"id": "call_123",
"type": "function",
"function": {
"name": "file_editor",
"arguments": '{"action": "write", "path": "hello.txt", "content": "Hello World"}'
}
}]# 执行文件编辑工具
result = await tools.execute_tool(
"file_editor",
action="write",
path="hello.txt",
content="Hello World"
)
# 结果: ToolResult(success=True, output="文件已写入: hello.txt")# 将工具执行结果添加到对话历史
memory.add_message(Message.tool_message(
content="文件已写入: hello.txt",
tool_call_id="call_123"
))创建一个计算器工具:
class Calculator(BaseTool):
name = "calculator"
description = "执行数学计算"
parameters = {
"type": "object",
"properties": {
"expression": {"type": "string", "description": "数学表达式"}
},
"required": ["expression"]
}
async def execute(self, expression: str, **kwargs) -> ToolResult:
try:
result = eval(expression) # 生产环境中需要更安全的实现
return ToolResult(success=True, output=str(result))
except Exception as e:
return ToolResult(success=False, error=str(e))math_prompt = """
你是一个数学助手,专门帮助用户解决数学问题。
当用户询问计算相关问题时,使用calculator工具。
对于复杂问题,可以使用python_execute工具编写程序求解。
"""class PersistentMemory(Memory):
def save_to_file(self, filename: str):
"""保存对话历史到文件"""
pass
def load_from_file(self, filename: str):
"""从文件加载对话历史"""
pass- ReAct论文:了解推理-行动模式的理论基础
- OpenAI Function Calling:深入理解工具调用机制
- LangChain Agent:学习更复杂的代理框架
- AutoGen:多代理协作的高级实现
- ReAct是核心:Think(思考)+ Act(行动)的循环
- 工具是能力:通过工具扩展代理的能力边界
- 记忆是智能:上下文管理决定了对话的连贯性
- 抽象是关键:统一的接口让系统易于扩展
- 异步是必须:现代AI应用离不开异步编程
通过这个最小化实现,你已经掌握了构建智能代理的核心技能!