构建LLM智能体知识公地:实现经验继承与错误共享的协作框架

📅 2026/8/18 11:01:14
构建LLM智能体知识公地:实现经验继承与错误共享的协作框架
在探索大语言模型LLM驱动的智能体Agent时一个核心挑战在于如何让智能体不仅执行单次任务还能像人类团队一样通过协作、经验传承和试错来持续学习和进化。传统的智能体设计往往侧重于单次交互的准确性和即时反馈而忽略了知识、策略乃至失败教训在多个智能体之间或同一智能体不同生命周期内的积累与复用。这导致了大量重复劳动和“智能孤岛”现象每个智能体都需要从零开始学习无法有效利用历史经验来避免已知的错误或优化已知的成功路径。“The Commons”这一概念正是为了解决上述问题而提出的实验性框架。它旨在构建一个共享的“知识公地”使得LLM智能体能够继承、贡献和修正彼此的知识与错误。这不仅仅是简单的记忆存储更涉及如何结构化地表示经验包括成功策略和失败案例如何设计有效的检索与推理机制以及如何让智能体在面临新任务时能够主动查询、评估并应用这些“公共遗产”。对于从事智能体开发、多智能体系统研究或希望构建具备长期学习和协作能力的AI应用的开发者而言理解并实践这一理念至关重要。本文将深入探讨如何构建一个支持知识继承与错误共享的LLM智能体系统。我们将从核心概念入手解释“知识公地”的构成要素然后通过一个具体的实验项目展示如何设计数据结构、实现经验存储与检索、集成到智能体决策循环中并最终验证其效果。整个过程将涵盖环境准备、核心代码实现、运行验证以及在实际开发中可能遇到的典型问题与解决方案。1. 理解“知识公地”智能体协作与进化的基石在深入代码之前我们必须清晰地定义“The Commons”所包含的几个关键要素什么是可继承的“知识”什么是值得共享的“错误”以及它们如何被表示和利用。1.1 知识的类型与表示对于LLM智能体知识远不止于静态的事实数据库。它更接近于一种“情境化经验”通常包含以下几个维度任务描述与上下文智能体执行了什么样的任务输入是什么环境状态如何执行策略与推理链智能体是如何思考并一步步解决这个任务的这包括其内部提示Prompt、调用的工具Tools、生成的中间步骤Chain-of-Thought以及最终采取的行动序列。结果与反馈行动导致了什么结果是成功还是失败如果成功产出物是什么如果失败具体的错误信息或异常是什么元数据这次经验发生的时间、使用的模型版本、消耗的Token数量、执行时长等。这些数据有助于评估经验的时效性和成本效益。一种常见的表示方式是使用结构化的JSON或向量化嵌入。例如一次经验可以表示为{ experience_id: exp_001, task_type: data_analysis, task_description: 分析给定CSV文件中的销售趋势并生成总结报告。, input_context: { file_path: /data/sales_q1.csv, user_query: 请找出销售额最高的三个产品类别。 }, agent_reasoning: [ 步骤1我需要读取CSV文件并理解其结构。, 步骤2我应该按产品类别分组并计算销售额总和。, 步骤3排序后取前三位并用自然语言描述结果。 ], actions_taken: [ 调用工具read_csv(file_path/data/sales_q1.csv), 调用工具pandas_groupby(data, group_columncategory, agg_columnsales), 生成最终答案 ], outcome: success, output: 销售额最高的三个类别依次是电子产品$150,000、家居用品$120,000、图书$80,000。, error_details: null, metadata: { timestamp: 2023-10-27T10:30:00Z, model_used: gpt-4, total_tokens: 1250, execution_time_seconds: 4.5 } }1.2 错误的定义与价值在智能体的语境中“错误”是具有极高价值的负样本。它不仅仅是程序抛出的异常更包括策略错误选择了低效或完全错误的解决路径。工具使用错误错误地调用了工具或传递了错误的参数。理解错误误解了用户意图或任务描述。外部依赖错误因API失效、文件不存在等外部原因导致的失败。共享错误的价值在于它能帮助其他智能体在未来遇到相似情境时快速识别“雷区”避免重蹈覆辙。在存储时错误经验需要更详细地记录错误堆栈、当时的系统状态以及事后分析的可能根因。1.3 “公地”的架构存储、检索与更新机制“公地”本身是一个服务或模块它需要提供以下核心功能存储以结构化的方式持久化经验知识和错误。索引为经验建立高效的索引通常基于任务类型、描述、关键实体等进行向量化以便相似度检索。检索给定一个新任务能够快速从公地中查找出最相关的历史经验包括正面的和负面的。贡献智能体在完成任务后有能力将其经验无论成败提交到公地。评估与净化并非所有经验都值得保留。公地可能需要引入评估机制如基于成功率的过滤、人工审核、或LLM自我评估来维护知识库的质量防止垃圾或过时信息污染。2. 环境准备与项目结构我们将使用Python来构建一个最小化的“知识公地”实验系统。这个系统将包含一个简单的经验存储后端、一个基于向量数据库的检索模块以及一个集成此功能的LLM智能体。2.1 核心依赖与工具选型LLM框架我们选择LangChain因为它提供了成熟的Agent、Tool和Memory抽象易于扩展。向量数据库与嵌入为了进行语义检索我们使用ChromaDB轻量级易于集成和OpenAI的text-embedding-ada-002模型来生成向量。你也可以替换为其他开源嵌入模型如all-MiniLM-L6-v2和向量库如FAISS。经验存储为了简化我们使用本地JSON文件作为持久化存储。生产环境应考虑使用SQL/NoSQL数据库。开发环境Python 3.9。创建项目目录并安装依赖# 创建项目目录 mkdir llm-commons-experiment cd llm-commons-experiment # 创建虚拟环境可选但推荐 python -m venv venv source venv/bin/activate # Linux/macOS # venv\Scripts\activate # Windows # 安装核心依赖 pip install langchain langchain-openai chromadb tiktoken # 如果需要使用本地嵌入模型例如 sentence-transformers # pip install sentence-transformers2.2 项目结构设计一个清晰的项目结构有助于管理复杂度llm-commons-experiment/ ├── commons/ # 知识公地核心模块 │ ├── __init__.py │ ├── storage.py # 经验存储与加载JSON文件操作 │ ├── retriever.py # 向量检索器负责查找相关经验 │ └── contributer.py # 经验提交与格式化 ├── agent/ # 智能体模块 │ ├── __init__.py │ ├── base_agent.py # 集成公地检索功能的基础智能体 │ └── tools.py # 智能体可用的工具定义 ├── data/ # 数据目录 │ ├── experiences.json # 存储经验的JSON文件 │ └── chroma_db/ # ChromaDB向量数据库持久化目录 ├── config.py # 配置文件API密钥等 ├── main.py # 主程序入口 └── requirements.txt # 依赖列表3. 实现“知识公地”核心模块我们将逐步实现公地的三个核心组件存储、检索和贡献。3.1 经验存储commons/storage.py这个模块负责将经验对象读写到本地JSON文件。它提供了基本的增、查、全量加载功能。# commons/storage.py import json import os from typing import List, Dict, Any, Optional from datetime import datetime import uuid class ExperienceStorage: def __init__(self, file_path: str data/experiences.json): self.file_path file_path # 确保数据目录存在 os.makedirs(os.path.dirname(file_path), exist_okTrue) # 如果文件不存在则初始化为空列表 if not os.path.exists(self.file_path): with open(self.file_path, w) as f: json.dump([], f) def _load_all(self) - List[Dict[str, Any]]: 加载所有经验记录 with open(self.file_path, r) as f: return json.load(f) def _save_all(self, experiences: List[Dict[str, Any]]) - None: 保存所有经验记录 with open(self.file_path, w) as f: json.dump(experiences, f, indent2, ensure_asciiFalse) def add_experience(self, experience: Dict[str, Any]) - str: 添加一条新经验并返回其ID experiences self._load_all() # 生成唯一ID并添加时间戳 exp_id fexp_{uuid.uuid4().hex[:8]} experience[experience_id] exp_id experience[metadata][timestamp] datetime.utcnow().isoformat() Z experiences.append(experience) self._save_all(experiences) return exp_id def get_experience(self, exp_id: str) - Optional[Dict[str, Any]]: 根据ID获取单条经验 experiences self._load_all() for exp in experiences: if exp.get(experience_id) exp_id: return exp return None def get_all_experiences(self) - List[Dict[str, Any]]: 获取所有经验 return self._load_all()3.2 向量检索器commons/retriever.py这是公地的“大脑”负责将经验文本转换为向量并支持语义搜索。我们使用LangChain的集成工具来简化流程。# commons/retriever.py from langchain.vectorstores import Chroma from langchain.embeddings import OpenAIEmbeddings # 如果使用开源嵌入模型 # from langchain.embeddings import HuggingFaceEmbeddings from langchain.schema import Document from typing import List, Dict, Any import os class CommonsRetriever: def __init__(self, persist_directory: str data/chroma_db): self.persist_directory persist_directory # 初始化嵌入模型 - 使用OpenAI # 请确保在config.py或环境变量中设置了OPENAI_API_KEY self.embedding OpenAIEmbeddings(modeltext-embedding-ada-002) # 开源模型示例 # self.embedding HuggingFaceEmbeddings(model_nameall-MiniLM-L6-v2) # 加载或创建向量数据库 if os.path.exists(self.persist_directory) and os.listdir(self.persist_directory): self.vectorstore Chroma( persist_directoryself.persist_directory, embedding_functionself.embedding ) else: # 初始化为空数据库 self.vectorstore Chroma.from_documents( documents[], # 初始为空文档列表 embeddingself.embedding, persist_directoryself.persist_directory ) def _experience_to_document(self, exp: Dict[str, Any]) - Document: 将经验字典转换为LangChain的Document对象用于向量化 # 构建检索文本结合任务描述、推理过程和结果 content_parts [] content_parts.append(f任务类型: {exp.get(task_type, N/A)}) content_parts.append(f任务描述: {exp.get(task_description, )}) if exp.get(agent_reasoning): content_parts.append(f推理过程: { .join(exp[agent_reasoning])}) content_parts.append(f结果: {exp.get(outcome, N/A)}) if exp.get(error_details): content_parts.append(f错误详情: {exp.get(error_details)}) content \n.join(content_parts) # 将经验ID和结果作为元数据存储便于后续引用 metadata { experience_id: exp.get(experience_id), outcome: exp.get(outcome), task_type: exp.get(task_type), } return Document(page_contentcontent, metadatametadata) def add_experience(self, experience: Dict[str, Any]) - None: 向向量数据库添加一条经验 doc self._experience_to_document(experience) self.vectorstore.add_documents([doc]) def retrieve_similar(self, query: str, k: int 3, filter_outcome: str None) - List[Dict]: 检索与查询最相似的k条经验。 filter_outcome: 可选用于过滤结果如只检索success或error的经验。 # 构建检索过滤器 filter_dict None if filter_outcome: filter_dict {outcome: filter_outcome} docs self.vectorstore.similarity_search(query, kk, filterfilter_dict) results [] for doc in docs: results.append({ content: doc.page_content, metadata: doc.metadata, score: doc.metadata.get(score, 0) # 某些检索器会返回相似度分数 }) return results def retrieve_relevant_for_task(self, task_description: str, include_errors: bool True) - List[Dict]: 为给定任务检索相关经验。 默认同时检索成功和失败的经验因为错误经验同样有价值。 # 可以设计更复杂的查询例如强调任务类型 query f任务: {task_description} retrieved self.retrieve_similar(query, k5) # 检索5条最相关的 # 简单后处理如果不需要错误经验可以过滤掉 if not include_errors: retrieved [r for r in retrieved if r[metadata].get(outcome) ! error] return retrieved3.3 经验贡献者commons/contributer.py这个模块定义了如何将智能体的执行过程标准化为一条可存储的经验。# commons/contributer.py from typing import List, Dict, Any from .storage import ExperienceStorage from .retriever import CommonsRetriever class ExperienceContributor: def __init__(self, storage: ExperienceStorage, retriever: CommonsRetriever): self.storage storage self.retriever retriever def format_experience( self, task_type: str, task_description: str, input_context: Dict[str, Any], agent_reasoning: List[str], actions_taken: List[str], outcome: str, # success or error output: Any None, error_details: str None, metadata: Dict[str, Any] None ) - Dict[str, Any]: 将智能体执行过程格式化为标准经验字典 if metadata is None: metadata {} # 补充基础元数据 default_metadata { model_used: gpt-3.5-turbo, # 应从实际调用中获取 total_tokens: 0, execution_time_seconds: 0, } default_metadata.update(metadata) experience { task_type: task_type, task_description: task_description, input_context: input_context, agent_reasoning: agent_reasoning, actions_taken: actions_taken, outcome: outcome, output: output, error_details: error_details, metadata: default_metadata } return experience def submit_experience(self, experience: Dict[str, Any]) - str: 提交经验到公地先存到JSON再索引到向量库 # 1. 存储到持久化文件 exp_id self.storage.add_experience(experience) # 2. 索引到向量数据库以便检索 self.retriever.add_experience(experience) print(f[Commons] 经验已提交ID: {exp_id}) return exp_id4. 构建集成“公地”的LLM智能体现在我们将创建一个能够查询和利用“知识公地”的智能体。这个智能体在执行新任务前会先查询公地中是否有相关经验并将这些经验作为上下文信息融入其决策过程。4.1 定义智能体工具agent/tools.py首先定义一些智能体可以使用的简单工具。例如一个计算器和文件阅读器。# agent/tools.py from langchain.tools import tool import pandas as pd import json tool def calculate(expression: str) - str: 计算一个数学表达式。例如calculate(2 3 * 4) try: # 警告使用eval存在安全风险仅用于演示。生产环境应用安全评估或专用库。 result eval(expression, {__builtins__: {}}, {}) return f计算结果: {result} except Exception as e: return f计算错误: {e} tool def read_csv_summary(file_path: str) - str: 读取CSV文件并返回其基本摘要行数、列名、前几行。 try: df pd.read_csv(file_path) summary { rows: len(df), columns: list(df.columns), sample: df.head(3).to_dict(orientrecords) } return json.dumps(summary, ensure_asciiFalse, indent2) except Exception as e: return f读取文件错误: {e}4.2 基础智能体与公地集成agent/base_agent.py这是核心部分。我们创建一个智能体它在执行前会先检索公地并将检索到的经验作为系统提示的一部分。# agent/base_agent.py from langchain.agents import AgentExecutor, create_openai_tools_agent from langchain_openai import ChatOpenAI from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain.memory import ConversationBufferMemory from typing import List, Dict, Any import sys import os sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from commons.retriever import CommonsRetriever from commons.contributer import ExperienceContributor from commons.storage import ExperienceStorage class CommonsAwareAgent: def __init__(self, tools, retriever: CommonsRetriever, contributor: ExperienceContributor): self.retriever retriever self.contributor contributor self.tools tools self.llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # 使用gpt-3.5-turbo以控制成本 # 构建一个包含“公地经验”上下文的提示模板 self.prompt ChatPromptTemplate.from_messages([ (system, 你是一个善于从历史经验中学习的AI助手。在开始回答用户问题前你会先查看“知识公地”中是否有类似任务的完成记录包括成功的经验和失败的教训。 以下是来自知识公地的相关历史经验 {commons_context} 请仔细参考这些经验。如果看到成功的做法可以借鉴如果看到错误请务必避免。 现在请开始处理当前任务。你可以使用以下工具{tools}。请逐步思考并在最终答案前用“最终答案”开头。), MessagesPlaceholder(variable_namechat_history), (human, {input}), MessagesPlaceholder(variable_nameagent_scratchpad), ]) # 使用对话记忆让智能体能在多轮对话中保持上下文 self.memory ConversationBufferMemory(memory_keychat_history, return_messagesTrue) # 创建智能体 agent create_openai_tools_agent(self.llm, self.tools, self.prompt) self.agent_executor AgentExecutor(agentagent, toolsself.tools, memoryself.memory, verboseTrue) def _build_commons_context(self, task_description: str) - str: 根据任务描述从公地检索相关经验并格式化为提示文本 relevant_exps self.retriever.retrieve_relevant_for_task(task_description, include_errorsTrue) if not relevant_exps: return 知识公地中暂无与此任务直接相关的历史经验。请依靠你自己的知识完成任务。 context_parts [ 相关历史经验 ] for i, exp in enumerate(relevant_exps, 1): meta exp[metadata] context_parts.append(f\n经验 #{i} [ID: {meta.get(experience_id)}, 结果: {meta.get(outcome)}]) context_parts.append(exp[content]) # 这里包含了任务描述、推理和结果 context_parts.append(- * 40) return \n.join(context_parts) def run(self, task_input: str, task_type: str general) - Dict[str, Any]: 执行任务并自动记录经验到公地 # 阶段1检索相关经验 commons_context self._build_commons_context(task_input) print(f\n[Agent] 检索到 {len(commons_context.split(经验 #))-1 if 经验 # in commons_context else 0} 条相关历史经验。) # 阶段2准备执行并记录推理过程简化版实际需拦截中间步骤 # 注意为了捕获完整的agent_reasoning和actions_taken需要更精细地Hook LangChain的执行过程。 # 此处为演示我们假设一个简化的执行流程。 agent_reasoning_log [] actions_taken_log [] # 这里是一个简化示例实际中你需要自定义Callback或继承AgentExecutor来捕获中间步骤 def custom_callback(step_output): # 这是一个概念性函数实际实现需参考LangChain的Callback机制 agent_reasoning_log.append(step_output.get(thought, )) if action in step_output: actions_taken_log.append(f调用工具: {step_output[action]}) # 由于完整拦截较复杂我们先运行智能体获取结果 try: # 将公地上下文注入到输入中通过格式化提示词 # 我们需要重新初始化一个临时agent将commons_context传入system message prompt_with_context self.prompt.format_messages( commons_contextcommons_context, toolsself.tools, chat_historyself.memory.chat_memory.messages, inputtask_input, agent_scratchpad[] # 初始为空 ) # 简化执行直接调用LLM非Agent流程来演示。实际项目应使用自定义的AgentExecutor。 from langchain.schema import HumanMessage, SystemMessage messages [ SystemMessage(contentprompt_with_context[0].content), *self.memory.chat_memory.messages, HumanMessage(contenttask_input) ] raw_response self.llm.invoke(messages) final_output raw_response.content outcome success error_details None except Exception as e: final_output str(e) outcome error error_details final_output agent_reasoning_log.append(f执行过程中发生异常: {e}) # 阶段3格式化并提交经验简化了推理和行动日志 experience self.contributor.format_experience( task_typetask_type, task_descriptiontask_input, input_context{query: task_input}, agent_reasoningagent_reasoning_log or [直接生成回答。], # 示例 actions_takenactions_taken_log or [无工具调用], # 示例 outcomeoutcome, outputfinal_output, error_detailserror_details, metadata{model_used: gpt-3.5-turbo} ) exp_id self.contributor.submit_experience(experience) # 返回结果和经验ID return { task: task_input, output: final_output, outcome: outcome, experience_id: exp_id, retrieved_context: commons_context[:500] ... if len(commons_context) 500 else commons_context # 截取部分显示 }5. 运行验证与效果演示现在我们将整个系统串联起来通过一个主程序来演示其工作流程。5.1 配置文件与环境变量config.py# config.py import os from dotenv import load_dotenv load_dotenv() # 从 .env 文件加载环境变量 # OpenAI API 配置 OPENAI_API_KEY os.getenv(OPENAI_API_KEY) if not OPENAI_API_KEY: print(警告: OPENAI_API_KEY 未设置。请创建 .env 文件并添加 OPENAI_API_KEYyour_key)创建.env文件OPENAI_API_KEYsk-your-openai-api-key-here5.2 主程序与演示main.py# main.py from commons.storage import ExperienceStorage from commons.retriever import CommonsRetriever from commons.contributer import ExperienceContributor from agent.tools import calculate, read_csv_summary from agent.base_agent import CommonsAwareAgent def main(): print( 初始化知识公地系统 ) # 1. 初始化公地组件 storage ExperienceStorage(data/experiences.json) retriever CommonsRetriever(data/chroma_db) contributor ExperienceContributor(storage, retriever) # 2. 准备工具列表 tools [calculate, read_csv_summary] # 3. 创建集成公地的智能体 agent CommonsAwareAgent(tools, retriever, contributor) print(\n 演示1首次执行任务公地为空) result1 agent.run(计算一下 (15 27) * 3 等于多少, task_typecalculation) print(f智能体回答: {result1[output]}) print(f经验已记录ID: {result1[experience_id]}) print(\n 演示2执行一个可能失败的任务 ) # 假设我们有一个不存在的文件 result2 agent.run(请读取并总结文件 nonexistent.csv 的内容。, task_typefile_operation) print(f智能体回答: {result2[output]}) print(f结果状态: {result2[outcome]}) print(f错误经验已记录ID: {result2[experience_id]}) print(\n 演示3再次执行相似任务公地中已有经验) # 再次询问计算问题此时公地中已有成功经验 result3 agent.run(请计算 100 除以 4 再加 5。, task_typecalculation) print(f智能体回答: {result3[output]}) print(f本次执行前检索到的历史经验摘要:\n{result3[retrieved_context]}) print(\n 演示4尝试另一个文件操作公地中已有失败经验) # 询问另一个不存在的文件期望智能体能从历史错误中学习可能直接提示文件不存在或更谨慎 result4 agent.run(分析一下 missing_data.xlsx 文件。, task_typefile_operation) print(f智能体回答: {result4[output]}) # 观察其回答是否提及了之前文件不存在的错误经验。 print(\n 查看公地中所有积累的经验 ) all_exps storage.get_all_experiences() print(f公地中总经验数: {len(all_exps)}) for exp in all_exps: print(f- ID: {exp[experience_id]}, 任务: {exp[task_description][:50]}..., 结果: {exp[outcome]}) if __name__ __main__: main()运行程序python main.py5.3 预期输出与分析运行上述程序你可能会看到类似以下的输出 初始化知识公地系统 演示1首次执行任务公地为空 [Agent] 检索到 0 条相关历史经验。 [Commons] 经验已提交ID: exp_a1b2c3d4 智能体回答: 最终答案: (15 27) * 3 126。 经验已记录ID: exp_a1b2c3d4 演示2执行一个可能失败的任务 [Agent] 检索到 1 条相关历史经验。 (这里检索到了演示1的成功计算经验但任务类型不同相关性可能低) [Commons] 经验已提交ID: exp_e5f6g7h8 智能体回答: 最终答案: 读取文件错误: [Errno 2] No such file or directory: nonexistent.csv 结果状态: error 错误经验已记录ID: exp_e5f6g7h8 演示3再次执行相似任务公地中已有经验 [Agent] 检索到 2 条相关历史经验。 相关历史经验 经验 #1 [ID: exp_a1b2c3d4, 结果: success] 任务类型: calculation 任务描述: 计算一下 (15 27) * 3 等于多少 推理过程: 直接生成回答。 结果: success ---------------------------------------- 经验 #2 [ID: exp_e5f6g7h8, 结果: error] 任务类型: file_operation 任务描述: 请读取并总结文件 nonexistent.csv 的内容。 推理过程: 直接生成回答。 结果: error 错误详情: 读取文件错误: [Errno 2] No such file or directory: nonexistent.csv ---------------------------------------- 智能体回答: 最终答案: 100 除以 4 等于 25再加 5 等于 30。 本次执行前检索到的历史经验摘要: 相关历史经验 经验 #1 [ID: exp_a1b2c3d4, 结果: success]... 演示4尝试另一个文件操作公地中已有失败经验 [Agent] 检索到 2 条相关历史经验。 (此时会检索到之前的文件操作错误经验) 智能体回答: 最终答案: 根据历史经验操作文件时需先确认文件是否存在。文件 missing_data.xlsx 可能不存在请检查路径。如果需要我可以先尝试列出目录或检查文件路径。关键观察点首次执行公地为空智能体正常执行并记录成功经验。首次错误执行失败一条详细的错误经验被记录到公地。后续相似任务智能体在执行前会检索公地。对于计算任务它看到了之前的成功经验尽管可能不直接借鉴步骤。对于文件操作任务它看到了之前的错误经验并在回答中体现出了“学习”效果——它可能不会直接调用read_csv_summary工具而是先给出一个基于历史错误的警告或建议。6. 常见问题、排查与进阶优化在实际部署和扩展此系统时你会遇到一系列挑战。以下是常见问题及解决思路。6.1 常见问题排查表问题现象可能原因检查方式处理建议向量检索返回无关经验1. 嵌入模型不适合领域。2. 经验文本格式化不佳关键信息未突出。3. 检索参数k太大或太小。1. 检查_experience_to_document函数生成的文本。2. 手动测试嵌入模型对相似句子的向量距离。3. 调整检索的相似度阈值或k值。1. 尝试不同的嵌入模型如text-embedding-3-small。2. 优化经验文本格式将任务类型、关键实体放在前面。3. 引入元数据过滤如按task_type先过滤。智能体未有效利用历史经验1. 检索到的经验未正确注入提示词。2. 提示词模板设计不佳智能体忽略上下文。3. 经验数量太多导致上下文过长模型无法处理。1. 打印commons_context确认内容是否正确。2. 观察智能体的完整思考链开启verbose模式。3. 检查最终Prompt的Token长度。1. 强化系统提示要求智能体“必须参考”历史经验。2. 对检索结果进行总结或提炼而非直接拼接全文。3. 使用更长的上下文模型或采用Map-Reduce方式处理多经验。经验存储文件损坏或格式错误并发写入导致JSON格式错误。检查data/experiences.json文件是否能被json.load正确读取。1. 为存储操作加锁如使用fasteners库。2. 改用数据库如SQLite替代JSON文件。ChromaDB 加载失败或检索慢1. 向量数据库目录权限问题。2. 经验数量增长后检索性能下降。1. 检查data/chroma_db目录是否存在且可写。2. 监控检索耗时。1. 确保应用有目录的读写权限。2. 考虑对向量数据库进行分片或使用性能更高的索引如HNSW。3. 定期清理或归档旧经验。智能体执行过程无法被完整记录LangChain Agent的中间步骤推理、工具调用默认不直接暴露。查看LangChain Agent执行后的intermediate_steps输出。实现一个自定义的AgentExecutor或使用Callbacks来拦截和记录每一步的agent_scratchpad内容。6.2 生产环境最佳实践上述示例是一个简化原型。要用于生产或严肃实验需要考虑以下方面经验质量评估与过滤自动过滤引入一个评估环节例如用另一个LLM判断一条经验是否具有普遍性、是否包含敏感信息、是否已过时。奖励机制为成功解决复杂任务或提供优质避坑指南的经验设置更高权重在检索时优先返回。版本控制当工具、API或环境发生变化时旧经验可能失效。需要为经验添加版本标签或建立定期失效机制。更精细的经验表示与检索多向量索引将一条经验的不同部分任务描述、推理过程、错误信息分别向量化支持更细粒度的检索。混合检索结合语义检索向量和关键词检索如BM25提高召回率。图结构如果经验之间存在逻辑关联如任务A是任务B的子任务可以使用图数据库来存储关系支持基于图的推理。智能体集成模式的优化反思与提炼智能体在提交经验前可以增加一个“反思”步骤用LLM总结本次任务的核心教训和可复用模式只存储提炼后的精华。主动查询与被动推送除了任务开始时查询智能体在遇到困难或不确定时也可以主动向公地发起多次查询。多智能体协作设计一个“评审者”智能体负责评估和整合其他智能体提交的经验维护公地的质量。系统性能与可观测性异步提交经验提交不应阻塞主任务流程应采用异步队列处理。监控与日志记录检索命中率、经验贡献频率、经验利用率等指标评估公地的价值。备份与恢复定期备份向量数据库和原始经验存储。6.3 扩展方向错误归因与模式挖掘对公地中的错误经验进行聚类分析找出高频错误模式并自动生成“避坑指南”或修复建议。模拟环境与压力测试构建一个任务模拟环境让大量智能体在其中交互加速经验的生成和进化观察“集体智慧”的涌现。跨模型知识迁移探索将基于GPT-4生成的高质量经验迁移指导GPT-3.5或开源模型智能体的可能性。与外部知识库集成将公地与Confluence、GitHub Issues、Stack Overflow等外部知识源连接起来丰富知识的来源。构建一个有效的“知识公地”是一个持续迭代的过程。核心在于设计出能够准确捕获价值经验、高效检索相关上下文、并促使智能体有效利用这些上下文的机制。通过本文提供的框架和实验你可以在此基础上进行定制和扩展探索智能体间知识继承与协作的更多可能性。