AI Agent 的本质是一个能够自主感知环境、进行逻辑推理、做出决策并调用工具完成复杂任务的智能系统。与普通聊天机器人不同,它具备完整的认知-决策-执行闭环能力。现代AI Agent通常由四大核心组件构成:
LLM(大语言模型):作为Agent的"大脑",负责自然语言理解、生成和逻辑推理。在示例中使用的通义千问(qwen-plus)模型,就是典型的商业LLM服务。
记忆系统:
规划模块:控制任务执行流程。示例中通过for循环实现的多轮对话机制,就是最简单的规划逻辑。
工具调用:Agent可以操作的外部函数接口。示例中的计算器和文档搜索工具,展示了两种典型工具类型。
关键设计原则:工具函数必须返回字符串类型,这是为了与LLM的文本处理特性保持兼容。所有工具都应通过@tool装饰器明确标注功能描述,这些描述会直接影响LLM对工具的选择决策。
每个工具函数需要遵循严格的接口规范:
python复制@tool
def tool_name(parameters: type) -> str:
"""
功能描述(LLM主要据此判断是否调用该工具)
参数说明(需包含示例):
param: 参数说明,如"数学表达式,例如'2+2'"
返回说明(需包含示例):
str: 返回描述,如"计算结果字符串'4.0'"
"""
# 实现逻辑
return "结果字符串"
示例中的计算器工具就完整遵循了这个规范:
文档检索工具的关键实现细节:
实际工程建议:生产环境应考虑添加缓存机制,对相同query直接返回缓存结果,避免频繁查询向量库。
示例代码展示了一个经典的多轮控制循环:
python复制for i in range(5): # 安全防护:限制最大迭代次数
response = tool_llm.invoke(message)
if not response.tool_calls:
return response.content
for tool_call in response.tool_calls:
# 执行工具调用
message.append(create_tool_message(tool_call))
示例计算器工具直接使用eval执行用户输入:
python复制eval(expression) # 高危操作!
攻击者可能构造恶意输入:
python复制"__import__('os').system('rm -rf /')" # 系统命令注入
"open('/etc/passwd').read()" # 文件读取
| 方案类型 | 实现方式 | 优点 | 缺点 |
|---|---|---|---|
| 输入过滤 | 正则表达式白名单(仅允许数字和运算符) | 实现简单 | 可能误杀合法数学表达式 |
| AST解析 | 解析语法树检查节点类型 | 安全性高 | 实现复杂度高 |
| 沙箱环境 | 使用PyPy沙箱或docker容器 | 隔离彻底 | 性能开销大 |
| 替代计算 | 使用arithmetic-eval等安全库 | 平衡性好 | 需要引入依赖 |
推荐生产环境采用组合方案:
python复制from arithmetic_parser import safe_eval
def calculator(expr: str) -> str:
if not re.fullmatch(r"^[\d\s+\-*/%.()]+$", expr):
return "错误:包含非法字符"
try:
return str(safe_eval(expr))
except Exception as e:
return f"计算错误: {e}"
LLM调用优化:
工具系统改进:
必备的监控指标:
调试技巧:
python复制# 在工具调用处添加详细日志
logger.debug(f"Tool call - {func_name}({kwargs}) => {result}")
# 记录完整的对话历史
with open("conversation.json", "w") as f:
json.dump([msg.dict() for msg in message], f)
通过组合基础工具可以实现更复杂的业务流程:
不同行业的工具配置建议:
| 行业 | 推荐工具 | 特殊要求 |
|---|---|---|
| 金融 | 行情数据接口、风险计算模型 | 高精度数值处理 |
| 医疗 | 医学文献检索、诊断辅助 | HIPAA合规性 |
| 电商 | 商品推荐、库存查询 | 高并发支持 |
| 教育 | 题库检索、自动批改 | 解释生成能力 |
在实际项目中,我们团队发现工具描述的质量直接影响调用准确率。建议花费至少30%的开发时间完善工具文档字符串,包括: