Mem0 记忆提取调用 LLM,模型通道改走 TaoToken 行不行? 📅 发布时间:2026/9/20 4:34:25 👁 浏览次数: 从 Mem0 的_add_to_vector_store说起LLM 通道为什么总卡住如果你最近在本地部署或演示 Mem0大概率遇到过这样的场景add()调用进去日志停在self.llm.generate_response那一行然后就没有然后了。既没有报错也没有 facts 返回_add_to_vector_store里的后续解析逻辑全部空转。问题不在 Mem0 本身而在于它依赖的那个 LLM 客户端——供应商没接上、Base URL 写错、Key 没配好整个记忆写入链路就会在“信息提取”这一步断掉。Mem0 的记忆写入流程其实拆得很清楚add()并发调度_add_to_vector_store和_add_to_graph前者负责 LLM 信息提取、冲突解决、向量存储后者负责图关系存储。其中self.llm.generate_response承担了从对话里抽取 facts 的核心职责它返回的 JSON 会被json.loads(response)[facts]解析再进入后续的更新决策。换句话说只要这个 LLM 通道不通Mem0 的 add/search 就都跑不起来。本文从接入配置的视角出发讲清楚一件事把 Mem0 的 LLM 客户端 Base URL 指向 TaoToken用 TaoToken 提供的 Key 和 API 地址来打通模型调用记忆抽取、向量存储、图存储仍然由 Mem0 自己完成。TaoToken 在这里只负责提供 Key 和 Base URL不替代 Mem0 的任何记忆逻辑。官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 先创建 Key 再往下配。TaoToken 在 Mem0 链路里的位置先把职责边界说清楚避免混淆。Mem0 的_add_to_vector_store里LLM 被调用了两次第一次是get_fact_retrieval_messages生成 system/user prompt 后调用self.llm.generate_response抽取 facts第二次是在冲突解决阶段用get_update_memory_messages构造 function calling prompt再调一次self.llm.generate_response决定每条记忆是 ADD、UPDATE、DELETE 还是 NONE。这两次调用都走同一个 LLM 客户端实例。TaoToken 要做的就是让这个 LLM 客户端能正常发出请求并拿到响应。它提供两样东西一个 API Key用于鉴权一个 Base URLhttps://taotoken.net/api注意Base URL 不要加/v1也不要带任何 UTM 参数。Mem0 的 LLM 客户端在构造请求时会自己拼接路径你只需要给它一个干净的根地址。记忆抽取、向量存储、图存储、冲突解决逻辑全部仍然由 Mem0 完成。TaoToken 不碰这些它只是模型调用的通道。可复制配置把 Mem0 的 LLM 客户端指向 TaoTokenMem0 的 LLM 配置方式取决于你用的是哪种客户端封装。下面给出两种常见写法按你的实际代码结构选用。方式一通过config传入 LLM 配置Mem0 的Memory初始化支持传入config其中llm字段可以指定 provider、config 等。如果你用的是 OpenAI 兼容的客户端封装可以这样配from mem0 import Memory config { llm: { provider: openai, config: { model: YOUR_MODEL_ID, api_key: YOUR_API_KEY, openai_base_url: https://taotoken.net/api } }, embedder: { provider: openai, config: { model: YOUR_EMBEDDING_MODEL_ID, api_key: YOUR_API_KEY, openai_base_url: https://taotoken.net/api } }, vector_store: { provider: qdrant, config: { host: localhost, port: 6333 } } } m Memory.from_config(config)关键点openai_base_url填https://taotoken.net/api不要写成https://taotoken.net/api/v1。api_key填你在 TaoToken 创建的 Key。model填你要用的模型 ID。方式二直接替换 LLM 客户端实例如果你在代码里手动构造了 LLM 客户端并赋给self.llm那就直接改客户端的 base_urlfrom openai import OpenAI client OpenAI( api_keyYOUR_API_KEY, base_urlhttps://taotoken.net/api ) # 假设 Mem0 的 Memory 实例允许注入 llm m Memory.from_config(config) m.llm.client client这种方式更直接适合你已经有一套自定义 LLM 封装、不想改 config 结构的情况。环境变量方式如果你的 Mem0 版本支持从环境变量读取 LLM 配置也可以这样export OPENAI_API_KEYYOUR_API_KEY export OPENAI_BASE_URLhttps://taotoken.net/api然后在代码里正常初始化 Mem0它会自动读取这两个变量。无论哪种方式核心就两点Key 用 TaoToken 的Base URL 用https://taotoken.net/api。验证请求跑一次 add确认 facts 能被解析配置改完之后不要急着跑完整业务先用最小用例验证 LLM 通道是否打通。第一步跑一次 addm.add( messages[ {role: user, content: 我喜欢用 Python 写后端平时喝美式咖啡。}, {role: assistant, content: 好的记住了。} ], user_idtest_user )如果 LLM 通道正常_add_to_vector_store里的self.llm.generate_response会返回一个 JSON形如{facts: [喜欢用 Python 写后端, 平时喝美式咖啡]}然后json.loads(response)[facts]能正常解析出列表进入后续的冲突解决和向量存储。第二步检查日志在_add_to_vector_store里Mem0 会打印或记录 LLM 返回的内容。如果你看到类似new_retrieved_facts有值说明信息提取成功。如果看到Empty response from LLM或Invalid JSON response说明 LLM 通道有问题回到上一步检查 Base URL 和 Key。第三步跑一次 searchresults m.search( query用户喜欢喝什么, user_idtest_user ) print(results)如果 search 能召回刚才写入的“美式咖啡”相关记忆说明整个链路——从 LLM 信息提取到向量存储再到检索——全部走通了。这也意味着 Mem0 的模型调用已经成功走 TaoToken。第四步确认冲突解决也走通再 add 一条相关但略有冲突的记忆m.add( messages[ {role: user, content: 其实我最近改喝拿铁了。}, {role: assistant, content: 好的更新了。} ], user_idtest_user )这次会触发第二次self.llm.generate_response调用用于决定是 UPDATE 还是 ADD。如果日志里能看到event: UPDATE或event: ADD说明冲突解决阶段的 LLM 调用也正常。本篇常见错排查错误一Base URL 带了/v1这是最常见的坑。Mem0 的 OpenAI 兼容客户端在发请求时会自己拼/chat/completions如果你把 Base URL 写成https://taotoken.net/api/v1最终请求路径会变成https://taotoken.net/api/v1/chat/completions导致 404 或路径不匹配。正确写法https://taotoken.net/api不加/v1。错误二Key 没配或配错self.llm.generate_response返回空字符串日志里出现Empty response from LLM。检查api_key是否填了 TaoToken 创建的 Key是否有多余空格是否用了过期的 Key。错误三模型 ID 写错请求发出去了但返回的是模型不存在的错误。检查model字段填的 ID 是否在 TaoToken 支持的模型列表里。不同模型 ID 对应不同的能力抽取 facts 建议用指令遵循能力较强的模型。错误四embedding 也走了同一个 Base URL 但模型不对Mem0 的embedding_model.embed和self.llm.generate_response是两个独立的调用。如果你把 embedder 也指向了 TaoToken要确保 embedding 模型 ID 填对。embedding 模型和 chat 模型不是一回事填错了会报错或返回异常向量。错误五_add_to_graph报错但被忽略add()里_add_to_vector_store和_add_to_graph是并发执行的。如果图存储没配好future2.result()可能抛异常但向量存储部分可能已经成功。检查日志里是否有 graph 相关的错误确认enable_graph是否符合预期。错误六JSON 解析失败LLM 返回的内容被remove_code_blocks处理后仍然无法json.loads。这通常是因为模型没有严格按 JSON 格式输出。可以在 prompt 里强调response_format{type: json_object}或者换一个指令遵循更强的模型。接入文档与 Key 管理如果你在配置过程中需要确认 Base URL 的准确写法、Key 的创建方式或者想了解 TaoToken 支持哪些模型 ID可以直接查接入文档和 API Keys 页面接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentmem0_llm_configutm_campaignrewriteAPI Keys 管理https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentmem0_llm_configutm_campaignrewrite如果你更习惯用 CLI 工具来管理配置也可以安装 TaoToken 的 CLInpm i -g taotoken/taotoken taotoken cc -k YOUR_API_KEY -u https://taotoken.net/api -m YOUR_MODEL_ID这条命令会帮你把 Claude Code 相关的配置写好适合你同时在用 Claude Code 做开发的场景。对于长期跑 Mem0 做记忆工程的场景如果调用量比较大可以看一下 Coding Plan 的额度方案https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentmem0_llm_configutm_campaignrewrite配置改完后想快速验证模型通道是否正常可以直接在模型对话页面发一条测试消息https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmem0_llm_configutm_campaignrewriteMem0 的记忆抽取、冲突解决、向量存储、图存储仍然由 Mem0 自己完成TaoToken 只负责提供 Key 和 Base URL。把self.llm.generate_response这条通道打通add/search 流程就不会再停在调用模型这一步。