恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

构建可学习的LLM Agent:从检索增强到LoRA微调的工程实践

  • 首页
  • 资讯中心
  • /
  • 构建可学习的LLM Agent:从检索增强到LoRA微调的工程实践

相关资讯

Windows 右键菜单越来越臃肿?用 ContextMenuManager 快速清理与定制 2026/8/18 7:38:31
从DeepSeek 8月17日峰谷分时定价看差异化定价的数学建模:4.5倍/3倍/12倍价差背后的需求弹性与排队论 2026/8/18 7:38:31
从Stripe 70亿美元收购OpenRouter(82天估值翻5.4倍)看AI并购估值的倍数法建模:营收倍数、用户倍数与增长折现 2026/8/18 7:38:31

最新资讯

Speech_Kit_最佳实践与性能优化
无人机飞控配置总翻车?Betaflight Configurator 零基础避坑指南:从连不上到好飞
信号与系统-拉普拉斯变换
深入解析Azure RTOS ThreadX:物联网设备实时操作系统的核心机制与应用实践
用 Python 轻松读取通达信数据,mootdx 让 A 股行情获取不再折腾
2026年8月最新客户口碑:制造业靠谱的GEO优化服务商有哪些?看懂广拓时代的GEO服务价值|实务解读

今日推荐

数据缺失处理:从MCAR、MAR到MNAR的机制解析与多重插补实践
MAGS-SLAM:多智能体协同3D高斯泼溅SLAM系统解析
LLM智能体记忆管理:基于关键词门控的混合激活机制CAMeR详解

本周热门

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码
【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码
隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

本月精选

如何用DamaiHelper实现演唱会门票的智能自动化抢购:完整技术解决方案指南
第4篇:59 倍性能差距的索引瓶颈定位——一次教科书级的全表扫描调优
终极歌词批量下载神器:5分钟解决离线音乐库歌词同步难题

构建可学习的LLM Agent:从检索增强到LoRA微调的工程实践

发布时间:2026/8/18 7:38:31
构建可学习的LLM Agent:从检索增强到LoRA微调的工程实践 1. 项目概述当大模型学会“翻笔记”最近在折腾大模型应用落地的朋友估计都绕不开一个词Agent智能体。我们总希望大模型不仅能回答问题更能像人一样规划、使用工具、执行复杂任务。但现实很骨感一个常见的痛点就是“健忘”——Agent在长对话或多轮任务中常常忘记之前的上下文或者无法有效复用历史经验导致每次都要从头思考效率低下且成本高昂。“Retrieval-Augmented LLM Agents: Learning to Learn from Experience”这个标题精准地戳中了这个痛点。它描述的不是一个单一的工具而是一种让LLM Agent具备“学习”能力的架构范式。简单来说就是给Agent配上一个“经验笔记本”检索增强模块和一个“学习方法”学习机制让它能从自己或他人的历史行动中检索相关经验并动态地优化自己的行为策略。这背后的核心驱动力是将静态的提示工程Prompt Engineering转变为动态的经验学习Experience Learning。我们不再需要为每一个可能的任务场景编写冗长、精细的提示词而是让Agent在运行过程中自动积累和调用“最佳实践”。这听起来有点像强化学习但它更轻量、更直接尤其适合与检索增强生成RAG技术结合构建能持续进化的智能体。对于开发者而言这意味着你可以构建出更稳定、更智能、更“便宜”的Agent应用。无论是客服对话机器人、自动化数据分析助手还是复杂的业务流程编排引擎具备“学习”能力的Agent都能显著提升任务完成率和用户体验。2. 核心架构拆解经验库、检索器与学习引擎要实现“从经验中学习”整个系统架构需要三个核心组件的紧密配合经验记忆库、智能检索器、以及参数化学习引擎。理解这三者的关系是设计和实现此类Agent的关键。2.1 经验记忆库不只是聊天记录经验库Experience Memory远不止是存储对话历史那么简单。它的设计质量直接决定了Agent能学到什么。一个结构良好的经验库应该包含以下几个维度的信息任务描述用自然语言清晰定义当时要解决的问题或目标。例如“为用户查询过去一个月的销售额并生成趋势图表。”执行轨迹记录Agent完整的思考链和行动序列。这包括内部思考LLM的推理过程Chain-of-Thought。工具调用调用了哪个工具如search_database,run_python_code传入的参数是什么。工具返回结果工具执行后的输出。观察与判断Agent对工具结果的解读。最终结果与反馈任务最终的成功与否以及可能的外部反馈如用户评分、任务目标达成度指标。元数据时间戳、会话ID、消耗的Token数、执行耗时等用于后续的经验筛选和质量评估。存储格式上推荐使用向量数据库如Chroma, Weaviate, Qdrant与关系型数据库如PostgreSQL结合的方式。向量数据库用于存储任务描述、关键决策点等文本的嵌入向量支持高效的语义检索关系型数据库则用于存储结构化的执行轨迹和元数据便于复杂查询和分析。注意经验数据需要定期清洗和去噪。并非所有历史记录都是“好经验”。失败的轨迹同样有价值但需要标注清楚。建议设计一个简单的打分系统根据任务成功率、执行效率等自动为经验片段打分优先存储和检索高分经验。2.2 智能检索器找到“最相关”的过去当Agent面临一个新任务时检索器负责从经验库中找出最相关的历史片段。这里的“相关”不仅是语义相似更是策略相关。基于语义的检索这是基础。将新任务描述向量化在经验库的“任务描述”向量中查找最相似的Top-K条记录。这能快速找到解决过类似问题的经验。基于执行上下文的检索在Agent多步执行过程中当前的中间状态如已获取的信息、已执行的动作也是一个强大的查询信号。可以将其与初始任务描述结合动态检索下一步该做什么的经验。例如当Agent已经查询了数据库得到原始数据后检索关键词就应变为“如何对销售数据进行可视化分析”。混合检索与重排序通常先通过向量检索召回一批候选经验再使用一个轻量级的交叉编码器模型或基于规则的评分器进行重排序。评分标准可包括任务相似度、执行成功率、工具调用序列的匹配度等。检索器的设计目标是在召回率和精度之间取得平衡。召回不足Agent可能找不到可用经验精度不够则可能引入误导性信息。2.3 参数化学习引擎从模仿到微调检索到的经验如何转化为Agent能力的提升这里主要有两种路径对应着不同的“学习”深度。路径一上下文学习In-Context Learning这是最轻量、最常用的方式。将检索到的经验通常是成功的轨迹作为少样本示例插入到当前任务的提示词中。例如你是一个数据分析助手。以下是一些类似任务的成功处理方式 [示例1任务描述 执行轨迹] [示例2任务描述 执行轨迹] 现在请处理新任务[新任务描述]这种方式让LLM“模仿”过去的成功做法无需改变模型本身实现成本低、响应快。但它受限于LLM的上下文长度且学习到的“策略”无法持久化每次都需要检索和注入。路径二参数高效微调Parameter-Efficient Fine-Tuning, PEFT这才是标题中“Learning to Learn”的深层含义——让Agent的参数发生持续、定向的演化。当积累了大量高质量的成功经验后我们可以用这些经验数据对底层的LLM进行微调。为什么用LoRA全参数微调大模型成本极高。LoRALow-Rank Adaptation通过为模型权重注入低秩分解的适配器只训练这些新增的、参数量极小的适配器而冻结原始大模型参数。这大大降低了训练开销和存储需求使得基于经验数据持续迭代Agent成为可能。训练数据构建将经验库中的任务描述成功执行轨迹对作为训练样本。执行轨迹需要被格式化为模型能够学习的序列例如特定的标记化格式让模型学会在给定任务描述下生成正确的思考、工具调用和参数。持续学习流程可以设定一个周期如每周将过去一段时间积累的新经验加入训练集用LoRA对适配器进行增量训练。这样Agent的能力就像滚雪球一样不断增强。两种引擎的对比与选择特性上下文学习ICL参数微调LoRA学习速度即时生效需要离线训练周期能力持久性临时性依赖每次检索永久性固化到模型参数资源开销低仅增加提示词长度中等需要GPU训练资源个性化程度高可实时根据任务检索高学到的即是个性化策略适用场景任务多样、需快速适配冷启动阶段任务模式相对稳定有稳定经验流积累在实际系统中两者常结合使用用ICL处理实时、多样的长尾任务同时用LoRA定期固化高频、通用的成功策略。3. 实操构建从零搭建一个可学习的Agent理论讲完我们来点实际的。下面我将以构建一个“数据分析助手”Agent为例拆解如何一步步实现一个具备检索增强学习能力的系统。我们将使用LangChain作为Agent框架Chroma作为向量库并整合LoRA微调流程。3.1 第一步定义Agent能力与工具集首先明确Agent的职责。我们的数据分析助手需要能理解用户关于数据的问题。连接数据库执行查询。对查询结果进行初步分析和可视化。为此我们定义以下工具from langchain.tools import tool import pandas as pd import matplotlib.pyplot as plt import sqlite3 tool def query_database(query: str) - str: 执行SQL查询并返回结果。 # 连接你的数据库这里用SQLite示例 conn sqlite3.connect(sales.db) df pd.read_sql_query(query, conn) conn.close() return df.to_string() tool def plot_line_chart(data: str, x_column: str, y_column: str) - str: 根据提供的数据CSV格式字符串和列名生成折线图并保存。 df pd.read_csv(pd.compat.StringIO(data)) plt.figure(figsize(10,6)) plt.plot(df[x_column], df[y_column]) plt.title(f{y_column} over {x_column}) plt.xlabel(x_column) plt.ylabel(y_column) plt.grid(True) file_path fplot_{x_column}_{y_column}.png plt.savefig(file_path) plt.close() return f图表已保存至{file_path}3.2 第二步实现经验记录与存储我们需要在Agent执行过程中拦截并记录其每一步动作和思考。LangChain的CallbackHandler非常适合做这个。from langchain.callbacks.base import BaseCallbackHandler from pydantic import BaseModel from typing import Any, Dict, List import json from datetime import datetime class Experience(BaseModel): task: str trajectory: List[Dict] # 每一步的记录 final_output: str success: bool metadata: Dict[str, Any] class ExperienceRecorder(BaseCallbackHandler): def __init__(self, task_description: str): self.task task_description self.trajectory [] self.current_step {} def on_llm_start(self, serialized: Dict[str, Any], prompts: List[str], **kwargs): # 记录LLM的输入思考/决策 self.current_step[llm_input] prompts[0] def on_tool_start(self, serialized: Dict[str, Any], input_str: str, **kwargs): # 记录工具调用开始 self.current_step[tool_name] serialized.get(name) self.current_step[tool_input] input_str def on_tool_end(self, output: str, **kwargs): # 记录工具输出并完成一步的记录 self.current_step[tool_output] output self.trajectory.append(self.current_step.copy()) self.current_step {} def finalize(self, final_output: str, success: bool): experience Experience( taskself.task, trajectoryself.trajectory, final_outputfinal_output, successsuccess, metadata{timestamp: datetime.now().isoformat()} ) # 存储到经验库 save_experience(experience) def save_experience(exp: Experience): # 1. 将任务描述向量化并存入向量数据库如Chroma # 2. 将完整经验对象序列化后存入关系数据库或文档数据库 pass3.3 第三步构建检索增强的提示词在运行Agent前我们先从经验库中检索相似的成功案例并将其构建成少样本提示词。from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import Chroma def build_augmented_prompt(task: str, k_examples: int 2) - str: 构建检索增强的提示词 # 1. 检索相似经验 embeddings OpenAIEmbeddings() vectordb Chroma(persist_directory./exp_db, embedding_functionembeddings) docs vectordb.similarity_search(task, kk_examples) # 2. 格式化示例 examples_text for doc in docs: # 假设doc.metadata中存储了经验ID我们从主库取出完整轨迹 exp load_experience_by_id(doc.metadata[exp_id]) exp_formatted format_experience_as_example(exp) examples_text f\n\n## 示例\n{exp_formatted} # 3. 构建最终提示词 system_prompt f你是一个数据分析助手。请参考以下历史成功案例的解决思路和步骤来处理新任务。 full_prompt f{system_prompt}\n{examples_text}\n\n## 新任务\n{task} return full_prompt def format_experience_as_example(exp: Experience) - str: 将一条经验格式化为少样本示例文本 formatted f任务{exp.task}\n\n助理的思考与行动\n for step in exp.trajectory: formatted f- 思考{step.get(llm_input, )}\n if tool_name in step: formatted f- 行动调用工具【{step[tool_name]}】输入{step[tool_input]}\n formatted f- 观察{step.get(tool_output, )}\n formatted f\n最终结果{exp.final_output} return formatted3.4 第四步集成与运行Agent将以上模块组合起来创建可学习的Agent。from langchain.agents import AgentExecutor, create_react_agent from langchain.prompts import PromptTemplate from langchain_openai import ChatOpenAI def create_learnable_agent(task: str): # 1. 检索并构建增强提示 augmented_prompt build_augmented_prompt(task) # 2. 初始化LLM和工具 llm ChatOpenAI(modelgpt-4, temperature0) tools [query_database, plot_line_chart] # 3. 使用ReAct范式创建Agent prompt_template PromptTemplate.from_template( {augmented_prompt}\n\n请开始处理任务。当前任务{input}\n{agent_scratchpad} ) agent create_react_agent(llm, tools, prompt_template) # 4. 创建执行器并传入经验记录回调 recorder ExperienceRecorder(task_descriptiontask) agent_executor AgentExecutor( agentagent, toolstools, callbacks[recorder], verboseTrue ) return agent_executor, recorder # 使用示例 task 帮我分析一下上季度各产品的销售额趋势并画出图表。 agent_executor, recorder create_learnable_agent(task) try: result agent_executor.invoke({input: task}) # 假设我们根据结果判断任务成功 recorder.finalize(final_outputresult[output], successTrue) except Exception as e: recorder.finalize(final_outputstr(e), successFalse)至此一个能记录经验、并能利用历史经验来指导新任务的基础版“可学习Agent”就搭建完成了。它通过检索相似的过去成功案例以上下文学习的方式提升了当前任务的执行效果。4. 进阶实现LoRA微调让能力固化上下文学习虽然灵活但能力无法沉淀。接下来我们实现进阶环节定期用积累的经验数据通过LoRA微调底层LLM让优秀的策略“长”在模型里。4.1 准备微调数据集我们需要从经验库中筛选出高质量的成功轨迹并将其转换为模型训练所需的对话格式。import json from datasets import Dataset def prepare_lora_dataset(experience_ids: List[str]): 将经验数据转换为指令微调格式 data [] for exp_id in experience_ids: exp load_experience_by_id(exp_id) if not exp.success: # 只使用成功经验 continue # 将轨迹转换为“用户-助手”对话轮次 messages [] messages.append({role: user, content: exp.task}) # 将Agent的思考与行动合并为助手的回复 assistant_response for step in exp.trajectory: if llm_input in step: # 这里可以简化只保留关键决策或保留完整思考链 assistant_response f思考{step[llm_input]}\n if tool_name in step: assistant_response f行动{step[tool_name]}(输入{step[tool_input]})\n assistant_response f观察{step[tool_output]}\n assistant_response f\n最终答案{exp.final_output} messages.append({role: assistant, content: assistant_response}) data.append({messages: messages}) return Dataset.from_list(data) # 假设我们从经验库中选取了100条高质量成功经验 dataset prepare_lora_dataset(top_100_exp_ids) dataset.save_to_disk(./lora_training_data)4.2 使用LLaMA-Factory进行LoRA微调LLaMA-Factory是一个功能强大且易于使用的大模型微调框架支持多种PEFT方法包括LoRA。我们用它来简化训练流程。首先准备配置文件lora_config.yamlmodel_name_or_path: Qwen/Qwen2.5-7B-Instruct # 基座模型 dataset_path: ./lora_training_data output_dir: ./output/qwen_lora_agent # LoRA配置 lora_rank: 16 lora_alpha: 32 lora_dropout: 0.05 target_modules: [q_proj, k_proj, v_proj, o_proj] # 通常注意力层是主要目标 # 训练参数 per_device_train_batch_size: 4 gradient_accumulation_steps: 4 num_train_epochs: 3 learning_rate: 2e-4 fp16: true然后使用LLaMA-Factory的命令行工具启动训练# 假设你已安装llama-factory llamafactory-cli train \ --stage sft \ --do_train \ --model_name_or_path Qwen/Qwen2.5-7B-Instruct \ --dataset ./lora_training_data \ --template qwen \ --finetuning_type lora \ --lora_rank 16 \ --output_dir ./output/qwen_lora_agent \ --per_device_train_batch_size 4 \ --gradient_accumulation_steps 4 \ --num_train_epochs 3 \ --learning_rate 2e-4 \ --save_steps 500 \ --logging_steps 50训练完成后会在./output/qwen_lora_agent目录下生成适配器权重如adapter_model.safetensors。这个适配器文件体积很小通常只有几十MB包含了从经验中学到的特定策略。4.3 加载并使用微调后的模型在Agent系统中我们可以轻松加载这个LoRA适配器与基础模型结合形成一个“更聪明”的新LLM。from langchain_openai import ChatOpenAI from peft import PeftModel from transformers import AutoModelForCausalLM, AutoTokenizer import torch def load_lora_enhanced_llm(base_model_path: str, lora_adapter_path: str): 加载基础模型并合并LoRA权重 # 加载基础模型和分词器 tokenizer AutoTokenizer.from_pretrained(base_model_path, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained( base_model_path, torch_dtypetorch.float16, device_mapauto, trust_remote_codeTrue ) # 加载LoRA适配器并合并 model PeftModel.from_pretrained(model, lora_adapter_path) model model.merge_and_unload() # 合并适配器到基础模型 # 此处需要将模型包装成LangChain兼容的LLM对象 # 以下为示意实际需根据模型类型使用HuggingFacePipeline等 # llm HuggingFacePipeline(pipeline...) return llm # 在创建Agent时使用微调后的LLM tuned_llm load_lora_enhanced_llm( base_model_pathQwen/Qwen2.5-7B-Instruct, lora_adapter_path./output/qwen_lora_agent ) # 然后用 tuned_llm 替换掉之前创建Agent时的 ChatOpenAI现在你的Agent底层已经是一个吸收了历史经验精华的“老手”模型了。它对于训练过的任务模式会表现出更精准的判断和更高效的工具调用序列。5. 避坑指南与效能优化在实际开发和运维中我踩过不少坑也总结了一些优化点希望能帮你少走弯路。5.1 经验库的质量是天花板坑1只存成功不存失败。失败的经验特别是那些“差点成功”或“典型错误”对于学习避免重复踩坑至关重要。建议存储所有轨迹并打好成功/失败标签。坑2经验数据噪声大。如果Agent本身就不稳定产生的经验质量会很低用这些数据去检索或微调只会“垃圾进垃圾出”。解决方案是引入经验过滤与评分机制。可以训练一个简单的分类器或设计规则如最终结果是否包含目标关键词、工具调用链是否合理、用户是否给出正面反馈对经验进行自动打分低分经验不进入检索池或训练集。优化1经验片段化与索引。不要总是把整个长对话作为一个经验单元存储。可以将一个长任务分解为多个子目标或将对话按主题/工具调用拆分成更小的、可复用的“经验片段”。这样检索时更精准。优化2多维度元数据索引。除了任务描述的语义向量为经验添加工具使用情况、任务类型、耗时等标签并建立倒排索引。这样可以实现混合检索例如“查找所有使用了plot_line_chart工具且成功的经验”。5.2 检索的精准与效率平衡坑3检索到不相关的经验导致误导。语义相似不代表任务逻辑相似。加强重排序环节。可以用一个更小的、专门针对你领域任务微调过的交叉编码器模型如MiniLM对召回结果进行精排计算query与每个候选经验的精细匹配分数。坑4检索延迟影响Agent响应速度。向量检索虽然是毫秒级但如果经验库极大或者需要复杂的重排序延迟可能不可接受。解决方案分层检索先用关键词快速过滤一波再用向量检索。缓存对常见或相似的任务查询结果进行缓存。预计算对于固定的工具组合或任务模板可以预计算其对应的“标准操作流程”经验直接匹配无需实时检索。5.3 LoRA微调的实践要点坑5直接用原始轨迹文本微调效果差。原始轨迹包含大量工具返回的具体数据如数字、字符串这些是噪声。需要对训练数据进行清洗和格式化保留核心的决策逻辑思考链、工具选择理由而将具体数据参数化或泛化。例如将“查询2023年Q4数据”泛化为“查询[时间范围]数据”。坑6灾难性遗忘。用新数据微调后模型可能会忘记旧能力。采用持续学习策略每次微调时不仅用新的经验数据也混合一部分旧的、通用的高质量数据或基础指令遵循数据一起训练。优化3LoRA目标模块选择。对于全连接层较少的模型如一些新架构除了注意力层的q_proj, k_proj, v_proj, o_proj也可以尝试将MLP层的gate_proj, up_proj, down_proj加入target_modules有时能带来更好的效果。优化4动态适配器加载。如果针对不同的任务类型积累了不同的经验集可以训练多个LoRA适配器。在运行时根据当前任务的类型动态加载对应的适配器实现更精细化的能力调配。5.4 系统监控与评估上线后必须建立监控体系经验积累速率与质量每天成功/失败经验的数量和比例。检索命中率与效用检索到的经验被Agent采纳并最终导向成功的比例。微调效果评估在保留的测试任务集上对比微调前后Agent的任务成功率和平均完成步骤效率。一个简单的A/B测试框架非常必要。构建一个真正能“从经验中学习”的Agent系统是一个数据、算法、工程三者紧密结合的持续迭代过程。它不是一个一蹴而就的项目而更像一个需要精心培育和喂养的“数字生命”。从简单的检索增强提示开始逐步积累数据迭代模型你会发现你的Agent真的在变得越来越聪明和可靠。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号