写点什么

AI 智能体 - 学习与适应能力

作者:Hernon AI
  • 2025-12-02
    浙江
  • 本文字数:6518 字

    阅读完需:约 21 分钟

AI 智能体 - 学习与适应能力

📖 前言:从“静态程序”到“数字生命”

在传统的软件工程中,代码一旦部署,其行为就是确定的。if 条件不会自己改变,数据库的查询逻辑也不会因为查询了一万次而变得更聪明。然而,AI 智能体(AI Agents)的出现打破了这一僵局。


我们正处于一个范式转移的时刻:从构建工具,转向构建能够进化的系统。


如果一个智能体在面对第 100 个用户时,表现得和面对第 1 个用户时一模一样,那么它就是一个失败的智能体。真正的智能体(Agentic AI)必须具备 学习与适应(Learning and Adaptation) 的能力——它们应该像新员工一样,从错误中吸取教训,从反馈中优化策略,甚至修改自己的代码以适应不断变化的环境。


本文将带你深入 AI 进化的核心,解构从 强化学习 (RL)直接偏好优化 (DPO) 的技术原理,剖析 SICAAlphaEvolve 等前沿案例,并手把手教你使用 LangChain 架构,赋予你的智能体自我进化的能力。



第一部分:智能体学习的认知光谱

在讨论“学习”时,我们需要明确:对于基于大语言模型(LLM)的智能体而言,“学习”有着不同的层次和定义。

1.1 权重更新 vs 上下文适应

智能体的学习主要分为两种物理形态:


  1. 参数知识(Parametric Knowledge)更新

  2. 定义:通过训练(Training)或微调(Fine-tuning)改变神经网络的权重。

  3. 特点:这是“刻在脑子里”的知识。

  4. 技术:SFT(监督微调)、RLHF(人类反馈强化学习)、PPO、DPO。

  5. 适用场景:让模型学会一种全新的语言、掌握企业内部的特殊代码规范、或者彻底改变其价值观。

  6. 非参数知识(Non-Parametric Knowledge)/ 上下文学习(In-Context Learning)

  7. 定义:模型权重不变,通过改变“短期记忆”(Prompt/Context)或“长期记忆”(RAG/Vector DB)来改变行为。

  8. 特点:这是“写在笔记本上”的知识,随时可查,随时可改。

  9. 技术:RAG、Few-Shot Prompting、Memory Reflection。

  10. 适用场景:绝大多数应用层开发。让智能体记住用户喜好、适应新的 API 文档、从昨天的错误中调整今天的策略。

1.2 学习机制全景图




第二部分:硬核对齐——PPO 与 DPO 的进化

当我们需要深度调整智能体的“直觉”和“偏好”时,仅仅依靠提示词是不够的。这时我们需要触及模型的灵魂——权重。

2.1 近端策略优化 (PPO):稳健的“教练”

PPO (Proximal Policy Optimization) 是强化学习领域的明星算法,也是 ChatGPT 早期训练的核心功臣(RLHF 阶段)。


  • 核心痛点:在强化学习中,如果模型步子迈得太大(策略更新太激进),很容易导致模型“崩溃”,变得胡言乱语。

  • PPO 的解决方案裁剪(Clipping)机制

  • 它在旧策略和新策略之间画了一个“信任圈”(Trust Region)。

  • 如果新策略偏离旧策略太远(差异过大),PPO 会强制“刹车”,忽略超出的部分。

  • 比喻:就像教一个人打高尔夫球,教练允许你微调姿势,但如果你突然想尝试“倒立击球”,教练会立刻制止你,让你回到稍微改进的姿势上。

2.2 直接偏好优化 (DPO):去中介化的革命

DPO (Direct Preference Optimization) 是 2023-2024 年兴起的新贵,它正在取代 PPO 在 LLM 对齐中的地位。


  • PPO 的问题(两步走的繁琐)

  • 先训练一个奖励模型(Reward Model),充当“裁判”。

  • 再用 PPO 训练 LLM,让它去取悦“裁判”。


  • 缺点:训练不稳定,资源消耗巨大,且 LLM 容易学会“欺骗”裁判(Reward Hacking)。

  • DPO 的创新(一步到位)

  • DPO 不需要奖励模型。

  • 它直接利用人类的偏好数据(数据对: 优于 )来构建损失函数。

  • 数学魔法:DPO 证明了,优化人类偏好等同于优化一个特定的分类问题。

  • 指令:“增加生成 的概率,同时减少生成 的概率。”

  • 优势:更稳、更快、更省显存。



第三部分:前沿案例研究——自我进化的数字物种

如果说 PPO/DPO 还需要人类干预,那么 SICAAlphaEvolve 则展示了智能体自我进化的未来。

3.1 SICA:能够修改自己源码的智能体

Self-Improving Coding Agent (SICA) 是一个令人兴奋但也令人细思极恐的实验。它打破了“程序”与“程序员”的界限。

衔尾蛇循环 (The Ouroboros Loop)

SICA 的运行逻辑是一个完美的闭环:


  1. 基准测试:SICA 运行当前版本的自己,解决一组编程题。

  2. 反思与选择:它查看历史存档,选择表现最好的“自我版本”。

  3. 自我修改:它阅读自己的源代码,分析哪里写得不好(例如:搜索效率低、内存占用高)。

  4. 进化:它编写补丁,修改自己的源码(例如:引入 AST 解析器来替代正则表达式查找)。

  5. 重生:新版本的 SICA 启动,进入下一轮循环。

进化成果

SICA 最初只是简单的文件覆盖,后来它“发明”了:


  • 差异增强智能编辑器:只修改变动的部分,而非重写整个文件。

  • 混合符号定位器:结合 AST 和文本搜索来定位代码定义,大幅提升了自身导航代码库的速度。

3.2 AlphaEvolve:算法的达尔文进化

Google DeepMind 的 AlphaEvolve 则专注于发现新的数学算法。


  • 架构:Gemini Flash(发散思维,提出海量算法草案) + Gemini Pro(收敛思维,深度评估与优化)。

  • 成就

  • 在 Google 数据中心,它发现了更优的调度算法,降低了 0.7% 的全球算力消耗。

  • 发现了 4x4 复值矩阵乘法的新算法,打破了人类数十年的记录。



第四部分:实际应用场景——从理论到落地

在企业级应用中,我们通常不会让智能体随意修改自己的底层代码(风险太大),但我们会广泛使用上下文学习在线适应

4.1 个性化金融交易机器人

  • 机制:在线学习 (Online Learning) + 强化学习。

  • 场景:机器人不仅依据预设的 MACD 指标交易。它会实时监控市场波动率。当发现最近一周“动量策略”失效而“均值回归策略”赚钱时,它会动态调整内部权重,适应当前的市场情绪。

4.2 “越用越顺手”的 IDE 编码助手

  • 机制:RAG + 记忆适应。

  • 场景:刚开始,助手不知道你的代码风格。当你多次修正它(例如:“团队用下划线命名法,不用驼峰”),它会将这条规则写入长期记忆。下一次,即使在新项目中,它也会自动应用这一规则。

4.3 自适应 UI/UX 的 App 智能体

  • 机制:无监督学习 + A/B 测试。

  • 场景:智能体监控用户在 App 内的点击热力图。如果发现老年用户经常在“设置”页面迷路,智能体会在运行时动态简化 UI 结构,或者主动弹窗询问:“需要把字体调大吗?”



第五部分:LangChain 实战——构建“可学习”的智能体

接下来,我们将使用 LangChain v0.3 (LCEL) 语法,构建具有三种不同学习能力的智能体。

环境准备

pip install langchain langchain-openai langchain-chroma chromadb
复制代码

实战一:In-Context Learning (少样本动态适应)

这是最基础但也最实用的“学习”。智能体并不真的记住了什么,但它能根据当前任务,动态从数据库中检索最相关的“教学案例”,从而瞬间“学会”如何处理新任务。


场景:一个 SQL 生成智能体。它本身不懂复杂的企业表结构,但我们有一个“优质 SQL 案例库”。


from langchain_core.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplatefrom langchain_core.example_selectors import SemanticSimilarityExampleSelectorfrom langchain_chroma import Chromafrom langchain_openai import OpenAIEmbeddings, ChatOpenAI
# 1. 准备“教材”:已知的优质问答对examples = [ {"input": "查询所有活跃用户的邮箱", "output": "SELECT email FROM users WHERE status = 'active';"}, {"input": "统计每个部门的平均薪资", "output": "SELECT dept_id, AVG(salary) FROM employees GROUP BY dept_id;"}, {"input": "查找过去30天未登录的用户", "output": "SELECT id FROM users WHERE last_login < NOW() - INTERVAL '30 days';"},]
# 2. 构建示例选择器:基于语义相似度动态挑选“教材”# 这就是智能体的“联想学习”能力example_selector = SemanticSimilarityExampleSelector.from_examples( examples, OpenAIEmbeddings(), Chroma, k=1, # 每次只选 1 个最相似的例子,节省 Token)
# 3. 定义少样本提示模板example_prompt = ChatPromptTemplate.from_messages( [ ("human", "{input}"), ("ai", "{output}"), ])
few_shot_prompt = FewShotChatMessagePromptTemplate( example_selector=example_selector, example_prompt=example_prompt,)
# 4. 构建最终的系统提示final_prompt = ChatPromptTemplate.from_messages( [ ("system", "你是一个 SQL 专家。根据参考示例,将用户的自然语言转换为 SQL。"), few_shot_prompt, # 动态插入学习到的例子 ("human", "{input}"), ])
# 5. 运行链model = ChatOpenAI(model="gpt-4o", temperature=0)chain = final_prompt | model
# 测试:智能体通过检索“统计部门薪资”的例子,学会了 GROUP BY 的用法response = chain.invoke({"input": "计算每个班级的学生人数"})print(f"生成的 SQL: {response.content}")# 预期输出: SELECT class_id, COUNT(*) FROM students GROUP BY class_id;
复制代码

实战二:Feedback Loop (基于反馈的自我修正学习)

这个模式模拟了人类的学习过程:尝试 -> 失败 -> 反思 -> 成功。虽然模型权重没变,但通过将错误信息作为上下文反馈给模型,它在当前会话中“学会”了如何解决问题。


场景:一个 Python 代码生成器,如果代码运行报错,它会分析错误并自我修正。


from langchain_core.tools import toolfrom langchain_core.messages import HumanMessage, AIMessagefrom langgraph.graph import StateGraph, ENDfrom typing import TypedDict, List, Annotatedimport operator
# 1. 定义工具:代码执行器@tooldef execute_python(code: str): """执行 Python 代码并返回结果或错误信息""" try: # 警告:生产环境请使用沙箱! exec_globals = {} exec(code, exec_globals) return f"执行成功。结果: {exec_globals.get('result', 'No result variable')}" except Exception as e: return f"执行错误: {str(e)}"
# 2. 定义状态class AgentState(TypedDict): messages: Annotated[List[HumanMessage | AIMessage], operator.add] code: str error: str iterations: int
# 3. 定义节点逻辑
llm = ChatOpenAI(model="gpt-4o", temperature=0)
def generate_code(state: AgentState): """生成或修改代码""" messages = state['messages'] error = state.get('error', '') if error: # 学习模式:基于错误信息进行修正 prompt = f"上一次的代码执行报错了:{error}。请分析原因并修复代码。只返回代码,不要Markdown。" messages.append(HumanMessage(content=prompt)) else: # 初始模式 prompt = "请编写 Python 代码计算:斐波那契数列的第 10 位。将结果赋值给变量 'result'。只返回代码。" messages.append(HumanMessage(content=prompt)) response = llm.invoke(messages) code = response.content.replace("```python", "").replace("```", "").strip() return {"code": code, "messages": [response], "iterations": state['iterations'] + 1}
def execute_and_evaluate(state: AgentState): """运行代码并评估""" code = state['code'] result = execute_python.invoke(code) if "执行错误" in result: return {"error": result} else: return {"error": "", "final_result": result}
def should_continue(state: AgentState): """决定是继续学习还是结束""" if not state['error']: return "end" if state['iterations'] > 3: return "end" # 止损 return "retry"
# 4. 构建图 (LangGraph)workflow = StateGraph(AgentState)
workflow.add_node("coder", generate_code)workflow.add_node("executor", execute_and_evaluate)
workflow.set_entry_point("coder")workflow.add_edge("coder", "executor")
workflow.add_conditional_edges( "executor", should_continue, { "retry": "coder", # 有错误,回炉重造 "end": END # 成功,结束 })
app = workflow.compile()
# 5. 运行# 假设第一次生成的代码有语法错误,LangGraph 会自动引导它进入修正循环final_state = app.invoke({"messages": [], "iterations": 0, "error": ""})print(f"最终代码:\n{final_state['code']}")
复制代码

实战三:Memory-Based Adaptation (基于长期记忆的策略适应)

这是真正的“长期适应”。智能体将成功的经验写入数据库,未来的调用会先查询这个数据库。


from langchain.memory import VectorStoreRetrieverMemoryfrom langchain_chroma import Chromafrom langchain_openai import OpenAIEmbeddings
# 1. 初始化长期记忆库 (Vector Store)# 这就是智能体的“经验书”vectorstore = Chroma(embedding_function=OpenAIEmbeddings())retriever = vectorstore.as_retriever(search_kwargs={"k": 1})memory = VectorStoreRetrieverMemory(retriever=retriever)
# 2. 模拟:智能体学习到了用户的偏好# 在实际应用中,这通常发生在对话结束后的“反思”阶段memory.save_context( {"input": "我喜欢什么样的代码风格?"}, {"output": "用户偏好 PEP8 规范,但要求使用 4 空格缩进,且函数必须有文档字符串。"})
memory.save_context( {"input": "我在使用什么数据库?"}, {"output": "当前项目使用的是 PostgreSQL 15。"})
# 3. 模拟:新的一天,用户提出了新请求user_input = "帮我写一个连接数据库的函数。"
# 4. 检索:智能体首先回忆(检索)相关经验# LangChain 会自动根据 user_input 在向量库中查找相关信息context = memory.load_memory_variables({"prompt": user_input})print(f"--- 唤醒的记忆 ---\n{context['history']}")
# 5. 生成:结合记忆生成结果prompt = f"""你是一个智能编程助手。参考以下背景记忆:{context['history']}
用户请求:{user_input}"""response = llm.invoke(prompt)print(f"\n--- 适应后的回答 ---\n{response.content}")
# 预期结果:生成的代码会自动包含 4 空格缩进、文档字符串,并使用 psycopg2 (PG库) 而非 mysql。
复制代码



第六部分:挑战与未来——学习的代价

尽管“学习型智能体”听起来很完美,但在工程落地中,我们面临着巨大的挑战:

6.1 稳定性 vs. 可塑性 (Stability-Plasticity Dilemma)

  • 问题:如果智能体学得太快,它可能因为一次错误的用户输入而“学坏”,导致后续行为跑偏(灾难性遗忘或中毒)。

  • 对策:设置学习率(Learning Rate)或记忆门控(Gating)。只有经过验证(如单元测试通过、用户点赞)的经验,才允许写入长期记忆。

6.2 成本爆炸

  • 问题:SICA 模式需要大量的自我推理和反复迭代,Token 消耗量是普通问答的数倍甚至数十倍。

  • 对策:使用分层模型。用廉价模型(如 Gemini Flash)做发散性探索,用昂贵模型(如 Gemini Pro/Ultra)做最终决策和记忆归档。

6.3 评估难题

  • 问题:如何判断智能体是真的“学会”了,还是只是偶然猜对了?

  • 对策:建立稳健的评估集(Eval Sets)。每次智能体更新自身策略后,必须跑通回归测试(Regression Test),确保核心能力没有下降。



结语:迈向自主进化的奇点

学习与适应,是 AI 智能体从“自动化脚本”迈向“数字员工”的关键一步。


通过 SICA 这样的自我修正循环,LangGraph 这样的状态管理框架,以及 RAG 提供的长期记忆,我们正在构建一种能够随时间推移而增值的软件资产。


未来的 AI 智能体,不会是出厂即巅峰的静态产品,而是一个在与你的交互中不断成长、不断契合你习惯的、独一无二的智慧体。作为开发者,我们的任务不再是编写死板的逻辑,而是设计 “如何学习”的机制


现在,去训练你的智能体,让它学会从错误中成长吧。

参考资料:

1.AlphaEvolve: https://deepmind.google/discover/blog/alphaevolve-a-gemini-powered-coding-agent-for-designing-advanced-algorithms/2.OpenEvolve: https://github.com/codelion/openevolve3.Antonio Gulli 《Agentic Design Patterns》

发布于: 刚刚阅读数: 3
用户头像

Hernon AI

关注

创意心中美好世界 2020-08-19 加入

AI爱好者

评论

发布
暂无评论
AI 智能体 - 学习与适应能力_AI智能体_Hernon AI_InfoQ写作社区