热血江湖归来职业推荐 热血江湖归来职业选哪个好
2026-07-10 3391735
2026-07-10 0
大语言模型存在输入上下文 token 限制、不具备记忆能力等问题。而记忆能力是把 LLM 从简单的问答工具变成真正协作伙伴的关键。一个只能"回答当前问题",另一个能"基于历史经验做决策",这就是增加了记忆能力后的改进。
在智能体的记忆中长期记忆尤为重要。长期记忆的核心价值是存储可复用的历史经验(如成功案例、用户反馈、规则迭代记录等),并支持通过语义相似性检索快速匹配当前任务场景,辅助决策。
向量数据库(如 Milvus、FAISS、Qdrant等)因其能高效存储和检索高维向量的特性,成为长期记忆的理想载体,同时向量数据库还有助于解决大模型幻觉问题。
向量数据库的核心是把文本转换为向量,然后存储在向量数据库中,并提供向量相似性检索。
举个例子,当用户需要大模型根据提供的文档回答问题时,大模型先将文档的文本信息转化为向量存储到向量数据库中,当后续用户提问相关问题时,大模型将用户提出的问题转化为向量,在向量数据库中搜索出最相似的上下文向量,再返回给大模型。
这种信息处理方式不仅能大幅减少LLM的计算量,提高响应速度,更重要的是能降低成本,并避开LLM的 tokens 限制。如果文档手册的大小是1GB甚至更大,由于LLM的上下文窗口限制,如果直接把整个文档手册喂给LLM,会撑爆Token上限导致报错。而有了向量数据库,我们会
这样不仅永远不会超出 Token 限制,还能让LLM处理海量的知识库。
传统数据库一般通过不同的索引方式(如B Tree、倒排索引)和关键词匹配等方法实现,只能搜索到和词语本身匹配程度最高的内容,而不能搜索到和词语语义匹配的内容,本质上基于文本精确匹配,语义搜索功能较弱。
词嵌入技术可以使用模型提取不同关键词的特征,得到特征向量,不同向量之间可通过内积或余弦判断其相似关系,这样就可以使用特征向量进行语义搜索。
常见的向量相似性的度量方法有三种:
当前主流算法是Hierarchical Navigable Small Word(HNSW)层次化可导航小世界算法。该算法凭借“高维向量下的低延迟、高召回率”成为RAG的首选检索组件。
HNSW 算法具有以下特性:
O(log n)。下面将解析一个具备长期记忆、语义检索、反思学习和目标管理的 AI Agent 工程实现。使用DeepSeek 大模型作为推理核心,SentenceTransformers 本地嵌入模型实现语义记忆,SQLite存储结构化记录,Chroma作为向量数据库。整个系统可离线运行嵌入部分,仅对话需 API,适合轻量级生产环境。
系统由四个核心层组成:
python -m venv agent_vecbase_venvsource agent_vecbase_venv/bin/activate
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
# requirements.txtopenai>=1.0.0chromadb>=0.4.0sentence-transformers>=2.2.0python-dotenv>=1.0.0
# .envLLM_API_KEY="sk-99fdxxxxxxxxxxxxd0c"LLM_MODEL_ID="deepseek-v4-flash"LLM_BASE_URL="https://api.deepseek.com"
下载并解压到工程目录 ./models/all-MiniLM-L6-v2
这样设计主要基于以下考虑:
cosine) 适合归一化后的 SentenceTransformer 向量。def init_sqlite():cur.execute("""CREATE TABLE IF NOT EXISTS memory_events (id INTEGER PRIMARY KEY AUTOINCREMENT, # 唯一标识符agent_name TEXT, # 触发该场景的agent名称timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, # 事件发生时间戳input TEXT, # 用户的原始输入内容output TEXT, # agent生成的原始回复内容summary TEXT, # 由LLM提炼的交互摘要,便于后续检索和理解embedding BLOB # 记忆向量,用于后续的语义相似度检索)""")cur.execute("""CREATE TABLE IF NOT EXISTS goals (id INTEGER PRIMARY KEY AUTOINCREMENT,agent_name TEXT,goal TEXT, # 具体的目标描述文本status TEXT DEFAULT 'in_progress', # 目标当前的状态,默认为“进行中”last_updated DATETIME DEFAULT CURRENT_TIMESTAMP # 目标最后一次更新的时间)""")
memory_events表(情景记忆表):这张表用于记录 AI Agent 与用户每一次交互的历史事件、对话摘要以及语义向量,是实现跨会话连续性和反思能力的基础。goals表(目标跟踪表):这张表用于存储和追踪用户的长期目标或复杂任务状态,使 AI 能够理解任务之间的依赖关系并持续跟进。# path=CHROMA_PATH 指定了本地数据的存储路径。client = chromadb.PersistentClient(path=CHROMA_PATH)2. 获取或创建一个名为 "agent_memories" 的数据集合(Collection)collection = client.get_or_create_collection(# agent长期记忆的专属容器name="agent_memories",# metadata 用于配置集合的底层参数。这里指定了 HNSW 索引算法的距离计算空间为 "cosine"(余弦相似度)。# 在 AI Agent 的记忆检索中,余弦相似度通常比默认的欧氏距离(L2)更适合衡量文本之间的语义相关性。metadata={"hnsw:space": "cosine"})
这段代码具体实现了一个持久化且支持语义相似度检索的向量记忆库。它主要完成了以下三个核心功能:
def get_embedding(text: str) -> List[float]:# normalize_embeddings=True保证向量模长为 1,使余弦相似度计算更精确。embedding = embedding_model.encode(text, normalize_embeddings=True)return embedding.tolist()def llm_complete(prompt: str, max_tokens: int = 500) -> str:response = llm_client.chat.completions.create(model=LLM_MODEL,messages=[{"role": "user", "content": prompt}],max_tokens=max_tokens,temperature=0.2)return response.choices[0].message.content
def log_memory_event(self, agent_name, input_text, output_text):summary = self.generate_summary(input_text, output_text)# 调用LLM生成摘要embedding = get_embedding(summary)# 写入SQLitecur.execute("""INSERT ...""", (...))# 写入Chromaself.collection.add(embeddings=[embedding], documents=[summary], ...)self.interaction_counter += 1
需要注意的是以上存储的summary不是LLM的输出原文,而是LLM的输出大意,后续检索能匹配到语义相关但表述不同的历史。
def recall_related_memories(self, query, top_k=3):query_emb = get_embedding(query)results = self.collection.query(query_embeddings=[query_emb],n_results=top_k,include=["documents"])return results['documents'][0] if results['documents'] else []
top_k条历史摘要。def trigger_reflection(self, agent_name, n_recent=5):# 从SQLite读取最近n条摘要rows = cur.execute("""SELECT summary ... ORDER BY timestamp DESC LIMIT ?""", (agent_name, n_recent)).fetchall()recent_summaries = "n".join([f"- {r[0]}" for r in rows])reflection = llm_complete(f"""You are reviewing... {recent_summaries} Provide 3 takeaways and 1 improvement plan""")# 将反思结果也作为特殊记忆存入SQLite和Chroma...
class GoalManager:def add_goal(agent_name, goal): ...def update_goal(agent_name, goal, status): ...def get_active_goals(agent_name): ...def check_goal_progress(agent_name):# 返回格式化的目标状态文本
check_goal_progress的输出,让 Agent 意识到当前使命,避免回答偏离长期方向。class Agent:def process_input(self, user_input):related = self.memory.recall_related_memories(user_input) # 检索记忆goal_context = GoalManager.check_goal_progress(self.name)# 获取目标system_prompt = f"""... {goal_context} {memory_context} ...""" response = llm_complete(full_prompt)# 生成回答self.memory.log_memory_event(...) # 存储记录if self.memory.interaction_counter % REFLECTION_INTERVAL == 0:self.memory.trigger_reflection(...) # 定时反思return response
以Ubuntu22.04系统,Python3.10版本为例进行展示。
首先我们新建一个项目文件夹 agent_vecbase 来存放我们的所有文件。 agent_vecbase/
├── main_cn.py - 主要游戏逻辑和控制逻辑
├── requirements.txt - 依赖库
├── .env
└── README.md
main.py
输出以上内容说明嵌入模型加载、SQLite 建表、Chroma 初始化均成功。
用户:什么是机器学习?
Agent 返回一段关于机器学习的解释,且无报错。此时交互计数为 1。
用户:它和深度学习有什么关系?
Agent 根据历史记录可以识别到“它”指的是第一轮对话中提到的机器学习。
用户:如何学习 Python?用户:推荐一些算法书籍。用户:哪些书籍适合小白入门?
当对话轮数到第五轮时候,累积5次会触发反思机制,观察到以上输出说明反思机制正常。
退出程序(输入quit)后,用 SQLite 命令行验证数据是否持久化。
memory_events 表sqlite3 agent_memory.db "SELECT id, agent_name, summary FROM memory_events;"
观察到以上用户和agent多轮交互的内容摘要。
goals 表sqlite3 agent_memory.db "SELECT * FROM goals;"
观察到目标数据存在,说明情景记忆存储正常。
创建一个test_agent.py文件,直接调用核心函数进行断言测试:
# 测试agent功能的自动化脚本from main import MemoryManager, GoalManager, init_sqlite, init_chroma, llm_complete, get_embedding# 初始化init_sqlite()chroma_collection = init_chroma()mem_manager = MemoryManager(chroma_collection)# 测试嵌入emb = get_embedding("test")assert isinstance(emb, list) and len(emb) > 0, "嵌入生成失败"# 测试 LLM 调用(确保网络和 Key 有效)resp = llm_complete("Hello, say 'OK'")assert "OK" in resp, f"LLM 响应异常: {resp}"print("LLM 调用成功")# 测试记忆记录与检索mem_manager.log_memory_event("TestAgent", "我喜欢狗", "狗是可爱的动物")mem_manager.log_memory_event("TestAgent", "我喜欢猫", "猫也很可爱")results = mem_manager.recall_related_memories("宠物", top_k=2)assert len(results) == 2print("检索到的摘要:", results)# 测试反思触发(需至少5条记录,可手动插入后再测)for i in range(3):mem_manager.log_memory_event("TestAgent", f"test input {i}", f"test output {i}")mem_manager.trigger_reflection("TestAgent", n_recent=5)print("反思测试通过")# 测试目标管理GoalManager.add_goal("TestAgent", "测试目标")goals = GoalManager.get_active_goals("TestAgent")assert len(goals) > 0print("目标管理正常")
观察到以上测试输出说明基本功能正常。