结合代码详细讲解大模型agent思路
一、核心思路:让大模型具备 “调用工具解决问题” 的能力
传统大模型存在两个局限:(1)知识截止(无法获取实时信息);(2)缺乏实际操作能力(如计算、查询)。Agent 通过引入 “工具” 和 “工作流”,让大模型突破这两个局限 ——大模型负责 “判断该做什么、怎么调用工具”,工具负责 “实际做事”,工作流负责 “把两者串联起来”。
对应到代码中,就是三个核心模块的协作:
# 核心协作关系
Agent(llm=大模型, tools=[工具1, 工具2]) # Agent协调大模型和工具
二、分模块拆解思路
1. 工具(Tools):给大模型 “装手脚”
思路:把具体功能(如查天气、算数学题)封装成工具,让大模型知道 “有什么可用” 以及 “怎么用”。
每个工具必须明确:名称
(供大模型调用)、描述
(告诉大模型该工具的用途)、函数
(实际执行逻辑)。
代码实现:
class Tool:def __init__(self, name: str, description: str, function):self.name = name # 工具名称(如"get_weather")self.description = description # 功能描述(供大模型判断是否调用)self.function = function # 实际执行的函数# 示例:天气查询工具
weather_tool = Tool(name="get_weather",description="查询指定城市的天气,需要参数:city(城市名)", # 关键:让大模型知道何时用、传什么参数function=get_weather # 具体实现(调用天气API或模拟数据)
)
为什么要这么设计?
大模型无法直接执行代码或调用 API,必须通过人类预先定义的工具接口,才能将 “决策” 转化为 “行动”。工具的description
是关键 —— 大模型通过阅读描述,判断是否需要调用该工具。
2. 大模型(LLM):Agent 的 “大脑”
思路:让大模型基于用户问题和工具描述,决定 “是否调用工具”“调用哪个工具”“传什么参数”。
核心是通过结构化提示词引导大模型输出可解析的指令(如 JSON 格式),避免输出自然语言导致程序无法处理。
代码实现:
class SimpleLLM:def generate(self, prompt: str) -> str:# 实际中这里会调用真实大模型API(如GPT-3.5/4)# 示例:模拟大模型根据提示词判断,返回工具调用指令if "天气" in prompt:return '{"action": "get_weather", "parameters": {"city": "北京"}}' # 调用天气工具elif "计算" in prompt:return '{"action": "calculate", "parameters": {"expression": "2+2"}}' # 调用计算工具
关键设计:提示词模板
Agent 会自动构建包含 “用户问题 + 工具列表 + 格式要求” 的提示词,例如:
prompt = f"""
你可以使用这些工具:
- get_weather: 查询指定城市的天气,需要参数city
- calculate: 数学计算,需要参数expression用户问:北京的天气怎么样?
请返回JSON格式的工具调用指令(如{"action": "...", "parameters": {...}})
"""
大模型读到此提示词后,会输出符合格式的指令,确保 Agent 能解析并执行。
3. Agent 工作流:协调 “思考→行动→反馈” 的闭环
思路:用一套流程把 “用户问题→大模型决策→工具执行→结果整理” 串联起来,形成闭环。
核心步骤:接收问题→大模型判断调用工具→执行工具→生成回答
。
代码实现:
def run(self, user_query: str) -> str:# 1. 构建提示词(包含问题、工具描述)prompt = self._build_prompt(user_query, history)# 2. 大模型决策:该调用哪个工具?llm_response = self.llm.generate(prompt) # 得到JSON指令# 3. 解析指令,调用工具action = json.loads(llm_response)if action["action"] in self.tools:tool_result = self.tools[action["action"]].call(**action["parameters"]) # 执行工具# 4. 用工具结果生成最终回答final_answer = self.llm.generate(f"用工具结果回答:{tool_result}")return final_answer
为什么需要闭环?
复杂问题可能需要多轮调用(例如 “先查北京天气,再推荐适合的衣服”)。工作流确保 Agent 能根据工具返回的结果,决定是否继续调用其他工具,直到解决问题。
三、总结:Agent 的核心逻辑链
- 用户提问:如 “北京天气怎么样?”
- Agent 引导大模型思考:通过提示词告诉大模型 “有天气查询工具,需要城市参数”。
- 大模型决策:输出调用
get_weather
工具的指令,参数为city="北京"
。 - Agent 执行工具:调用
get_weather("北京")
,得到结果 “晴朗,25℃”。 - 生成回答:大模型将工具结果整理为自然语言:“北京今天晴朗,气温 25℃”。
这个过程本质是 “让大模型像人一样思考和使用工具”—— 人会判断 “我需要查天气→打开天气 APP→输入城市→看结果→告诉别人”,Agent 则用代码模拟了这个过程,其中大模型负责 “判断和理解”,工具负责 “实际操作”,工作流负责 “步骤衔接”。
实际应用中,只需扩展工具(如添加数据库查询、邮件发送)和优化提示词,就能让 Agent 处理更复杂的任务(如自动写报告、数据分析等)。