FEATURED · 精选文章

Wienerdog开源项目:为AI编程助手构建记忆系统,解决上下文丢失问题

发布时间 / 2026/8/22 8:25:56
来源 / 创域科博编辑部
栏目 / 资讯中心
Wienerdog开源项目:为AI编程助手构建记忆系统,解决上下文丢失问题 在开发过程中你是否遇到过这样的困扰与 Claude Code 或 Codex 这类 AI 编程助手对话时它总是“健忘”无法记住之前的项目上下文、你的编码习惯或已讨论过的解决方案每次开启新对话都像是面对一个全新的助手需要重复解释项目背景和需求。这种上下文丢失的问题严重影响了开发效率和深度协作的可能性。今天我们将深入探讨一个名为Wienerdog的开源项目它旨在为 Claude Code/Codex 等 AI 编程工具赋予“记忆”和“自我提升”的能力。本文将为你提供一份从概念理解到实战部署的完整指南无论你是想提升个人开发效率还是探索 AI 辅助编程的边界都能从中获得实用的解决方案。1. 背景与核心概念为什么 AI 编程助手需要“记忆”在深入 Wienerdog 之前我们首先要理解当前 AI 编程助手如 Claude Code, GitHub Copilot, Codex的核心局限。1.1 当前 AI 编程助手的“健忘症”问题大多数 AI 编程助手基于大型语言模型LLM它们本质上是“无状态”的。这意味着上下文窗口有限模型只能处理有限长度的对话历史例如 4K, 8K, 16K tokens。一旦超出最早的信息就会被“遗忘”。会话隔离每次新建一个聊天窗口或重启 IDE 插件模型都无法访问之前会话中的任何信息。缺乏个性化模型无法学习你的个人编码风格、项目特定的架构模式、常用的工具库或已解决的特定 Bug。这导致开发者需要反复提供相同的背景信息例如“这是我们项目的目录结构”、“我们使用的是 React TypeScript”、“之前我们讨论过这个 API 的设计现在要实现前端调用”。这种重复劳动极大地削弱了 AI 助手的潜力。1.2 Wienerdog 是什么Wienerdog是一个开源工具/框架其核心目标是解决上述问题。它通过为 AI 编程助手最初针对 Claude Code/Codex 设计构建一个外部的、可持久化的“记忆系统”并赋予其“技能”自我迭代的能力。我们可以从两个核心功能来理解它记忆MemoryWienerdog 能够存储和检索与特定项目、开发者或任务相关的上下文信息。这包括代码片段、项目文档、对话历史、决策记录等。当 AI 助手需要回答问题时Wienerdog 可以动态地将相关的“记忆”注入到提示词Prompt中从而扩展 AI 的有效上下文。自我提升的技能Self-improving Skills这指的是 Wienerdog 可能具备的一种机制使其能够根据交互反馈如用户对生成代码的采纳、修改或拒绝来优化其未来的行为。例如如果它发现你总是拒绝某种风格的代码它可能会学习并调整在下次生成时采用你更偏好的模式。简单来说Wienerdog 试图将 AI 编程助手从一个“每次对话都失忆的天才临时工”转变为一个“熟悉你和你的项目并能不断进步的专业搭档”。1.3 核心价值与应用场景个人开发者建立个人知识库让 AI 记住你的技术栈偏好、常用工具函数和过往解决问题的思路。团队项目为新成员或 AI 助手快速注入项目背景、架构规范、API 文档和编码约定加速上手和协作。复杂任务分解对于需要多轮对话、跨文件协作的复杂开发任务记忆系统能保持任务状态的连贯性。工作流自动化结合记忆的技能可以创建可复用的自动化脚本或代码生成模板。2. 环境准备与架构概览在动手之前我们需要明确 Wienerdog 的技术栈和运行环境。根据其名称和针对 Claude Code/Codex 的特性我们可以推断其可能的技术构成。2.1 技术栈推测与准备Wienerdog 很可能是一个后端服务结合了向量数据库和 LLM 应用框架。典型的实现可能包含以下组件编程语言Python 是此类 AI 应用的首选因其拥有丰富的 ML/AI 库生态如 LangChain, LlamaIndex。向量数据库用于高效存储和检索“记忆”文本的向量嵌入。常见选择有ChromaDB: 轻量级易于集成。Pinecone: 托管服务适合生产环境。Qdrant/Weaviate: 功能强大的开源选项。PostgreSQL with pgvector: 利用现有数据库生态。嵌入模型用于将文本记忆转换为向量。例如 OpenAI 的text-embedding-ada-002或开源的BGE,all-MiniLM-L6-v2。应用框架可能是基于FastAPI或Flask构建的 Web 服务提供 API 供 Claude Code 插件调用。Claude Code / Codex 集成需要通过插件或配置将 Wienerdog 服务作为“上下文提供者”接入到你的 IDE 中。基础环境准备操作系统Linux (Ubuntu 20.04)、macOS 或 WSL2 (Windows)。Python: 版本 3.8 或以上。包管理工具:pip或conda。代码编辑器: VS Code因其对 Claude Code 插件支持良好。Docker(可选)用于容器化部署。2.2 Wienerdog 可能的工作流程在编写代码前我们先理解其预期的工作流程这有助于后续的配置和开发记忆写入开发者或自动化工具将项目文档、代码片段、对话摘要等内容发送给 Wienerdog API。向量化存储Wienerdog 使用嵌入模型将文本内容转换为向量并存储到向量数据库中。记忆检索当开发者在 IDE 中向 Claude Code 提问时Claude Code 插件会先将问题发送给 Wienerdog。相关性搜索Wienerdog 将问题也转换为向量并在向量数据库中搜索最相关的“记忆”片段。上下文增强Wienerdog 将检索到的相关记忆片段作为附加上下文与用户的原始问题一起发送给 Claude Code/Codex 模型。生成与反馈Claude Code 基于增强后的上下文生成回答。开发者对回答的反馈采纳、编辑可能被记录用于优化未来的检索或技能。3. 核心组件与原理拆解本节我们将模拟构建一个简化版的 Wienerdog 核心系统以深入理解其关键技术点。3.1 记忆存储与检索模块这是 Wienerdog 的核心。其关键在于将非结构化的文本“记忆”转换为机器可理解、可高效查询的形式。# 文件memory_core.py # 一个简化的记忆存储与检索类 import hashlib from typing import List, Dict, Any # 假设使用 sentence-transformers 进行本地嵌入或 OpenAI API from sentence_transformers import SentenceTransformer # 假设使用 ChromaDB 作为向量数据库 import chromadb from chromadb.config import Settings class MemoryCore: def __init__(self, persist_directory: str ./wienerdog_memory): 初始化记忆核心。 :param persist_directory: 向量数据库持久化目录 # 加载嵌入模型这里使用一个轻量级开源模型 self.embedding_model SentenceTransformer(all-MiniLM-L6-v2) # 初始化 ChromaDB 客户端 self.chroma_client chromadb.Client(Settings( chroma_db_implduckdbparquet, persist_directorypersist_directory )) # 获取或创建用于存储项目记忆的集合collection self.collection self.chroma_client.get_or_create_collection( nameproject_memories, metadata{description: 存储项目相关的代码、文档和对话记忆} ) def _generate_id(self, content: str) - str: 为记忆内容生成唯一ID使用MD5哈希。 return hashlib.md5(content.encode()).hexdigest() def store_memory(self, content: str, metadata: Dict[str, Any] None): 存储一段记忆。 :param content: 记忆的文本内容如代码、文档、对话摘要 :param metadata: 附加元数据如来源文件、时间戳、类型code/doc/chat if metadata is None: metadata {} # 为内容生成向量嵌入 embedding self.embedding_model.encode(content).tolist() # 生成唯一ID memory_id self._generate_id(content) # 存储到向量数据库 self.collection.add( documents[content], embeddings[embedding], metadatas[metadata], ids[memory_id] ) print(fMemory stored with ID: {memory_id}) def retrieve_related_memories(self, query: str, n_results: int 5) - List[Dict]: 检索与查询相关的记忆。 :param query: 用户的问题或当前上下文 :param n_results: 返回最相关的记忆数量 :return: 包含记忆内容和元数据的字典列表 # 将查询转换为向量 query_embedding self.embedding_model.encode(query).tolist() # 在向量数据库中查询 results self.collection.query( query_embeddings[query_embedding], n_resultsn_results ) # 整理返回结果 related_memories [] if results[documents]: for i in range(len(results[documents][0])): memory { content: results[documents][0][i], metadata: results[metadatas][0][i], distance: results[distances][0][i] # 相似度距离 } related_memories.append(memory) return related_memories # 简单使用示例 if __name__ __main__: memory_core MemoryCore() # 存储一些示例记忆 memory_core.store_memory( 本项目使用 FastAPI 构建后端数据库为 PostgreSQLORM 使用 SQLAlchemy。, metadata{type: arch_doc, project: my_api} ) memory_core.store_memory( 用户认证使用 JWT 令牌令牌有效期为 24 小时。, metadata{type: auth_doc, project: my_api} ) # 检索记忆 query 我们这个项目怎么处理用户登录 related memory_core.retrieve_related_memories(query) for mem in related: print(f相关记忆: {mem[content][:100]}... (距离: {mem[distance]:.4f}))关键点解释嵌入模型将文本转换为数值向量嵌入。语义相似的文本其向量在空间中的距离也更近。向量数据库专门为存储和查询高维向量而优化。它能够快速找到与查询向量最相似的向量。元数据过滤在实际应用中除了向量相似度还可以结合元数据如项目名、文件类型进行过滤实现更精确的检索。3.2 上下文构建与提示工程检索到记忆后需要将其巧妙地整合到发给 Claude Code 的提示词中。# 文件context_builder.py class ContextBuilder: staticmethod def build_prompt_with_memories(user_query: str, related_memories: List[Dict]) - str: 构建包含相关记忆的增强提示词。 if not related_memories: return user_query # 如果没有相关记忆返回原问题 # 构建记忆上下文部分 memory_context 以下是与您的问题相关的项目背景信息记忆\n\n for i, mem in enumerate(related_memories, 1): memory_context f[记忆片段 {i}]\n memory_context f内容{mem[content]}\n if mem[metadata].get(source): memory_context f来源{mem[metadata][source]}\n memory_context \n---\n\n # 构建最终提示词 enhanced_prompt f{memory_context} 基于以上项目背景信息请回答以下问题 问题{user_query} 请确保您的回答与项目已有的架构和约定保持一致。 return enhanced_prompt # 使用示例 if __name__ __main__: from memory_core import MemoryCore memory_core MemoryCore() query 如何在这个项目中添加一个新的 API 端点 memories memory_core.retrieve_related_memories(query) prompt ContextBuilder.build_prompt_with_memories(query, memories) print( 发送给 AI 的增强提示词 ) print(prompt)这个构建的提示词清晰地分隔了“背景记忆”和“当前问题”引导 AI 在给定的上下文中进行回答。3.3 “技能”与自我提升的初步构想“自我提升的技能”是一个更高级的概念。一个简单的实现思路是基于反馈进行记忆的加权或技能的参数调整。# 文件skill_feedback.py # 一个非常简化的反馈学习机制示例 class SimpleFeedbackLearner: def __init__(self, memory_core): self.memory_core memory_core self.feedback_log [] # 记录反馈 def log_feedback(self, memory_id: str, query: str, was_helpful: bool): 记录用户对某段记忆在特定查询下是否有用的反馈。 self.feedback_log.append({ memory_id: memory_id, query: query, was_helpful: was_helpful, timestamp: time.time() }) # 简单策略如果记忆有帮助在元数据中增加权重否则减少。 # 注意实际修改向量数据库中的元数据需要更复杂的操作此处仅为逻辑示意。 print(fLogged feedback for memory {memory_id}: helpful{was_helpful}) def adjust_retrieval_strategy(self, query: str): 根据历史反馈调整检索策略例如偏好某些类型的记忆。 # 这是一个高级功能的占位符。实际实现可能需要 # 1. 分析 feedback_log找出对类似 query 经常有帮助的 memory 类型metadata。 # 2. 在检索时给特定 metadata 的记忆更高的优先级或权重。 pass真正的“自我提升”可能涉及检索优化根据反馈调整向量搜索的相似度阈值或元数据过滤器。提示词优化根据任务成功与否动态调整构建提示词的模板。记忆重要性评分根据被检索和采纳的频率动态提升或降低某些记忆的权重。4. 完整实战案例构建一个本地 Wienerdog 服务并与 VS Code 集成现在我们将整合以上模块构建一个可运行的本地 Wienerdog 服务原型并模拟如何与开发环境集成。4.1 项目结构创建wienerdog_demo/ ├── app/ │ ├── __init__.py │ ├── main.py # FastAPI 主应用 │ ├── memory_core.py # 记忆核心模块 │ ├── context_builder.py # 上下文构建模块 │ └── skill_feedback.py # 反馈学习模块简化 ├── requirements.txt # 项目依赖 ├── docker-compose.yml # Docker 编排可选 └── README.md4.2 添加项目依赖创建requirements.txt文件fastapi0.104.1 uvicorn[standard]0.24.0 sentence-transformers2.2.2 chromadb0.4.18 pydantic2.5.0 python-multipart0.0.6安装依赖pip install -r requirements.txt4.3 编写核心 API 服务创建app/main.py这是我们的 FastAPI 应用入口。# 文件app/main.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import List, Optional import uvicorn from .memory_core import MemoryCore from .context_builder import ContextBuilder from .skill_feedback import SimpleFeedbackLearner app FastAPI(titleWienerdog Memory Service, description为 AI 编程助手提供记忆和上下文服务) # 初始化核心组件 memory_core MemoryCore(persist_directory./chroma_db) feedback_learner SimpleFeedbackLearner(memory_core) # 定义请求/响应模型 class StoreMemoryRequest(BaseModel): content: str metadata: Optional[dict] None class QueryRequest(BaseModel): query: str n_results: Optional[int] 5 class QueryResponse(BaseModel): enhanced_prompt: str related_memories: List[dict] class FeedbackRequest(BaseModel): memory_id: str original_query: str was_helpful: bool app.get(/) def read_root(): return {message: Wienerdog Memory Service is running.} app.post(/memory/) def store_memory(request: StoreMemoryRequest): 存储一段新的记忆。 try: memory_core.store_memory(request.content, request.metadata) return {status: success, message: Memory stored successfully.} except Exception as e: raise HTTPException(status_code500, detailstr(e)) app.post(/query/) def query_with_memory(request: QueryRequest) - QueryResponse: 主查询接口。 接收用户问题检索相关记忆构建增强提示词并返回。 try: # 1. 检索相关记忆 related_memories memory_core.retrieve_related_memories( request.query, n_resultsrequest.n_results ) # 2. 构建增强提示词 enhanced_prompt ContextBuilder.build_prompt_with_memories( request.query, related_memories ) # 3. 返回结果 return QueryResponse( enhanced_promptenhanced_prompt, related_memoriesrelated_memories ) except Exception as e: raise HTTPException(status_code500, detailstr(e)) app.post(/feedback/) def submit_feedback(request: FeedbackRequest): 提交关于某段记忆是否有用的反馈。 try: feedback_learner.log_feedback( request.memory_id, request.original_query, request.was_helpful ) return {status: success, message: Feedback received.} except Exception as e: raise HTTPException(status_code500, detailstr(e)) if __name__ __main__: uvicorn.run(app, host0.0.0.0, port8000)4.4 运行与验证服务启动服务cd wienerdog_demo python -m app.main服务将在http://localhost:8000启动。使用 curl 或 HTTP 客户端测试存储记忆curl -X POST http://localhost:8000/memory/ \ -H Content-Type: application/json \ -d { content: 本项目使用 React 18 和 TypeScript 5。状态管理使用 Zustand。, metadata: {type: tech_stack, project: frontend_app} }查询记忆curl -X POST http://localhost:8000/query/ \ -H Content-Type: application/json \ -d { query: 我们前端用什么状态管理库 }你会收到一个包含enhanced_prompt的 JSON 响应这个提示词就可以直接发送给 Claude Code。4.5 模拟 IDE 插件集成由于 Claude Code 插件的具体集成方式未公开我们模拟一个 VS Code 扩展的简单逻辑。你可以创建一个简单的脚本在提问前先调用 Wienerdog 服务。# 文件vscode_integration_sim.py import requests import json WIENERDOG_API_URL http://localhost:8000 def ask_claude_with_memory(user_question: str) - str: 模拟流程先查询 Wienerdog 获取增强上下文再“发送”给 Claude。 实际场景中这部分逻辑会嵌入到 VS Code 插件中。 # 1. 调用 Wienerdog 查询接口 query_payload {query: user_question, n_results: 3} try: response requests.post(f{WIENERDOG_API_URL}/query/, jsonquery_payload) response.raise_for_status() result response.json() except requests.exceptions.RequestException as e: print(fError connecting to Wienerdog: {e}) # 降级直接使用原问题 enhanced_prompt user_question related_mems [] else: enhanced_prompt result.get(enhanced_prompt, user_question) related_mems result.get(related_memories, []) print( 增强后的提示词发送给 Claude) print(enhanced_prompt) print(*50) # 2. 这里模拟调用 Claude API实际需替换为真实的 API 调用 # claude_response call_claude_api(enhanced_prompt) claude_response f[模拟 Claude 回答] 基于您提供的项目背景您使用的是 Zustand 进行状态管理。它是一个轻量级且好用的库。 # 3. 可选提交反馈。例如如果用户采纳了回答可以标记相关记忆为有用。 if related_mems: # 假设我们觉得第一段相关记忆很有用 memory_id related_mems[0].get(id) # 需要 memory_core 返回 id if memory_id: feedback_payload { memory_id: memory_id, original_query: user_question, was_helpful: True } try: requests.post(f{WIENERDOG_API_URL}/feedback/, jsonfeedback_payload) except: pass # 反馈失败不影响主流程 return claude_response # 测试模拟集成 if __name__ __main__: question 我们前端用什么状态管理库 answer ask_claude_with_memory(question) print(f\nClaude 的回答{answer})这个模拟展示了 IDE 插件与 Wienerdog 服务交互的基本流程。5. 常见问题与排查思路在搭建和使用此类系统时你可能会遇到以下问题问题现象可能原因排查与解决思路服务启动失败端口被占用端口 8000 已被其他进程使用。1. 使用lsof -i:8000或netstat -ano | findstr :8000查找占用进程并终止。2. 修改main.py中的port参数换一个空闲端口。导入chromadb或sentence_transformers失败依赖未正确安装或存在版本冲突。1. 确认在正确的虚拟环境中。2. 运行pip install -r requirements.txt --force-reinstall。3. 检查 Python 版本是否为 3.8。存储或检索记忆时速度很慢1. 嵌入模型首次加载需要时间。2. 向量数据库未使用持久化每次重启都重建索引。3. 硬件资源CPU/内存不足。1. 首次加载慢是正常的模型会缓存。2. 检查persist_directory参数是否正确设置且目录可写。3. 考虑使用更轻量的嵌入模型如all-MiniLM-L6-v2已经较轻量。检索到的记忆不相关1. 嵌入模型不适合你的领域如代码。2. 记忆内容过于冗长或噪声大。3. 查询语句太模糊。1. 尝试专为代码设计的嵌入模型如BGE或OpenAI的text-embedding-ada-002。2. 在存储记忆前对内容进行清洗和分块Chunking例如按函数、类或段落分割。3. 优化查询语句使其更具体。Claude Code 未使用增强的提示词IDE 插件未正确配置或调用 Wienerdog 服务。1. 检查模拟集成脚本中的 API URL 是否正确。2. 查看网络请求日志确认插件是否成功调用/query端点。3. 实际集成需要开发或配置专门的 VS Code 插件来拦截并修改发送给 Claude 的请求。“memory access violation”或“out of memory”错误1. 嵌入模型或向量数据库操作内存溢出。2. 同时处理大量文本。1. 减少单次处理的文本量采用流式或分批处理。2. 增加系统可用内存。3. 使用更节省内存的数据库后端如 Chroma 的duckdb模式。6. 最佳实践与工程建议将 Wienerdog 这类系统用于生产环境或严肃开发需要考虑更多工程化因素。6.1 记忆的管理与治理记忆分片Chunking不要将整篇文档或长代码文件作为一条记忆存储。应使用智能分片如按语义、按函数/类、按固定长度重叠分片以提高检索精度。记忆去重与更新建立机制识别和合并相似记忆并支持记忆内容的更新和版本管理。记忆生命周期并非所有记忆都同等重要。设计过期、归档或基于重要性的清理策略。元数据标准化为记忆定义清晰的元数据 schema如project,file_path,type(code,doc,issue,decision),author,timestamp。这便于高级过滤和检索。6.2 性能与可扩展性异步处理记忆的存储和向量化可能是耗时操作应使用异步任务如 Celery, RQ避免阻塞 API 响应。缓存层对频繁的、相同的查询结果进行缓存可以显著降低延迟和数据库负载。多集合支持支持按项目、团队创建独立的记忆集合实现数据隔离。可插拔后端将向量数据库和嵌入模型抽象为接口方便未来切换为 Pinecone、Qdrant 或不同的嵌入模型。6.3 安全与隐私认证与授权API 服务必须添加认证如 API Key, JWT确保只有授权的 IDE/用户才能存储和查询记忆。数据加密敏感的项目代码和设计文档在存储向量数据库和传输API过程中应考虑加密。记忆审查提供界面让用户查看、编辑和删除已存储的个人或项目记忆符合数据隐私规范。6.4 与开发流程的集成CI/CD 管道在构建或文档生成阶段自动将 API 文档、架构图说明、变更日志等作为记忆存储。Git Hook通过 Git 钩子在提交代码时自动提取有意义的提交信息或变更摘要作为记忆。问题跟踪系统与 Jira、GitHub Issues 集成将关闭的问题及其解决方案自动转化为记忆。通过本文的探讨和实战我们不仅理解了 Wienerdog 项目所要解决的“AI 健忘”痛点还亲手构建了一个具备核心记忆功能的服务原型。从记忆的向量化存储、相关性检索到上下文增强提示词的构建我们走完了完整的技术闭环。虽然与 Claude Code 的深度集成需要依赖官方插件的扩展能力但我们已经掌握了其底层原理和实现方法。这种为 AI 编程助手赋予长期记忆和情境感知能力的思路是提升开发者体验和效率的重要方向。你可以基于这个原型继续探索更复杂的技能学习机制、更优的记忆分片策略或者将其适配到其他 AI 助手。记住关键在于让工具更好地理解你和你的项目上下文从而成为真正得力的编程伙伴。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻