当前位置: 首页 > news >正文

基于向量数据库与本地嵌入模型构建AI助手持久记忆系统

1. 项目概述当AI助手拥有“持久记忆”你有没有过这样的经历利用碎片时间学习每次打开AI助手都得花上好几分钟重新“交代背景”——“我们上次讲到哪了”、“我卡在哪个概念上了”、“我们约定用什么符号来着”。宝贵的二十分钟学习时间一半都浪费在了“重新开机”上。这正是我学习物理时遇到的真实困境。我的学习时间很零散可能是上班前的二十分钟也可能是某个晚上挤出来的一小时。每次短暂的会话都像是一次全新的开始效率低得令人沮丧。问题的核心不在于AI模型本身的能力而在于它缺乏一种跨会话的、持续性的记忆。为了解决这个痛点我动手为我的AI助手构建了一个“记忆层”。这个项目的核心目标很简单让AI记住我记住我们每一次对话的上下文、进展和细节从而让每一次新的交流都能无缝衔接上一次真正实现“断点续学”。更妙的是这一切都运行在我自己的电脑上数据完全私有没有任何云端存储或第三方窥探的风险。这个被我称为“Deus”的项目本质上是一个本地化、语义驱动的对话记忆系统。它通过将每次对话的关键信息如主题、摘要、难点转化为向量并存入本地数据库在下一次会话时能根据你的提问智能地检索出所有相关的历史上下文并自动提供给AI模型。这样一来当我问起“欧拉-拉格朗日方程”时它已经知道我们上周花了三个会话讨论约束系统知道我总是混淆广义坐标并且我们正在使用Goldstein的教材作为参考。我不需要再重复任何信息它“记得”。这个想法的力量远不止于学习。有一次我问它“我和室友今晚可以看什么电影”它基于过去对话中了解到的我们各自的品味给出了一个让我们俩都满意的推荐。那一刻我意识到这不仅仅是记住知识点更是在构建一个真正理解你、伴随你成长的数字伙伴。2. 核心思路与架构设计2.1 问题拆解为什么需要“记忆”在深入技术细节之前我们先明确要解决的核心问题。传统的AI对话无论是ChatGPT的网页版还是大多数本地部署的聊天机器人本质上是“无状态”的。每次对话都是一个独立的会话Session会话结束后上下文窗口内的信息就被丢弃了。下一次对话模型对你一无所知。这带来了几个关键痛点重复劳动用户需要反复自我介绍、重申目标、回顾进度极大浪费时间和精力。知识断层长期、渐进式的学习或项目无法有效进行每次都要从“第一课”开始。缺乏个性化AI无法基于你的历史偏好、习惯和知识盲区提供定制化回应。隐私顾虑依赖云服务的记忆功能意味着你的所有对话历史都可能被服务提供商存储和分析。因此一个理想的解决方案需要具备以下特性持久化存储、高效的关联检索、完全的本地控制以及易于集成。2.2 技术选型为什么是向量数据库要实现“记忆”最朴素的想法是把所有聊天记录存成文本下次对话时全部塞给模型。但这显然行不通因为模型的上下文窗口长度有限比如常见的128K tokens无法承载数月甚至数年的对话历史。我们需要一种更智能的方法只提取与当前问题最相关的历史片段。这就是语义搜索和向量数据库的用武之地。其核心工作流程如下嵌入Embedding将一段文本如一个对话回合或总结通过一个嵌入模型如Gemini Embedding API或本地模型如text-embedding-3-small转换为一个高维向量一串数字。这个向量在数学空间中的位置代表了这段文本的语义。存储将这个向量连同对应的原始文本或摘要、元数据时间、主题等一起存入一个专门为向量检索优化的数据库。检索当新问题到来时同样将其转换为向量查询向量。在向量数据库中计算查询向量与所有存储向量之间的“距离”通常使用余弦相似度或点积。距离越近语义越相似。上下文构建取出与查询向量最相似的几个历史片段即“记忆”将它们作为背景信息与新问题一起提交给AI大模型如GPT-4、Claude或本地LLM从而生成一个“有记忆”的回复。为什么选择 SQLite 的向量扩展市面上有专业的向量数据库如 Pinecone, Weaviate, Qdrant但对于个人项目我追求极致的简洁和零依赖。sqlite-vec是一个 SQLite 的扩展它让 SQLite 具备了原生存储和查询向量的能力。这意味着我的整个“记忆大脑”就是一个单一的.db文件备份、迁移、查看都异常简单无需运行任何额外的数据库服务。对于个人使用场景其性能完全足够。工具链选择考量嵌入模型初期我使用了 Gemini 的 Embedding API因为它质量高且易于使用。但对于追求完全离线的用户可以无缝切换到 Sentence Transformers 等本地模型只需修改几行代码。大语言模型本项目与模型无关。你可以使用 OpenAI API、 Anthropic Claude或者本地运行的 Llama、Qwen 等。记忆层负责提供“记忆”模型负责基于“记忆”生成回答两者解耦。应用框架我选择用 Python 构建因其在 AI 和数据处理生态上的绝对优势。前端可以是一个简单的命令行界面也可以是 Gradio/Streamlit 构建的 Web UI甚至能集成到 Obsidian、Logseq 等知识管理工具中。注意嵌入模型的选择至关重要。一个好的嵌入模型能准确捕捉语义相似性。例如使用专门针对对话或指令优化的嵌入模型如text-embedding-3-small或bge-m3会比通用模型在记忆检索上表现更好。3. 核心细节解析与实操要点3.1 记忆的“存储粒度”存什么怎么存不是所有对话都值得记忆也不是所有内容都需要原封不动地存储。盲目存储所有对话记录会导致数据库臃肿检索噪音大。我们需要设计一个高效的记忆存储策略。1. 记忆单元设计我将一次有意义的交互单元定义为一个“记忆条目”它包含以下字段id: 主键。content: 原始的对话文本或用户消息。为了节省空间我通常只存储用户输入和AI回应的关键摘要部分而非全文。tldr:这是我实践中最关键的一环——由AI生成的、该段对话的极简摘要。例如“用户理解了欧拉-拉格朗日方程的推导但在约束条件应用上存在困惑。” 这比原始文本更浓缩更适合作为检索的目标。topics: 手动或自动打上的标签如[“physics”, “classical_mechanics”, “lagrangian”]。这提供了另一种分类检索的维度。embedding: 由tldr字段生成的向量。存储的是摘要的向量而不是全文向量这能大幅提升检索的准确性和效率。date: 时间戳可用于按时间过滤或排序。path/session_id: 关联到原始的对话日志文件或会话ID便于追溯。2. 存储触发时机何时创建一条新记忆我采用了两种策略结合主动存储在每次对话结束时如果我认为这段对话有价值就手动或通过一个快捷键触发“保存记忆”操作。自动存储设置一个简单的启发式规则例如当AI的回答长度超过一定阈值或对话中出现了我预先定义的关键词如“记住”、“重要”、“总结一下”时自动触发存储流程。自动存储的摘要质量可能稍低但保证了连续性。3. 向量化过程这是记忆系统的“编码”阶段。当需要存储一个记忆条目时系统会执行以下伪代码# 假设我们已经有了 memory_entry[tldr] from sentence_transformers import SentenceTransformer embedder SentenceTransformer(BAAI/bge-small-en-v1.5) # 示例使用本地嵌入模型 embedding_vector embedder.encode(memory_entry[tldr], normalize_embeddingsTrue) memory_entry[embedding] embedding_vector.tolist() # 转换为列表存入数据库使用本地模型时务必注意模型对输入长度的限制并将生成的向量归一化normalize_embeddingsTrue这能使余弦相似度计算更高效准确。3.2 记忆的“唤醒机制”查什么怎么查当用户提出一个新问题时系统需要从海量记忆中唤醒相关的部分。这个过程就是检索。1. 查询向量生成首先将用户的当前问题Query进行向量化。这里有一个重要技巧为了提高检索召回率我有时不仅对原始问题生成向量还会生成一个“增强版查询”。例如对于问题“欧拉-拉格朗日方程怎么用”系统可能会自动将其扩展为“欧拉-拉格朗日方程 应用 实例 拉格朗日量”然后再生成向量。这能帮助找到那些摘要中没有直接出现“怎么用”但讨论了应用实例的记忆。2. 混合检索策略单纯依靠向量相似度语义搜索有时会漏掉一些关键词完全匹配的重要记忆。因此我实现了混合检索语义检索如上所述用查询向量在sqlite-vec中查找最相似的K条记忆。关键词检索同时从查询中提取名词实体和关键术语在topics字段或content字段中进行简单的SQLLIKE或全文搜索如果SQLite编译了FTS扩展。 最终结果是对两组检索结果进行去重和加权融合如语义检索结果权重0.7关键词检索结果权重0.3。这确保了即使表述方式不同或者记忆摘要写得比较概括也能被有效地找出来。3. 上下文组装与注入检索到相关的记忆条目后不能简单地将它们堆砌起来扔给大模型。需要精心组装成一段连贯的“背景故事”。我的组装模板如下以下是用户的历史相关对话摘要供你在回答时参考 --- [记忆1日期] [记忆1的tldr] [记忆2日期] [记忆2的tldr] ... --- 当前对话 [用户的新问题]将这段组装好的提示词放在系统提示词System Prompt中或者直接放在用户消息的历史记录里发送给大模型。在系统提示词中我会明确告诉模型“请参考以上历史背景来理解用户当前的问题和上下文你的回答应体现出对这些历史的延续性。”实操心得记忆条目的数量和质量决定了检索效果。初期可以多存一些后期可以通过一个简单的管理界面定期回顾、合并或删除低质量、重复的记忆。给记忆打上准确的topics标签能极大提升混合检索的效率。4. 系统搭建与核心环节实现4.1 环境准备与依赖安装我们将在Python环境中构建这个系统。确保你已安装Python 3.8。首先创建项目目录并初始化虚拟环境mkdir deus-memory-system cd deus-memory-system python -m venv venv # Windows: venv\Scripts\activate # macOS/Linux: source venv/bin/activate安装核心依赖。这里我们选择sqlite-vss一个更流行的SQLite向量扩展绑定库与sqlite-vec原理类似但生态更活跃和Sentence Transformers作为本地嵌入模型。pip install sentence-transformers # 安装 sqlite-vss 需要一些系统依赖请根据你的操作系统参考其官方文档 # 例如在 macOS 上 brew install sqlite libvss pip install sqlite-vss如果sqlite-vss安装困难备用方案是使用chromadb或lance等轻量级向量库但会引入额外服务。为了极致简洁我们优先攻克sqlite-vss。4.2 数据库与记忆表初始化接下来我们创建数据库并定义存储记忆的表结构。# database.py import sqlite3 import json from datetime import datetime def init_database(db_pathmemory.db): conn sqlite3.connect(db_path) cursor conn.cursor() # 启用外键和WAL模式以获得更好性能 cursor.execute(PRAGMA foreign_keys ON;) cursor.execute(PRAGMA journal_mode WAL;) # 创建主表存储记忆的元数据和文本内容 cursor.execute( CREATE TABLE IF NOT EXISTS memory_entries ( id INTEGER PRIMARY KEY AUTOINCREMENT, content TEXT NOT NULL, -- 原始对话内容 tldr TEXT NOT NULL, -- 由AI生成的摘要 topics TEXT, -- JSON数组如 [physics, lagrangian] session_id TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ) # 创建虚拟表用于向量搜索。这里假设使用 sqlite-vss # 注意需要先加载 vss 扩展 conn.enable_load_extension(True) try: # 加载扩展的路径因系统而异 cursor.execute(SELECT load_extension(libsqlite_vss)) except Exception as e: print(f警告无法加载 sqlite-vss 扩展向量搜索将不可用。错误{e}) # 可以退回到纯关键词搜索或提示用户安装 conn.enable_load_extension(False) # 创建向量表。384 是所选嵌入模型如 all-MiniLM-L6-v2的向量维度。 cursor.execute( CREATE VIRTUAL TABLE IF NOT EXISTS vss_memories USING vss0( embedding(384) ); ) # 创建一个关联表将向量行与记忆条目关联起来 cursor.execute( CREATE TABLE IF NOT EXISTS memory_vectors ( rowid INTEGER PRIMARY KEY, entry_id INTEGER, FOREIGN KEY (entry_id) REFERENCES memory_entries(id) ON DELETE CASCADE ) ) conn.commit() conn.close() print(f数据库已初始化{db_path}) if __name__ __main__: init_database()运行这个脚本将创建memory.db文件以及所需的数据表结构。memory_entries表存储文本信息vss_memories虚拟表存储向量memory_vectors表建立两者间的关联。4.3 记忆的存储与检索实现这是系统的核心逻辑。我们将创建一个MemoryManager类来封装所有操作。# memory_manager.py import sqlite3 import json from sentence_transformers import SentenceTransformer import numpy as np class MemoryManager: def __init__(self, db_pathmemory.db, embed_model_nameall-MiniLM-L6-v2): self.db_path db_path # 加载本地嵌入模型 self.embedder SentenceTransformer(embed_model_name) self.embed_dim self.embedder.get_sentence_embedding_dimension() print(f加载嵌入模型: {embed_model_name}, 向量维度: {self.embed_dim}) def _get_connection(self): conn sqlite3.connect(self.db_path) # 加载扩展以支持向量操作 conn.enable_load_extension(True) try: conn.execute(SELECT load_extension(libsqlite_vss)) except: pass # 处理扩展未加载的情况 conn.enable_load_extension(False) return conn def add_memory(self, content, tldr, topicsNone, session_idNone): 存储一段新的记忆 if topics is None: topics [] topics_json json.dumps(topics) # 生成摘要的向量 embedding self.embedder.encode(tldr, normalize_embeddingsTrue) embedding_list embedding.tolist() conn self._get_connection() cursor conn.cursor() try: # 1. 插入文本记录到 memory_entries cursor.execute( INSERT INTO memory_entries (content, tldr, topics, session_id) VALUES (?, ?, ?, ?) , (content, tldr, topics_json, session_id)) entry_id cursor.lastrowid # 2. 将向量插入 vss 表并关联 entry_id # 注意sqlite-vss 的插入语法需要将向量作为参数传入 embedding_blob np.array(embedding_list, dtypenp.float32).tobytes() cursor.execute( INSERT INTO vss_memories (rowid, embedding) VALUES (?, ?) , (entry_id, embedding_blob)) # 3. 在关联表中记录映射关系可选但便于管理 cursor.execute( INSERT INTO memory_vectors (rowid, entry_id) VALUES (?, ?) , (entry_id, entry_id)) conn.commit() print(f记忆已保存ID: {entry_id}) return entry_id except Exception as e: conn.rollback() print(f保存记忆失败: {e}) raise e finally: conn.close() def search_memories(self, query, top_k5, topic_filterNone): 根据查询文本检索相关记忆 # 生成查询向量 query_embedding self.embedder.encode(query, normalize_embeddingsTrue) query_vec_blob np.array(query_embedding.tolist(), dtypenp.float32).tobytes() conn self._get_connection() cursor conn.cursor() # 构建 SQL 查询。这里使用 vss_search 函数进行近似最近邻搜索。 # 注意sqlite-vss 的具体函数名可能有所不同请参考其最新文档。 # 以下是一个示例性查询实际使用时需调整。 sql SELECT e.id, e.content, e.tldr, e.topics, e.created_at, vss_distance(v.embedding, ?) as distance FROM vss_memories v JOIN memory_entries e ON v.rowid e.id WHERE vss_search(v.embedding, ?, ?) ORDER BY distance LIMIT ? # 由于 sqlite-vss 的 API 可能变化一个更可靠的方法是使用其内置的搜索语法。 # 另一种写法如果上述不行 sql SELECT e.id, e.content, e.tldr, e.topics, e.created_at FROM memory_entries e, vss_memories v WHERE v.rowid e.id AND v.embedding MATCH ? ORDER BY v.distance LIMIT ? # 参数查询向量blob和 top_k params [query_vec_blob, top_k] # 如果提供了主题过滤增加条件 if topic_filter: # 这是一个简化的关键词匹配实际中可能需要更复杂的JSON查询 sql sql.replace(WHERE, WHERE (e.topics LIKE ? OR e.content LIKE ?) AND) like_pattern f%{topic_filter}% params [like_pattern, like_pattern] params try: cursor.execute(sql, params) results cursor.fetchall() except Exception as e: print(f向量搜索失败可能扩展未正确加载。错误: {e}) # 降级到基于关键词的全文搜索 sql_fallback SELECT id, content, tldr, topics, created_at FROM memory_entries WHERE content LIKE ? OR tldr LIKE ? ORDER BY created_at DESC LIMIT ? cursor.execute(sql_fallback, [f%{query}%, f%{query}%, top_k]) results cursor.fetchall() finally: conn.close() # 格式化结果 memories [] for row in results: mem_id, content, tldr, topics_json, created_at, *maybe_distance row try: topics json.loads(topics_json) if topics_json else [] except: topics [] memories.append({ id: mem_id, content: content, tldr: tldr, topics: topics, created_at: created_at, distance: maybe_distance[0] if maybe_distance else None }) return memories def get_context_for_prompt(self, query, top_k5): 检索记忆并组装成给大模型的上下文提示 memories self.search_memories(query, top_ktop_k) if not memories: return 暂无相关历史记忆。\n\n当前问题 query context_lines [以下是你与用户的历史相关对话摘要供你回答时参考, ---] for mem in memories: date_str mem[created_at][:10] if mem[created_at] else 未知日期 context_lines.append(f[{date_str}] {mem[tldr]}) context_lines.append(---) context_lines.append(f当前用户问题{query}) return \n.join(context_lines)这个MemoryManager类提供了记忆的增删改查核心功能。add_memory方法负责编码和存储search_memories方法负责语义检索get_context_for_prompt方法则将检索结果格式化成大模型能理解的提示词。4.4 与大语言模型集成最后我们需要将记忆系统与一个LLM大语言模型连接起来。这里以使用OpenAI API为例但你可以轻松替换为Claude、本地Ollama等。# assistant.py import openai # 或 from anthropic import Anthropic 等 from memory_manager import MemoryManager import os class AIAssistantWithMemory: def __init__(self, memory_db_pathmemory.db): self.memory MemoryManager(memory_db_path) # 初始化你的LLM客户端这里以OpenAI为例 self.client openai.OpenAI(api_keyos.getenv(OPENAI_API_KEY)) self.model gpt-4 # 或 gpt-3.5-turbo def chat(self, user_message, session_iddefault, save_this_interactionTrue): 核心聊天循环1.检索记忆 2.组装提示 3.调用LLM 4.可选保存 # 1. 检索相关记忆构建上下文 context_prompt self.memory.get_context_for_prompt(user_message, top_k5) # 2. 组装最终的系统提示和消息历史 system_prompt f你是一个拥有持久记忆的AI助手。请仔细阅读以下历史对话摘要它们提供了当前对话的背景和用户的长期偏好、知识状态。请基于这些历史信息给出连贯、个性化且准确的回答。 {context_prompt} 请直接回答用户当前的问题无需复述历史摘要。你的回答应自然体现对过往对话的延续性。 messages [ {role: system, content: system_prompt}, {role: user, content: user_message} ] # 3. 调用LLM try: response self.client.chat.completions.create( modelself.model, messagesmessages, temperature0.7, max_tokens1000 ) ai_reply response.choices[0].message.content except Exception as e: ai_reply f抱歉调用AI模型时出错{e} # 4. 决定是否将本次交互存入记忆 if save_this_interaction: # 这里可以设计更智能的摘要生成逻辑。简单起见让AI自己总结。 summary_prompt f请用一句简短的话总结以下对话的核心内容用于未来回忆。用户说{user_message[:100]}... 你回答{ai_reply[:100]}... try: summary_response self.client.chat.completions.create( modelself.model, messages[{role: user, content: summary_prompt}], temperature0.3, max_tokens50 ) tldr summary_response.choices[0].message.content.strip() except: tldr f关于{user_message[:30]}... # 保存记忆 self.memory.add_memory( contentfUser: {user_message}\nAI: {ai_reply}, tldrtldr, topicsself._extract_topics(user_message), # 一个简单的关键词提取函数 session_idsession_id ) return ai_reply def _extract_topics(self, text): 一个简单的关键词提取函数示例实际可以使用更复杂的NLP库 # 这里可以集成像RAKE、KeyBERT这样的库或者使用预定义的关键词列表匹配 # 为简化返回空列表或基于规则提取 return []现在一个拥有持久记忆的AI助手核心就搭建完成了。你可以创建一个简单的循环来测试它assistant AIAssistantWithMemory() print(欢迎使用有记忆的AI助手输入 quit 退出。) while True: user_input input(\n你 ) if user_input.lower() in [quit, exit]: break response assistant.chat(user_input, session_idtest_session_1) print(f\n助手 {response})5. 常见问题与排查技巧实录在实际搭建和使用过程中你肯定会遇到各种问题。以下是我踩过的一些坑以及解决方案希望能帮你节省时间。5.1 向量检索相关的问题问题1检索结果不相关总是返回一些奇怪的旧记忆。原因分析嵌入模型不适合你的任务或者查询文本与记忆摘要的语义差异太大。排查与解决检查嵌入模型确保你使用的嵌入模型适合短文本相似性匹配。对于英文all-MiniLM-L6-v2是通用且不错的选择。对于中文或特定领域可以尝试BAAI/bge-small-zh-v1.5或moka-ai/m3e-base。在 MTEB排行榜 上可以找到当前最好的模型。优化摘要TLDR质量记忆检索的“靶子”是tldr字段。如果摘要写得太模糊或偏离主题检索就会失败。尝试在保存记忆时用更明确的指令让AI生成摘要例如“请用包含核心术语和结论的一句话总结这段对话以便未来通过问题检索。”调整检索策略尝试混合检索。在search_memories函数中同时进行向量搜索和基于topics字段的关键词过滤。可以给关键词匹配一个较高的初始权重。检查向量维度确保数据库里vss_memories表定义的向量维度与你使用的嵌入模型输出的维度完全一致。不一致会导致查询失败或结果异常。问题2sqlite-vss扩展加载失败报错no such module或symbol not found。原因分析这是搭建过程中最常见的障碍主要是因为sqlite-vss需要本地编译并且与系统SQLite版本有依赖关系。排查与解决确认扩展文件存在找到编译好的libsqlite_vss.so(Linux)、libsqlite_vss.dylib(macOS) 或sqlite_vss.dll(Windows) 文件。使用绝对路径加载在Python中尝试使用绝对路径加载扩展。conn.execute(fSELECT load_extension({absolute_path_to_libsqlite_vss}))降级方案如果实在无法解决可以暂时放弃纯SQLite方案改用chromadb的持久化模式。虽然会引入一个轻量级服务但安装简单API友好。只需将MemoryManager中的存储和检索逻辑替换为ChromaDB的调用即可。这可以作为快速验证想法的备选方案。5.2 记忆管理与性能优化问题3数据库随着时间推移变得非常大检索速度变慢。原因分析未经管理的记忆无限增长向量搜索的复杂度随数据量增加而上升。排查与解决定期清理实现一个简单的管理功能定期如每月回顾记忆。可以手动删除不再相关或低质量的条目或者合并相似条目例如将一周内关于同一主题的多个记忆合并成一个总结性记忆。设置记忆“保质期”为记忆条目添加一个last_accessed最后访问时间字段。在检索时更新它。可以运行一个后台任务自动删除超过一定时间如6个月未被访问的记忆。索引优化sqlite-vss使用HNSW等近似算法本身对大规模数据有较好支持。确保你没有在非向量列上做全表扫描。如果使用了topics进行过滤可以为其创建普通索引。分库/分表如果记忆量真的极大可以考虑按时间如每年一个数据库或主题进行分片。问题4AI的回答并没有很好地利用历史记忆感觉它“忘了”。原因分析提示词Prompt工程不到位。仅仅把历史摘要扔给模型它可能不知道该如何使用。排查与解决强化系统指令在system_prompt中更明确地指示模型如何使用记忆。例如“你必须参考上述历史摘要来理解用户的当前问题。如果历史中提到用户的困惑点请在回答中主动澄清如果历史中确立了某种约定如符号、参考书请遵循该约定。”调整记忆注入位置除了放在系统提示中也可以将记忆作为第一条用户消息的历史上下文。不同的模型对系统提示的重视程度不同可以多尝试。精选记忆数量不要一次性注入太多条记忆top_k太大。通常3-7条最相关的记忆效果最好。过多的无关记忆会形成噪音干扰模型。对记忆进行排序或加权在组装上下文时将相关性最高距离最小或时间最新的记忆放在前面。甚至可以尝试让AI先对检索到的记忆做一次简要分析再生成回答。5.3 隐私与部署考量问题5如何确保我的所有对话数据完全私有核心原则所有环节均运行在本地或你可控的服务器上。实施方案嵌入模型本地化务必使用如Sentence Transformers这样的本地库运行嵌入模型绝对不要使用需要联网的API如早期的OpenAI Embedding API。这是隐私泄露的最大潜在风险点。大模型本地化将AIAssistantWithMemory中的client替换为本地LLM服务如通过Ollama运行Llama 3、Qwen等模型。这样从问题到回答的完整链路都在本地。数据库本地存储sqlite数据库文件就放在你的硬盘上无需任何网络访问。网络隔离在部署时确保整个应用没有不必要的出站网络连接。问题6我想把它做成一个常驻服务或集成到其他工具里有什么建议Web服务化使用FastAPI或Flask将上面的AIAssistantWithMemory类包装成REST API。这样任何前端网页、桌面应用、手机App都可以通过HTTP请求与你的“有记忆助手”交互。集成到聊天工具可以为Discord、Slack或Telegram编写机器人后端调用这个记忆服务。作为知识库插件如果你用Obsidian、Logseq等笔记软件可以开发一个插件在笔记软件中调用本地记忆服务让你的AI助手能基于你所有的笔记内容进行对话实现真正的“第二大脑”。搭建这样一个系统最享受的时刻莫过于几周后你随口问一个模糊的问题它能精准地联系起你一个月前的一次闲聊和上周的学习难点给出一个连贯的、充满“既视感”的回答。它不再是一个每次都要重新认识你的工具而是一个慢慢积累共同经历、共同语言的伙伴。这种体验上的提升远比单纯追求模型参数大小更有意义。
http://www.gsyq.cn/news/1390559.html

相关文章:

  • 会议纪要自动生成器哪个好?高识别快整理省心又清晰
  • 贵阳黄金上门回收哪家强?福运来实力领跑 - 黄金回收
  • 从VBA到C#:CATIA遍历结构树的两种经典方法对比与实战避坑
  • 大模型应用中的复杂性代价:从数据过载到精准输出的工程实践
  • OpenClaw与Continue.dev深度对比:AI编程助手如何重塑开发工作流
  • Hotkey Detective终极指南:3分钟解决Windows热键冲突的完整教程
  • 别再纠结点对点距离了!用Python实现基于网格的轨迹相似度计算(附CSIM算法实战代码)
  • 告别串口助手!用App Inventor 2 WxBit版自制蓝牙调试App,5分钟搞定Arduino通信
  • 义乌家家旺空调维修:海宁靠谱的空调移机公司有哪些 - LYL仔仔
  • SchoolCMS:如何用开源系统彻底改变学校教务管理?终极指南
  • 【逆向工程实战】揭秘IL2CppDumper如何从Unity二进制文件中提取完整C#元数据
  • 会议纪要录音转文字,精准识别高效整理更省心省力
  • 别再死记硬背公式了!用MATLAB手把手教你搞定奈奎斯特稳定判据(附避坑指南)
  • UE5.5 PCG Framework地形布点原理与工程化实践
  • DVC数据版本控制实战:让Git管理CSV和模型文件
  • 大语言模型应用安全:超越用户输入的提示词注入防御实战
  • 快速实现无人机RemoteID合规的完整开源方案指南
  • 在Taotoken平台观测不同大模型API的用量与成本对比分析
  • PyCharm运行配置全解析:从Edit Configurations到Project Interpreter的避坑指南
  • 2026 东莞黄金回收商家排行,紧跟实时金价出价公道实在 - 薛定谔的梨花猫
  • SVG图标字体化难题:如何通过svg2ttf实现高效矢量转换与专业字体生成?
  • 会议纪要自动生成器,AI技术带来的省心清晰纪要整理
  • Topit:Mac窗口置顶终极指南 - 提升多任务处理效率的完整教程
  • WarcraftHelper:让经典魔兽争霸3在现代电脑上流畅运行的终极解决方案
  • VMware Workstation Pro 17免费许可证密钥:终极激活与使用指南
  • 在ubuntu上配置openclaw使用taotoken作为其ai提供商
  • Python socket编程实战:从阻塞到高并发的四层跃迁
  • Taotoken对新发布旗舰模型的快速支持与接入体验
  • Nexus UI Kit:专为AI编码助手设计的HTML组件库,提升前端开发效率
  • JMeter压测八大隐性故障与排查指南