大家好,我是小董哥。
很多人使用大模型时,主要还是输入问题、等待回答。
但当任务涉及实时搜索、数学计算、文件读取或数据库查询时,仅靠大模型自身并不够。它还需要调用外部工具。这就是Agent最基本的工作方式:
接收任务 → 判断下一步 → 调用工具 → 获取结果 → 继续处理 → 输出答案
今天我们不用复杂框架,直接用Python实现一个可以搜索网页、完成计算的简单Agent。
一、先了解一下Agent的基本组成
一个简单Agent主要包括四部分:
模型:理解任务,决定是否调用工具;
记忆:用来保存用户问题、模型的工具调用以及工具返回的结果。
工具:负责搜索、计算或查询数据;
控制循环:把工具结果返回给模型,直到任务完成。
它的核心并不是像人一样思考,而是能够根据任务选择合适的工具,并连续完成多个步骤。
二、准备环境
假设你已经有自己的Python开发环境,我这里使用的是3.10版本。
首先,安装OpenAI Python SDK:
然后,配置API Key。API Key可以理解为程序调用大模型的身份凭证。我这里使用的是Open AI的,只需登录OpenAI API平台,在API Keys页面创建一个新的密钥。
密钥通常只会完整显示一次,创建后要及时保存。不建议把它直接写进代码,更不能上传到GitHub、网盘或发给其他人。更稳妥的做法是把它保存为系统环境变量,Python程序运行时再自动读取。
Windows平台下使用Windows PowerShell进行临时配置,只在当前PowerShell窗口中有效:
$env:OPENAI_API_KEY="你的API Key"
例如:
$env:OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxx"
关闭这个PowerShell窗口后,环境变量会失效。需要长期保存,可以执行:
setx OPENAI_API_KEY "你的API Key"
执行完成后,要重新打开PowerShell或代码编辑器,新的环境变量才会生效。
可以用下面的命令检查是否配置成功:
macOS或Linux进行临时配置:
export OPENAI_API_KEY="你的API Key"
检查是否配置成功:
配置完成后,Python可以通过环境变量读取密钥:
import osfrom openai import OpenAIapi_key = os.getenv("OPENAI_API_KEY")if not api_key: raise RuntimeError("未找到 OPENAI_API_KEY,请先配置环境变量")client = OpenAI(api_key=api_key)
如果运行时提示Incorrect API key,先检查密钥是否复制完整、前后是否带有空格,以及环境变量是否已经在当前终端中生效。
三、完整代码
下面的Agent包含两个工具:
import astimport jsonimport operatorimport osfrom openai import OpenAIclient = OpenAI( api_key=os.getenv("OPENAI_API_KEY"))MODEL = "xxxx"# 允许使用的数学运算OPERATORS = { ast.Add: operator.add, ast.Sub: operator.sub, ast.Mult: operator.mul, ast.Div: operator.truediv,}def calculate(expression: str) -> str: """安全计算简单数学表达式。""" tree = ast.parse(expression, mode="eval") def evaluate(node): if isinstance(node, ast.Constant): return node.value if isinstance(node, ast.BinOp): left = evaluate(node.left) right = evaluate(node.right) operation = OPERATORS.get(type(node.op)) if operation is None: raise ValueError("不支持该运算") return operation(left, right) raise ValueError("表达式格式错误") return str(evaluate(tree.body))TOOLS = [ { "type": "web_search" }, { "type": "function", "name": "calculate", "description": "计算简单数学表达式", "strict": True, "parameters": { "type": "object", "properties": { "expression": { "type": "string", "description": "例如:18 - 11" } }, "required": ["expression"], "additionalProperties": False } }]INSTRUCTIONS = """你是一个可以调用工具完成任务的AI助手。遇到实时信息时使用网页搜索;遇到数学计算时使用计算器;不要编造工具结果;完成任务后直接给出答案。"""def run_agent(question: str, max_rounds: int = 5): inputs = [ { "role": "user", "content": question } ] for _ in range(max_rounds): response = client.responses.create( model=MODEL, instructions=INSTRUCTIONS, input=inputs, tools=TOOLS ) inputs.extend(response.output) function_calls = [ item for item in response.output if item.type == "function_call" ] if not function_calls: return response.output_text for call in function_calls: arguments = json.loads(call.arguments) if call.name == "calculate": result = calculate( arguments["expression"] ) else: result = "未知工具" inputs.append({ "type": "function_call_output", "call_id": call.call_id, "output": result }) return "任务执行轮数过多,已停止。"question = ( "查询今天北京的最高气温和最低气温," "并计算两者的温差。")print(run_agent(question))
四、代码运行流程
当用户提出问题后,模型首先判断是否需要工具。以查询天气为例:
模型发现问题包含“今天”,先调用网页搜索;
从搜索结果中提取最高温和最低温;
调用计算器计算温差;
整理结果并返回给用户。
整个过程可能调用一次工具,也可能连续调用多个工具。
五、这个示例还能怎么扩展?
理解这个基本循环后,还可以继续加入:
文件读取;
数据库查询;
邮件发送;
知识库检索;
代码执行;
企业内部接口。
不过,涉及发送邮件、修改数据或删除文件时,最好增加人工确认,避免Agent直接执行高风险操作。
结语
Agent并不神秘。它的核心就是:模型负责判断,工具负责执行,程序负责控制流程。
先从一个模型、两三个工具开始,就能搭建出一个真正可以完成任务的简单Agent。