一、核心思路:让大模型具备 “调用工具解决问题” 的能力

  传统大模型存在两个局限:(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 的核心逻辑链

  1. 用户提问:如 “北京天气怎么样?”
  2. Agent 引导大模型思考:通过提示词告诉大模型 “有天气查询工具,需要城市参数”。
  3. 大模型决策:输出调用get_weather工具的指令,参数为city="北京"
  4. Agent 执行工具:调用get_weather("北京"),得到结果 “晴朗,25℃”。
  5. 生成回答:大模型将工具结果整理为自然语言:“北京今天晴朗,气温 25℃”。

这个过程本质是 “让大模型像人一样思考和使用工具”—— 人会判断 “我需要查天气→打开天气 APP→输入城市→看结果→告诉别人”,Agent 则用代码模拟了这个过程,其中大模型负责 “判断和理解”,工具负责 “实际操作”,工作流负责 “步骤衔接”。

实际应用中,只需扩展工具(如添加数据库查询、邮件发送)和优化提示词,就能让 Agent 处理更复杂的任务(如自动写报告、数据分析等)。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐