首页 / 资讯中心 / 文章详情

深入理解AI Agent(1.1)---现代Agent=LLM+工具+上下文

深入理解AI Agent(1.1)---现代Agent=LLM+工具+上下文 ★ FEATURED ARTICLE
本文从 Agent 不是孤立的它在和 Environment文件、数据库、网页、API、用户交互 这句话展开。首先理清两个概念和一个过程概念 1什么是 Agent概念 2什么是环境过程Agent 是怎么跟环境交互的。一、什么是 Agent请记住这个核心公式Agent LLM 上下文 工具当代 Agent 由 3 个组件构成。最熟悉的就是 LLM国内有 DeepSeek、Qianwen、GLM国外有 Claude、ChatGPT、Grok。用拟人化梳理LLM 是大脑Agent 是给大脑装上配套躯体的完整体。躯体骨架很重要 —— 霍金天赋极高但羸弱的身体限制了他的现实活动。而人体怎么跟现实交互这引出 harness 工程可把它拟人成神经系统—— 但注意harness 不是第四个组件它属于工程范畴负责构建上下文、挂载工具。我们先把这个最小骨架搭起来import os from openai import OpenAI client OpenAI( api_keyos.environ[DEEPSEEK_API_KEY],#.env预占位也可以直接替换成key但不要外泄 base_urlhttps://api.deepseek.com ) messages [ {role: system, content: 你是一个会用工具的助手。}, {role: user, content: 请帮我算一下 (125 375) * 8。}, ]messages就是上下文client背后接的是 LLM—— 但此刻还缺 手脚也就是工具。二、什么是环境Environment环境 Agent 外部的、有自身状态、且能通过观察被感知、通过行动被改变的一切外部系统。三个核心性质有状态环境存着东西文件内容、数据库的行、网页 DOM、用户心情。Agent 不能直接读写它只能走两个口 ——Observation观察环境给 Agent 的输入Action行动Agent 通过工具对环境施加的改变。行动会反作用于环境。举个对比算一道题不改变环境但 写文件 会真实地改变文件系统def write_file(path: str, content: str) - str: with open(path, w, encodingutf-8) as f: f.write(content) return f已写入 {path} # 调用后文件系统环境真的变了下次读就是新内容三、三大组件之一工具工具就好比给大脑接一副强健躯体。工具分五类感知、执行、协作、事件触发、用户沟通。先定义工具函数本身def calculate(expression: str) - str: 接收数学表达式返回计算结果 try: return str(eval(expression)) except Exception as e: return f计算出错: {e}光有函数还不够还得写一份 说明书 告诉 LLM 这个工具叫什么、要什么参数tools [ { type: function, function: { name: calculate, description: 使用 eval 计算数学表达式需要计算时直接调用不可心算, parameters: { type: object, properties: { expression: {type: string, description: 如 124/2} }, required: [expression], additionalProperties: False } } } ]工具调用Function Calling流程声明工具 → LLM 决定调哪个、传什么参数 → 执行 → 返回结果 → 模型再决策。 实验 1-1 消融实测我们用messages[]追加式维持完整对话做了两组消融表格消融方式模型表现说明正常full调一次calculate→ 给出 4000基线藏起工具结果content 置空反复重调直到 3 轮上限看不到结果就一直重试不声明工具不传 tools一次不调直接心算根本不知道有这个工具结论工具定义能做什么和工具结果做成了什么是两件事缺一不可。四、三大组件之二LLMLLM 本质是概率机器预测下一个 token。它动手前会先在内部推演 —— 这就是返回 JSON 里的reasoning_contentmsg resp.choices[0].message print(内部思考:, msg.reasoning_content) # The user wants me to calculate... Let me use the calculate tool. print(最终回答:, msg.content)关于 工具能力被内化后 Agent 是否岌岌可危我的看法是环境复杂性客观存在模型越把工具调用内化harness 这层约束、验证、纠错反而越关键。学习机制三层更新位置越深、泛化越强、回滚越难上下文适应临时塞示例即时生效任务结束即失效外部产物更新写进 Prompt/Skill/ 代码跨任务持久、可审计参数更新微调 / RL泛化最强但成本最高。五、三大组件之三上下文上下文是 Agent 在每个决策点能看到的全部信息五种内容系统提示词、工具定义、用户消息、模型回复、工具执行结果。在消息列表里五种消息长这样注意不同 role 的字段messages [ {role: system, content: ...}, # ① 系统提示词静态前缀 {role: user, content: ...}, # ③ 用户消息轨迹 {role: assistant, content: ..., tool_calls: [...]}, # ④ 模型回复轨迹 {role: tool, tool_call_id: call_xxx, content: 4000} # ⑤ 工具结果轨迹 ]两个关键点模型无状态它不记得上一轮每调一次create()都要把完整历史重发 —— 这就是为什么用messages[]一路追加。上下文 静态前缀 轨迹静态前缀system 工具定义固定命中 KV Cache(复用之前的计算成果省成本)轨迹user/assistant/tool随循环追加、越来越长。(可以理解为单会话中的完整的事件过程)六、三大组件怎么协作ReAct 循环诞生ReAct 范式的提出2022年10月普林斯顿大学和 Google 的研究团队Shunyu Yao 等人发表了经典论文《ReAct: Synergizing Reasoning and Acting in Language Models》。1. 核心思想ReAct 强制模型在输出时必须交替生成Thought思考、Action行动和Observation观察。2. 标准执行循环ReAct LoopQuestion: 2024年巴黎奥运会首金得主是哪个国家的他出生的城市人口是多少 Thought 1: 我需要先查出2024巴黎奥运会首金得主是谁。 Action 1: Search(2024 Paris Olympics first gold medalist) Observation 1: [搜索结果] 首金得主是黄雨婷/盛李豪射击10米气步枪混合团体这里指个人首金是盛李豪... Thought 2: 盛李豪获得了首金。接下来我需要查他出生的城市。 Action 2: Search(盛李豪 出生地) Observation 2: [搜索结果] 盛李豪出生于江苏省张家港市。 Thought 3: 出生地是张家港市。现在我需要查张家港市的人口。 Action 3: Search(张家港市 人口) Observation 3: [搜索结果] 截至2023年末张家港市常住人口为143.2万人。 Thought 4: 我已经找到了所有需要的信息。首金得主是中国选手他出生的城市人口是143.2万。 Action 4: Finish(中国143.2万人)3. 为什么 ReAct 有效Reasoning 引导 Action思考过程帮助模型制定计划决定调用什么工具、传什么参数避免盲目调用。Action 纠正 Reasoning工具返回的真实结果Observation作为外部锚点Grounding打破了模型的幻觉让下一步的思考基于事实。可以简单理解ReActReasoning Acting就是把 LLM、工具、上下文串起来的核心机制思考 → 行动 → 观察 → 再思考循环往复核心循环的骨架注意每次如何追加、如何回灌while turn max_turns: resp client.chat.completions.create( modeldeepseek-v4-flash, messagesmessages, toolstools ) msg resp.choices[0].message messages.append(msg.model_dump()) if msg.tool_calls: for tc in msg.tool_calls: args json.loads(tc.function.arguments) result calculate(args[expression]) messages.append({ role: tool, tool_call_id: tc.id, content: result }) else: print(最终回答:, msg.content) break死循环怎么办两道保险模型不再调工具finish_reasonstop就给最终答案到最大轮次上限如 3 轮还没收敛就强制停并报警。轨迹按会话隔离 —— 每个用户、每个任务有独立的messages[]互不污染。七、完整实验代码下面是完整的最小 ReAct Agent含两个消融开关import os import json from openai import OpenAI from dotenv import load_dotenv, find_dotenv load_dotenv(find_dotenv()) def calculate(expression: str) - str: try: return str(eval(expression)) except Exception as e: return f计算出错: {e} tools [ { type: function, function: { name: calculate, description: 使用 eval 计算数学表达式需要计算时直接调用不可心算, parameters: { type: object, properties: { expression: {type: string, description: 如 124/2} }, required: [expression], additionalProperties: False } } } ] def main(): client OpenAI( api_keyos.environ[DEEPSEEK_API_KEY], base_urlhttps://api.deepseek.com ) messages [ {role: system, content: 你是一个会用工具的助手。}, {role: user, content: 请帮我算一下 (125 375) * 8 等于多少。}, ] HIDE_TOOL_RESULT False # True藏起工具结果消融1 HIDE_TOOLS False # True不声明工具消融2 max_turns 3 turn 0 while turn max_turns: turn 1 kwargs {model: deepseek-v4-flash, messages: messages} if not HIDE_TOOLS: kwargs[tools] tools resp client.chat.completions.create(**kwargs) msg resp.choices[0].message messages.append(msg.model_dump()) if msg.tool_calls: for tc in msg.tool_calls: args json.loads(tc.function.arguments) result calculate(args[expression]) sent if HIDE_TOOL_RESULT else result messages.append({ role: tool, tool_call_id: tc.id, content: sent }) else: print(最终回答:, msg.content) break else: print(f⚠️ 跑到 {max_turns} 轮上限模型没收敛) if __name__ __main__: main()小结Agent 大脑LLM 眼睛上下文 手脚工具靠 ReAct 循环把 思考→行动→观察 转起来模型每轮无状态地把完整历史重读一遍。本文参考书籍:《深入理解 AI Agent设计原理与工程实践》李博杰 著
阅读完成 · 觉得有帮助?
咨询建站