方案一:原生手写简易agent(无langchain,理解think‑act‑observe)
原理:大模型输出要做什么动作 → 程序执行工具 → 把工具返回结果丢回大模型,循环直到输出最终答案。
依赖:只需要 openai 库,兼容 ollama / 通义 / deepseek 等openai兼容接口。
安装
pip install openai python-dotenv
.env文件
api_key=sk-xxx base_url=https://api.deepseek.com/v1 model_name=deepseek-chat
示例代码
import os
from dotenv import load_dotenv
from openai import openai
import time
import math
load_dotenv()
client = openai(api_key=os.getenv("api_key"), base_url=os.getenv("base_url"))
model = os.getenv("model_name")
# ---------------------- 1、定义可用工具 ----------------------
def calculator(expr: str) -> str:
"""数学计算工具,输入数学表达式,例如 '2500 * 1.08' """
try:
return str(eval(expr, {"__builtins__": none}, {"math": math}))
except exception as e:
return f"计算错误:{str(e)}"
def get_current_time() -> str:
"""获取当前时间"""
return time.strftime("%y‑%m‑%d %h:%m:%s")
# 工具注册表
tools = {
"calculator": calculator,
"get_current_time": get_current_time
}
# system提示词:告诉模型可用工具,输出格式要求
system_prompt = """
你是ai agent。你可以使用工具完成任务。
可用工具:
1. calculator(expr): 数学计算
2. get_current_time(): 获取当前时间
输出规则:
- 需要调用工具时严格输出格式:
action:工具名|参数
示例:action:calculator|1250*1.15
- 不需要工具,直接输出最终答案:answer:你的最终回答
"""
def run_agent(user_query: str, max_loop=5):
messages = [
{"role":"system", "content": system_prompt},
{"role":"user", "content": user_query}
]
for _ in range(max_loop):
resp = client.chat.completions.create(model=model, messages=messages, temperature=0)
reply = resp.choices[0].message.content.strip()
print(f"\n【模型输出】{reply}")
if reply.startswith("answer:"):
return reply.replace("answer:", "").strip()
if reply.startswith("action:"):
# 解析动作
parts = reply.replace("action:", "").split("|", 1)
tool_name, tool_arg = parts[0].strip(), parts[1].strip()
print(f"【调用工具】{tool_name} 参数:{tool_arg}")
func = tools[tool_name]
tool_result = func(tool_arg) if tool_arg else func()
print(f"【工具返回】{tool_result}")
# 将工具观察结果放回对话,继续循环
messages.append({"role":"assistant", "content": reply})
messages.append({"role":"user", "content": f"observation:{tool_result}"})
return "达到最大循环次数,任务终止"
# 测试
if __name__ == "__main__":
res = run_agent("现在时间是多少?365乘以47等于多少?")
print("\n✅最终结果:", res)
运行流程演示:
- 用户提问:现在时间是多少?365乘以47等于多少?
- 模型输出:
action:get_current_time| - 代码执行工具拿到时间,把
observation:xxxx塞回对话 - 模型下一步输出:
action:calculator|365*47 - 拿到计算结果,模型输出
answer:xxx,任务结束
这就是agent最核心:思考 → 执行工具 → 观察结果 → 继续思考。
方案二:langchain快速搭建agent(项目常用)
封装好工具解析、循环逻辑,还可以结合rag知识库。
安装依赖
pip install langchain langchain-openai python-dotenv
示例代码
import os
from dotenv import load_dotenv
from langchain_openai import chatopenai
from langchain_core.tools import tool
from langchain.agents import create_openai_tools_agent, agentexecutor
from langchain_core.prompts import chatprompttemplate
load_dotenv()
llm = chatopenai(
model=os.getenv("model_name"),
api_key=os.getenv("api_key"),
base_url=os.getenv("base_url"),
temperature=0
)
# 定义工具
@tool
def calculator_tool(expression: str) -> str:
"""用于数学运算,输入数学表达式字符串"""
return str(eval(expression))
@tool
def time_tool() -> str:
"""获取当前系统时间"""
import time
return time.strftime("%y‑%m‑%d %h:%m:%s")
tools = [calculator_tool, time_tool]
prompt = chatprompttemplate.from_messages([
("system", "你是ai智能助手,合理调用工具完成用户任务。"),
("user", "{input}"),
("agent_scratchpad", "{agent_scratchpad}")
])
agent = create_openai_tools_agent(llm, tools, prompt)
agent_executor = agentexecutor(agent=agent, tools=tools, verbose=true)
if __name__ == "__main__":
output = agent_executor.invoke({"input":"现在几点,1245除以7等于多少"})
print("输出:", output["output"])
到此这篇关于python实现简单ai agent的两种方法详解的文章就介绍到这了,更多相关python实现ai agent内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论