[{"data":1,"prerenderedAt":4233},["ShallowReactive",2],{"docs-page-cn-\u002Fcn\u002Fusecase\u002Fknowledge_qa_assistant":3,"surround-cn-\u002Fcn\u002Fusecase\u002Fknowledge_qa_assistant":4224},{"id":4,"title":5,"avatar":6,"banner":6,"body":7,"category":6,"desc":4217,"description":135,"extension":4218,"links":6,"meta":4219,"navigation":6,"path":4220,"seo":4221,"stem":4222,"__hash__":4223},"docs\u002Fcn\u002Fusecase\u002Fknowledge_qa_assistant.md","构建记忆增强型的知识库问答助手",null,{"type":8,"value":9,"toc":4205},"minimark",[10,15,19,22,25,30,38,45,120,122,126,129,208,210,215,353,355,359,444,446,450,453,493,496,499,501,505,509,512,529,536,538,541,548,553,555,559,562,564,568,3918,3920,3924,3940,3942,3946,3951,3959,3964,3996,4000,4072,4076,4079,4084,4133,4136,4151,4156,4158,4162,4180,4201],[11,12,14],"h2",{"id":13},"_1-概述","1. 概述",[16,17,18],"p",{},"在 AI 应用开发中,构建一个能够理解上下文、记住历史交互的问答助手一直是核心需求。传统的大语言模型虽然强大,但缺乏长期记忆能力,每次对话都像\"失忆\"一样重新开始。RAG(检索增强生成)虽然能检索相关知识,但无法真正\"记住\"用户的偏好和历史交互。",[16,20,21],{},"MemOS提供了一个完整的记忆操作系统生态, 让 AI 应用具备真正的长期记忆能力。基于MemOS的知识库，结合提示词向AI大模型提供上下文信息，从而获得更精准和个性化的反馈。这种体验显著优于直接在互联网上与通用大模型对话",[23,24],"br",{},[26,27,29],"h3",{"id":28},"_11-memos记忆层vsrag核心区别","1.1 MemOS记忆层 vs RAG:核心区别",[16,31,32,33,37],{},"传统 RAG(检索增强生成)方案的核心问题在于:",[34,35,36],"strong",{},"它是无状态的","。每次查询都是独立的,系统只能基于语义相似度检索知识库中的静态信息,但无法记住\"你是谁\"、\"你之前说过什么\"、\"你的偏好是什么\"。这就像一个失忆的图书管理员,每次都要重新问你的需求,无法根据你的阅读历史提供个性化建议。",[16,39,40,41,44],{},"MemOS 记忆层的核心价值在于:",[34,42,43],{},"让 AI 应用拥有长期记忆能力","。它不仅能检索知识,更能理解关系、时间与偏好,将当前问题与历史记忆关联起来,在\"带着背景\"的前提下查找和使用知识。随着用户的持续使用,MemOS 会根据对话内容动态演化和更新记忆,从而推动知识库的自动迭代与自我进化。",[46,47,48,64],"table",{},[49,50,51],"thead",{},[52,53,54,58,61],"tr",{},[55,56,57],"th",{},"对比维度",[55,59,60],{},"传统 RAG 方案",[55,62,63],{},"MemOS 记忆层",[65,66,67,81,94,107],"tbody",{},[52,68,69,75,78],{},[70,71,72],"td",{},[34,73,74],{},"记忆能力",[70,76,77],{},"只能检索,不能记忆 - 基于向量相似度检索静态知识库,无法动态记录用户交互历史",[70,79,80],{},"动态记忆能力 - 自动捕获、存储和管理对话历史与用户行为",[52,82,83,88,91],{},[70,84,85],{},[34,86,87],{},"个性化",[70,89,90],{},"缺乏个性化 - 无法根据用户的历史行为调整回答策略",[70,92,93],{},"个性化体验 - 根据用户历史偏好提供定制化回答",[52,95,96,101,104],{},[70,97,98],{},[34,99,100],{},"上下文管理",[70,102,103],{},"上下文割裂 - 多轮对话中的关联信息难以有效管理",[70,105,106],{},"智能关联 - 基于语义理解建立记忆之间的关联关系",[52,108,109,114,117],{},[70,110,111],{},[34,112,113],{},"知识更新",[70,115,116],{},"知识更新困难 - 新增知识需要重新构建向量索引",[70,118,119],{},"实时更新 - 支持记忆的增量更新和优先级管理",[23,121],{},[26,123,125],{"id":124},"_12-真实场景对比企业知识库助手","1.2 真实场景对比: 企业知识库助手",[16,127,128],{},"让我们通过1个真实的业务场景,直观感受 RAG 和 MemOS 的核心差异:",[130,131,136],"pre",{"className":132,"code":133,"language":134,"meta":135,"style":135},"language-python shiki shiki-themes material-theme-lighter github-light-high-contrast github-dark-default","DAY 1 员工询问:我的电脑是 MacBook Pro 13寸,Intel 芯片。我怎么安装公司内网代理?\nDAY 1 助手提供了 Intel 版本的安装步骤。\nDAY 20 员工询问:内网代理打不开了,我该重新装哪个版本?\n","python","",[137,138,139,176,186],"code",{"__ignoreMap":135},[140,141,144,148,152,156,160,163,167,170,173],"span",{"class":142,"line":143},"line",1,[140,145,147],{"class":146},"sZaqd","DAY",[140,149,151],{"class":150},"sJNII"," 1",[140,153,155],{"class":154},"s5ojA"," 员工询问",[140,157,159],{"class":158},"suWxN",":",[140,161,162],{"class":154},"我的电脑是 MacBook Pro ",[140,164,166],{"class":165},"ssLBp","13寸",[140,168,169],{"class":158},",",[140,171,172],{"class":154},"Intel 芯片。我怎么安装公司内网代理",[140,174,175],{"class":165},"?\n",[140,177,179,181,183],{"class":142,"line":178},2,[140,180,147],{"class":146},[140,182,151],{"class":150},[140,184,185],{"class":154}," 助手提供了 Intel 版本的安装步骤。\n",[140,187,189,191,194,196,198,201,203,206],{"class":142,"line":188},3,[140,190,147],{"class":146},[140,192,193],{"class":150}," 20",[140,195,155],{"class":154},[140,197,159],{"class":158},[140,199,200],{"class":154},"内网代理打不开了",[140,202,169],{"class":158},[140,204,205],{"class":154},"我该重新装哪个版本",[140,207,175],{"class":165},[23,209],{},[211,212,214],"h4",{"id":213},"rag方案的问题","RAG 方案的问题",[130,216,218],{"className":132,"code":217,"language":134,"meta":135,"style":135},"# 根据用户发言检索\"内网代理\"\"打不开\"相关内容,但无法召回\"用户的设备型号\"\n检索到知识:\n1. 内网代理常见故障排查\n2. M1\u002FM2(ARM)版本的内网代理安装说明\n3. Windows 内网代理客户端安装说明\n4. 网络连接与证书问题\n5. 通用 FAQ\n\n❌ 知识库助手:请尝试重新下载安装最新的Mac M1\u002FM2(ARM)版本或Windows的内网代理客户端。以下是安装步骤:...\n",[137,219,220,226,234,246,278,292,303,317,324],{"__ignoreMap":135},[140,221,222],{"class":142,"line":143},[140,223,225],{"class":224},"sfVK4","# 根据用户发言检索\"内网代理\"\"打不开\"相关内容,但无法召回\"用户的设备型号\"\n",[140,227,228,231],{"class":142,"line":178},[140,229,230],{"class":154},"检索到知识",[140,232,233],{"class":158},":\n",[140,235,236,239,242],{"class":142,"line":188},[140,237,238],{"class":150},"1",[140,240,241],{"class":158},".",[140,243,245],{"class":244},"s5qkx"," 内网代理常见故障排查\n",[140,247,249,252,254,257,261,265,268,272,275],{"class":142,"line":248},4,[140,250,251],{"class":150},"2",[140,253,241],{"class":158},[140,255,256],{"class":244}," M1",[140,258,260],{"class":259},"saN0X","\u002F",[140,262,264],{"class":263},"sa-2m","M2",[140,266,267],{"class":158},"(",[140,269,271],{"class":270},"svxCd","ARM",[140,273,274],{"class":158},")",[140,276,277],{"class":154},"版本的内网代理安装说明\n",[140,279,281,284,286,289],{"class":142,"line":280},5,[140,282,283],{"class":150},"3",[140,285,241],{"class":158},[140,287,288],{"class":244}," Windows",[140,290,291],{"class":154}," 内网代理客户端安装说明\n",[140,293,295,298,300],{"class":142,"line":294},6,[140,296,297],{"class":150},"4",[140,299,241],{"class":158},[140,301,302],{"class":244}," 网络连接与证书问题\n",[140,304,306,309,311,314],{"class":142,"line":305},7,[140,307,308],{"class":150},"5",[140,310,241],{"class":158},[140,312,313],{"class":244}," 通用",[140,315,316],{"class":146}," FAQ\n",[140,318,320],{"class":142,"line":319},8,[140,321,323],{"emptyLinePlaceholder":322},true,"\n",[140,325,327,330,332,335,337,339,341,343,345,348,350],{"class":142,"line":326},9,[140,328,329],{"class":154},"❌ 知识库助手",[140,331,159],{"class":158},[140,333,334],{"class":154},"请尝试重新下载安装最新的Mac M1",[140,336,260],{"class":259},[140,338,264],{"class":263},[140,340,267],{"class":158},[140,342,271],{"class":270},[140,344,274],{"class":158},[140,346,347],{"class":154},"版本或Windows的内网代理客户端。以下是安装步骤",[140,349,159],{"class":158},[140,351,352],{"class":146},"...\n",[23,354],{},[211,356,358],{"id":357},"memos方案的优势","MemOS方案的优势",[130,360,362],{"className":132,"code":361,"language":134,"meta":135,"style":135},"# 根据员工问题检索\"内网代理\"\"打不开\"相关记忆,自动识别该员工的设备型号\n检索到记忆:\n1. 用户在20天前安装了公司内网代理,他的设备是 MacBook Pro 13(Intel)\n2. 内网代理常见故障排查\n3. Intel 版本的内网代理安装说明\n\n✅ 知识库助手:你使用的是 Intel 芯片的 MacBook Pro,建议重新安装 Intel 版本 的内网代理客户端。以下是 Intel 版的下载链接和安装步骤:...\n",[137,363,364,369,376,401,409,421,425],{"__ignoreMap":135},[140,365,366],{"class":142,"line":143},[140,367,368],{"class":224},"# 根据员工问题检索\"内网代理\"\"打不开\"相关记忆,自动识别该员工的设备型号\n",[140,370,371,374],{"class":142,"line":178},[140,372,373],{"class":154},"检索到记忆",[140,375,233],{"class":158},[140,377,378,380,382,385,387,390,393,395,398],{"class":142,"line":188},[140,379,238],{"class":150},[140,381,241],{"class":158},[140,383,384],{"class":244}," 用户在20天前安装了公司内网代理",[140,386,169],{"class":158},[140,388,389],{"class":154},"他的设备是 MacBook Pro ",[140,391,392],{"class":150},"13",[140,394,267],{"class":158},[140,396,397],{"class":154},"Intel",[140,399,400],{"class":158},")\n",[140,402,403,405,407],{"class":142,"line":248},[140,404,251],{"class":150},[140,406,241],{"class":158},[140,408,245],{"class":244},[140,410,411,413,415,418],{"class":142,"line":280},[140,412,283],{"class":150},[140,414,241],{"class":158},[140,416,417],{"class":244}," Intel",[140,419,420],{"class":154}," 版本的内网代理安装说明\n",[140,422,423],{"class":142,"line":294},[140,424,323],{"emptyLinePlaceholder":322},[140,426,427,430,432,435,437,440,442],{"class":142,"line":305},[140,428,429],{"class":154},"✅ 知识库助手",[140,431,159],{"class":158},[140,433,434],{"class":154},"你使用的是 Intel 芯片的 MacBook Pro",[140,436,169],{"class":158},[140,438,439],{"class":154},"建议重新安装 Intel 版本 的内网代理客户端。以下是 Intel 版的下载链接和安装步骤",[140,441,159],{"class":158},[140,443,352],{"class":146},[23,445],{},[26,447,449],{"id":448},"_13-为什么使用memos","1.3 为什么使用MemOS？",[16,451,452],{},"通过上述真实场景,我们可以清晰看到 MemOS 相比传统 RAG 的三大核心优势:",[454,455,456,468,488],"ol",{},[457,458,459,462,464,465,467],"li",{},[34,460,461],{},"懂用户:自动补全上下文",[23,463],{},"RAG 擅长从知识库中检索与查询语义相似的信息,但它是无状态的:每一次查询都是独立的,缺乏对具体用户和上下文的理解。用户必须在每次对话中重复说明背景信息。",[23,466],{},"MemOS 能够理解关系、时间与偏好等信息,知道\"你是谁\"、\"在做什么\"。只需提出问题,MemOS 会自动补全上下文,无需重复说明\"我家狗狗不吃鸡肉\"或\"我的电脑是 Intel 芯片\"。",[457,469,470,473,475,476,478,479,481,482,484,485,487],{},[34,471,472],{},"个性化:记住用户习惯与偏好",[23,474],{},"不同岗位和工作习惯的用户,需要不同的服务方式。MemOS 能记住:",[23,477],{},"\"这个客户不喜欢过于激进的推销\"",[23,480],{},"\"你更常使用 Python 而非 Java\"",[23,483],{},"\"你上次咨询过报销政策,这次是否需要进入申请流程\"",[23,486],{},"这种个性化能力让 AI 应用真正成为\"你的\"助手,而不是一个通用工具。",[457,489,490],{},[34,491,492],{},"知识进化:从交互中持续学习",[16,494,495],{},"当实际流程中存在未写入文档的\"经验规则\"时,MemOS 会将其沉淀为新的记忆,持续补全和完善知识体系。随着终端用户的持续使用,MemOS 会根据对话内容动态演化和更新记忆,让知识库成为\"记忆\"的一部分,而不仅是静态文档的存储。",[16,497,498],{},"在此基础上，MemOS 2.0 提供的知识库以及多模态的能力，支持开发者将业务文档接入MemOS，结合开源大模型，可以快速搭建一个懂用户的问答助手",[23,500],{},[11,502,504],{"id":503},"_2-搭建教程","2. 搭建教程",[26,506,508],{"id":507},"_21知识库准备5min","2.1 知识库准备(5min)",[211,510,511],{"id":511},"创建知识库",[16,513,514,515,522,523,528],{},"通过",[516,517,521],"a",{"href":518,"rel":519},"https:\u002F\u002Fmemos-dashboard.openmem.net\u002Fcn\u002FknowledgeBase\u002F",[520],"nofollow","控制台","或API创建知识库， 本文是基于",[516,524,527],{"href":525,"rel":526},"https:\u002F\u002Fgithub.com\u002FMemTensor\u002FMemOS-Docs",[520],"MemOS的官方文档","、记忆张量过去宣发的文章以及发布说明进行了知识库的分类，便于后续更新和管理，在此示例中，您可以只创建1个知识库，并上传部分文档用于测试",[16,530,531],{},[532,533],"img",{"alt":534,"src":535},"image.png","https:\u002F\u002Fcdn.memtensor.com.cn\u002Fimg\u002F1768481403940_o97qz4_compressed.png",[23,537],{},[211,539,540],{"id":540},"上传文档",[16,542,543,544,547],{},"进入知识库，上传文档，要注意文档的要求，MemOS-Docs都是MD格式，可基于AI一键转换为TXT格式，再进行上传，上传时需关注文档要求，剩下的",[34,545,546],{},"存储，解析，分段，生成记忆","全部交给MemOS，你只需静静等待文档处理完毕，直到状态显示「可用」",[16,549,550],{},[532,551],{"alt":534,"src":552},"https:\u002F\u002Fcdn.memtensor.com.cn\u002Fimg\u002F1768481436752_31pl0b_compressed.png",[23,554],{},[26,556,558],{"id":557},"_22运行代码5min","2.2 运行代码(5min)",[16,560,561],{},"以下代码示例基于python运行环境进行展示",[23,563],{},[211,565,567],{"id":566},"_221-拷贝完整运行代码","2.2.1 拷贝完整运行代码",[130,569,571],{"className":132,"code":570,"language":134,"meta":135,"style":135},"import os\nimport requests\nimport json\nfrom openai import OpenAI\nfrom datetime import datetime\n\n# 从云服务控制台获取MemOS_API_KEY\nos.environ[\"MEMOS_API_KEY\"] = \"mpg-xxx\" \n# 替换为你自己的API_KEY\nos.environ[\"OPENAI_API_KEY\"] = \"sk-xxx\" \nos.environ[\"MEMOS_BASE_URL\"] = \"https:\u002F\u002Fmemos.memtensor.cn\u002Fapi\u002Fopenmem\u002Fv1\"\n# 替换为你自己的知识库ID，以下ID仅为示例，并非真实知识库ID\nos.environ[\"KNOWLEDGE_BASE_IDS\"] = json.dumps([\n  \"based540fb25-ddf1-4456-935b-41d901518e04\", \n  \"base3908d457-da43-4dde-989e-020be132eff4\",\n  \"base1db3a7ea-6ecc-4925-881a-e87800da8d2e\"\n])\n\nopenai_client = OpenAI(api_key=os.getenv(\"OPENAI_API_KEY\"))\n\nclass KnowledgeBaseAssistant:\n    \n    def __init__(self):\n        self.openai_client = openai_client\n        self.base_url = os.getenv(\"MEMOS_BASE_URL\")\n        self.knowledge_base_ids = json.loads(os.getenv(\"KNOWLEDGE_BASE_IDS\"))\n        self.headers = {\n          \"Content-Type\": \"application\u002Fjson\",\n          \"Authorization\": f\"Token {os.environ['MEMOS_API_KEY']}\"\n        }\n    \n    def search_memory(self, query, user_id):\n      \"\"\"查询相关记忆\"\"\"\n      data = {\n        \"query\": query,\n        \"user_id\": user_id,\n        \"conversation_id\": user_id,\n        \"knowledgebase_ids\": self.knowledge_base_ids\n      }\n      res = requests.post(f\"{self.base_url}\u002Fsearch\u002Fmemory\", headers=self.headers, data=json.dumps(data))\n      \n      if res.json().get('code') != 0:\n        print(f\"❌ 查询记忆失败, {res.json().get('message')}\")\n        return [], []\n\n      memory_detail_list_raw = res.json().get('data').get('memory_detail_list', [])\n      # 过滤掉相关性小于0.5的记忆\n      memory_detail_list = [\n          x for x in memory_detail_list_raw \n          if x.get('relativity', 0) >= 0.5\n      ]\n      preference_detail_list = res.json().get('data').get('preference_detail_list')\n\n      return memory_detail_list, preference_detail_list\n\n    def build_system_prompt(self, memories, preferences):\n        \"\"\"构建包含格式化记忆的系统提示\"\"\"\n        base_prompt = \"\"\"\n          # Role\n          你是 MemOS 智能助手，昵称小忆🧚 — 一个由 MemTensor 创建的「记忆操作系统」AI助手。MemTensor 是一家位于上海的人工智能研究公司，由中国科学院院士指导。MemTensor 致力于'低成本、低幻觉、高泛化'的愿景，探索符合中国国情的人工智能发展路径，推动可信人工智能技术的应用。MemOS 的使命是为大语言模型（LLMs）和自主智能体赋予「类人长期记忆」，将记忆从模型权重中的黑盒转变为「可管理、可调度、可审计」的核心资源。你的回应必须符合法律和道德标准，遵守相关法律法规，不得生成非法、有害或有偏见的内容。如果遇到此类请求，模型应明确拒绝并解释背后的法律或道德原则。你的目标是结合检索到的记忆片段，为用户提供高度个性化、准确且逻辑严密的回答。\n\n          # System Context\n          - 当前时间: {current_time} (请以此作为判断记忆时效性的基准)\n\n          # Memory Data\n          以下是 MemOS 检索到的相关信息，分为“事实”和“偏好”。\n          - **事实 (Facts)**：可能包含用户属性、历史对话记录或第三方信息。\n            - **特别注意**：其中标记为 `[assistant观点]`、`[模型总结]` 的内容代表 **AI 过去的推断**，**并非**用户的原话。\n          - **偏好 (Preferences)**：用户对回答风格、格式或逻辑的显式\u002F隐式要求。\n\n          \u003Cmemories>\n          {memories}\n          \u003C\u002Fmemories>\n\n\n          \u003Cpreferences>\n          {preferences}\n          \u003C\u002Fpreferences>\n\n          # Critical Protocol: Memory Safety (记忆安全协议)\n          检索到的记忆可能包含**AI 自身的推测**、**无关噪音**或**主体错误**。你必须严格执行以下**“四步判决”**，只要有一步不通过，就**丢弃**该条记忆：\n\n          1. **来源真值检查 (Source Verification)**：\n            - **核心**：区分“用户原话”与“AI 推测”。\n            - 如果记忆带有 '[assistant观点]' 等标签，这仅代表AI过去的**假设**，**不可**将其视为用户的绝对事实。\n            - *反例*：记忆显示 '[assistant观点] 用户酷爱芒果'。如果用户没提，不要主动假设用户喜欢芒果，防止循环幻觉。\n            - **原则：AI 的总结仅供参考，权重大幅低于用户的直接陈述。**\n\n          2. **主语归因检查 (Attribution Check)**：\n            - 记忆中的行为主体是“用户本人”吗？\n            - 如果记忆描述的是**第三方**（如“候选人”、“面试者”、“虚构角色”、“案例数据”），**严禁**将其属性归因于用户。\n\n          3. **强相关性检查 (Relevance Check)**：\n            - 记忆是否直接有助于回答当前的 'Original Query'？\n            - 如果记忆仅仅是关键词匹配（如：都提到了“代码”）但语境完全不同，**必须忽略**。\n\n          4. **时效性检查 (Freshness Check)**：\n            - 记忆内容是否与用户的最新意图冲突？以当前的 'Original Query' 为最高事实标准。\n\n\n          # Instructions\n            1. **审视**：先阅读 `facts memories`，执行“四步判决”，剔除噪音和不可靠的 AI 观点。\n            2. **执行**：\n              - **优先采用知识库中的专业建议**（如产品选型、技术方案）\n              - 仅使用通过筛选的记忆补充背景。\n              - 严格遵守 `preferences` 中的风格要求。\n            3. **输出**：\n              - 直接回答问题，**严禁**提及“记忆库”、“检索”或“AI 观点”等系统内部术语。\n              - 如果回应内容不在当前知识库\u002F记忆系统中，你必须直接明确地告知用户。在任何情况下都不要编造信息或给出模糊的回应。\n            4. **语言**：回答语言应与用户查询语言一致。\n\n          # Markdown 格式转换要求\n          - 当你需要将给定的 Markdown（MD）格式文本转换为纯文本时，你必须严格遵循以下要求，以确保清晰的可读性和无格式错误：\n          - 核心格式适配要求：微信不支持原生 MD 语法（如 #标题、粗体文本、代码块、表格）。你必须使用'符号 + 换行 + 空格'来模拟层级结构，避免使用微信无法识别的标记；\"\n          - 标题层级处理：首先，检查原文是否包含 Markdown 标题格式（以 # 开头的行）。如果有：一级标题（最高级）使用中文数字序号，如' 一. '、' 二. '、' 三. '（注意：使用'.'而不是'、'）；二级标题（比最高级多一个 #）使用阿拉伯数字序号，如'1. '、'2. '、'3. '；三级标题（比最高级多两个 #）及以下使用'・'符号作为无序列表。序号必须根据文档结构自动递增以保持一致的层级。如果没有：不添加任何标题序号，保持原有段落结构不变。示例：原 MD 标题 '### 标题 1' → ' 一. 标题 1'；原 MD 标题 '#### 标题 2' → '1. 标题 2'；原 MD 标题 '##### 标题 3' → '・标题 3'；当原文中没有 MD 标题时，'标题 1'保持为'标题 1'；\n          - 链接处理：保持'文本'格式的 Markdown 链接不变。不要修改或删除任何链接内容（示例：MemOS 文档保持为 MemOS 文档）；\"\n          - 列表处理：统一将'- 内容'格式的 MD 列表转换为有序列表（如'1. 内容'、'2. 内容'）或无序列表（使用'・'符号，如'・内容'）。每个列表项必须单独成行，前后各留 1 个空行以提高可读性；\"\n          - 表格替换：如果原 MD 包含表格，将其分解为'▶ 场景类型 A：XXX'、'▶ 场景类型 B：XXX'格式的要点。在每个类别下，使用'1. 2. 3. '列出相应内容，确保不遗漏信息且不保留表格符号；\"\n          - 强调关键内容：不使用 * 或 ** 符号，用'「XXX」'（中文双引号）替换原 MD 中的粗体内容；\"\n          - 优化阅读体验：在主要段落之间留 1 个空行（如' 一. XXX'、' 二. XXX'）。对于原 MD 中过长的技术术语或复杂描述，用更口语化的表达简化，但不改变原意；使用中文符号作为所有分隔符（如 ▶、・、：），避免中英文符号混用导致格式混乱；\"\n          - 输出要求：仅输出转换后的纯文本；不包含额外说明（如'转换完成'）；不修改原始内容 — 仅替换格式；确保 100% 保留原 MD 的核心信息（如比较维度、功能点、链接、数据）不遗漏或改变；最终文本必须可以直接复制发送，无需进一步编辑。\"\n          \"\"\"\n\n        # 构造记忆文本（允许为空）\n        if len(memories) > 0:\n            formatted_memories = \"## 相关记忆:\\n\"\n            for i, memory in enumerate(memories, 1):\n                formatted_memories += f\"{i}. {memory.get('memory_value')}\\n\"\n        else:\n            formatted_memories = \"\"\n\n        # 构造偏好文本（允许为空）\n        if len(preferences) > 0:\n            formatted_preferences = \"## 偏好:\\n\"\n            for i, preference_detail in enumerate(preferences, 1):\n                formatted_preferences += f\"{i}. {preference_detail.get('preference')}\\n\"\n        else:\n            formatted_preferences = \"\"\n\n        base_prompt = base_prompt.format(\n            current_time=datetime.now().strftime('%Y-%m-%d %H:%M:%S'),\n            memories=formatted_memories,\n            preferences=formatted_preferences,\n        )\n\n        return base_prompt\n\n    def add_message(self, messages, user_id):\n      \"\"\"添加消息\"\"\"\n      data = {\n        \"messages\": messages,\n        \"user_id\": user_id,\n        \"conversation_id\": user_id\n      }\n\n      res = requests.post(f\"{self.base_url}\u002Fadd\u002Fmessage\", headers=self.headers, data=json.dumps(data))\n\n      if res.json().get('code') == 0:\n        print(f\"✅ 添加成功\")\n      else:\n        print(f\"❌ 添加失败, {res.json().get('message')}\")\n\n\n    def get_message(self, user_id):\n        \"\"\"获取消息\"\"\"\n        data = {\n          \"user_id\": user_id,\n          \"conversation_id\": user_id,\n          \"message_limit_number\": 15\n        }\n        res = requests.post(f\"{self.base_url}\u002Fget\u002Fmessage\", headers=self.headers, data=json.dumps(data))\n        \n        if res.json().get('code') == 0:\n          return res.json().get('data').get('message_detail_list')\n        else:\n          print(f\"❌ 获取消息失败, {res.json().get('message')}\")\n          return []\n       \n    def chat(self, query, user_id):\n        \"\"\"处理包含记忆集成的对话的主要聊天函数\"\"\"\n        # 1. 查询近期会话\n        chat_history = self.get_message(user_id)\n        \n        # 2. 搜索相关记忆\n        memories, preferences = self.search_memory(query, user_id)\n\n        # 3. 构建包含记忆的系统提示\n        system_prompt = self.build_system_prompt(memories, preferences)\n        \n        messages = [\n          {\"role\": \"system\", \"content\": system_prompt},\n          *chat_history,\n          {\"role\": \"user\", \"content\": query}\n        ]\n\n        # 4. 使用OpenAI生成回答\n        response = self.openai_client.chat.completions.create(\n            model=\"gpt-4o\",\n            messages=messages,\n            temperature=0.3,\n            top_p=0.9\n        )\n        answer = response.choices[0].message.content\n\n        # 5. 将对话保存到记忆中\n        messages = [\n            {\"role\": \"user\", \"content\": query},\n            {\"role\": \"assistant\", \"content\": answer}\n        ]\n        self.add_message(messages, user_id)\n\n        # 6. 返回回答\n        return answer\n\nai_assistant = KnowledgeBaseAssistant()\nuser_id = \"memos_knowledge_base_user_123\"\n\ndef demo_questions():\n    return [\n      '你是谁'\n    ]\n\ndef main():\n    print(\"💡 欢迎使用知识库问答助手！\\n\")\n    print(\"\\n🎯 以下是一些示例问题，您可以继续跟助手对话:\")\n    for i, question in enumerate(demo_questions(), 1):\n      print(f\"  {i}. {question}\")\n\n    while True:\n        user_query = input(\"\\n🤔 请输入您的问题 (或输入 'exit' 退出): \").strip()\n        \n        if user_query.lower() in ['quit', 'exit', 'q', '退出']:\n            print(\"👋 感谢使用知识库问答助手！\")\n            break\n        \n        if not user_query:\n            continue\n        \n        print(\"🤖 正在处理...\")\n        answer = ai_assistant.chat(user_query, user_id)\n        print(f\"💡 [助手]: {answer}\")\n        print(\"-\" * 60)\n\n\nif __name__ == \"__main__\":\n    main()\n\n",[137,572,573,582,589,596,609,621,625,630,670,675,706,736,742,775,790,803,813,819,824,862,867,880,886,904,920,949,986,1001,1023,1067,1073,1078,1104,1118,1128,1145,1161,1177,1197,1203,1273,1279,1316,1359,1371,1376,1421,1427,1438,1456,1490,1496,1537,1542,1556,1561,1585,1596,1607,1613,1619,1624,1630,1642,1647,1653,1659,1665,1671,1677,1682,1688,1694,1700,1705,1710,1716,1722,1728,1733,1739,1745,1750,1756,1762,1768,1774,1780,1785,1791,1797,1803,1808,1814,1820,1826,1831,1837,1843,1848,1853,1859,1865,1871,1877,1883,1889,1895,1901,1907,1913,1918,1924,1930,1936,1942,1948,1954,1960,1966,1972,1978,1984,1989,1995,2018,2037,2066,2115,2123,2133,2138,2144,2164,2181,2207,2253,2260,2269,2274,2292,2331,2344,2357,2363,2368,2376,2381,2404,2414,2423,2439,2454,2468,2473,2478,2540,2545,2577,2591,2599,2639,2644,2649,2667,2677,2687,2702,2717,2732,2737,2800,2806,2837,2876,2883,2924,2931,2937,2959,2969,2975,2996,3001,3007,3037,3042,3048,3073,3078,3088,3127,3138,3173,3179,3184,3190,3221,3238,3250,3263,3274,3279,3310,3315,3321,3330,3364,3399,3404,3424,3429,3435,3443,3448,3461,3476,3481,3493,3501,3513,3519,3524,3534,3553,3571,3600,3632,3637,3649,3678,3683,3743,3760,3766,3771,3783,3789,3794,3810,3835,3858,3880,3885,3890,3910],{"__ignoreMap":135},[140,574,575,579],{"class":142,"line":143},[140,576,578],{"class":577},"sBMTB","import",[140,580,581],{"class":154}," os\n",[140,583,584,586],{"class":142,"line":178},[140,585,578],{"class":577},[140,587,588],{"class":154}," requests\n",[140,590,591,593],{"class":142,"line":188},[140,592,578],{"class":577},[140,594,595],{"class":154}," json\n",[140,597,598,601,604,606],{"class":142,"line":248},[140,599,600],{"class":577},"from",[140,602,603],{"class":154}," openai ",[140,605,578],{"class":577},[140,607,608],{"class":154}," OpenAI\n",[140,610,611,613,616,618],{"class":142,"line":280},[140,612,600],{"class":577},[140,614,615],{"class":154}," datetime ",[140,617,578],{"class":577},[140,619,620],{"class":154}," datetime\n",[140,622,623],{"class":142,"line":294},[140,624,323],{"emptyLinePlaceholder":322},[140,626,627],{"class":142,"line":305},[140,628,629],{"class":224},"# 从云服务控制台获取MemOS_API_KEY\n",[140,631,632,635,637,640,643,647,651,653,656,659,662,665,667],{"class":142,"line":319},[140,633,634],{"class":154},"os",[140,636,241],{"class":158},[140,638,639],{"class":244},"environ",[140,641,642],{"class":158},"[",[140,644,646],{"class":645},"sjUum","\"",[140,648,650],{"class":649},"sp1uZ","MEMOS_API_KEY",[140,652,646],{"class":645},[140,654,655],{"class":158},"]",[140,657,658],{"class":259}," =",[140,660,661],{"class":645}," \"",[140,663,664],{"class":649},"mpg-xxx",[140,666,646],{"class":645},[140,668,669],{"class":154}," \n",[140,671,672],{"class":142,"line":326},[140,673,674],{"class":224},"# 替换为你自己的API_KEY\n",[140,676,678,680,682,684,686,688,691,693,695,697,699,702,704],{"class":142,"line":677},10,[140,679,634],{"class":154},[140,681,241],{"class":158},[140,683,639],{"class":244},[140,685,642],{"class":158},[140,687,646],{"class":645},[140,689,690],{"class":649},"OPENAI_API_KEY",[140,692,646],{"class":645},[140,694,655],{"class":158},[140,696,658],{"class":259},[140,698,661],{"class":645},[140,700,701],{"class":649},"sk-xxx",[140,703,646],{"class":645},[140,705,669],{"class":154},[140,707,709,711,713,715,717,719,722,724,726,728,730,733],{"class":142,"line":708},11,[140,710,634],{"class":154},[140,712,241],{"class":158},[140,714,639],{"class":244},[140,716,642],{"class":158},[140,718,646],{"class":645},[140,720,721],{"class":649},"MEMOS_BASE_URL",[140,723,646],{"class":645},[140,725,655],{"class":158},[140,727,658],{"class":259},[140,729,661],{"class":645},[140,731,732],{"class":649},"https:\u002F\u002Fmemos.memtensor.cn\u002Fapi\u002Fopenmem\u002Fv1",[140,734,735],{"class":645},"\"\n",[140,737,739],{"class":142,"line":738},12,[140,740,741],{"class":224},"# 替换为你自己的知识库ID，以下ID仅为示例，并非真实知识库ID\n",[140,743,745,747,749,751,753,755,758,760,762,764,767,769,772],{"class":142,"line":744},13,[140,746,634],{"class":154},[140,748,241],{"class":158},[140,750,639],{"class":244},[140,752,642],{"class":158},[140,754,646],{"class":645},[140,756,757],{"class":649},"KNOWLEDGE_BASE_IDS",[140,759,646],{"class":645},[140,761,655],{"class":158},[140,763,658],{"class":259},[140,765,766],{"class":154}," json",[140,768,241],{"class":158},[140,770,771],{"class":263},"dumps",[140,773,774],{"class":158},"([\n",[140,776,778,781,784,786,788],{"class":142,"line":777},14,[140,779,780],{"class":645},"  \"",[140,782,783],{"class":649},"based540fb25-ddf1-4456-935b-41d901518e04",[140,785,646],{"class":645},[140,787,169],{"class":158},[140,789,669],{"class":263},[140,791,793,795,798,800],{"class":142,"line":792},15,[140,794,780],{"class":645},[140,796,797],{"class":649},"base3908d457-da43-4dde-989e-020be132eff4",[140,799,646],{"class":645},[140,801,802],{"class":158},",\n",[140,804,806,808,811],{"class":142,"line":805},16,[140,807,780],{"class":645},[140,809,810],{"class":649},"base1db3a7ea-6ecc-4925-881a-e87800da8d2e",[140,812,735],{"class":645},[140,814,816],{"class":142,"line":815},17,[140,817,818],{"class":158},"])\n",[140,820,822],{"class":142,"line":821},18,[140,823,323],{"emptyLinePlaceholder":322},[140,825,827,830,833,836,838,842,844,846,848,851,853,855,857,859],{"class":142,"line":826},19,[140,828,829],{"class":154},"openai_client ",[140,831,832],{"class":259},"=",[140,834,835],{"class":263}," OpenAI",[140,837,267],{"class":158},[140,839,841],{"class":840},"sp4zP","api_key",[140,843,832],{"class":259},[140,845,634],{"class":263},[140,847,241],{"class":158},[140,849,850],{"class":263},"getenv",[140,852,267],{"class":158},[140,854,646],{"class":645},[140,856,690],{"class":649},[140,858,646],{"class":645},[140,860,861],{"class":158},"))\n",[140,863,865],{"class":142,"line":864},20,[140,866,323],{"emptyLinePlaceholder":322},[140,868,870,874,878],{"class":142,"line":869},21,[140,871,873],{"class":872},"sZ6T4","class",[140,875,877],{"class":876},"saonL"," KnowledgeBaseAssistant",[140,879,233],{"class":158},[140,881,883],{"class":142,"line":882},22,[140,884,885],{"class":154},"    \n",[140,887,889,892,895,897,901],{"class":142,"line":888},23,[140,890,891],{"class":872},"    def",[140,893,894],{"class":270}," __init__",[140,896,267],{"class":158},[140,898,900],{"class":899},"sZhmI","self",[140,902,903],{"class":158},"):\n",[140,905,907,910,912,915,917],{"class":142,"line":906},24,[140,908,909],{"class":146},"        self",[140,911,241],{"class":158},[140,913,914],{"class":244},"openai_client",[140,916,658],{"class":259},[140,918,919],{"class":154}," openai_client\n",[140,921,923,925,927,930,932,935,937,939,941,943,945,947],{"class":142,"line":922},25,[140,924,909],{"class":146},[140,926,241],{"class":158},[140,928,929],{"class":244},"base_url",[140,931,658],{"class":259},[140,933,934],{"class":154}," os",[140,936,241],{"class":158},[140,938,850],{"class":263},[140,940,267],{"class":158},[140,942,646],{"class":645},[140,944,721],{"class":649},[140,946,646],{"class":645},[140,948,400],{"class":158},[140,950,952,954,956,959,961,963,965,968,970,972,974,976,978,980,982,984],{"class":142,"line":951},26,[140,953,909],{"class":146},[140,955,241],{"class":158},[140,957,958],{"class":244},"knowledge_base_ids",[140,960,658],{"class":259},[140,962,766],{"class":154},[140,964,241],{"class":158},[140,966,967],{"class":263},"loads",[140,969,267],{"class":158},[140,971,634],{"class":263},[140,973,241],{"class":158},[140,975,850],{"class":263},[140,977,267],{"class":158},[140,979,646],{"class":645},[140,981,757],{"class":649},[140,983,646],{"class":645},[140,985,861],{"class":158},[140,987,989,991,993,996,998],{"class":142,"line":988},27,[140,990,909],{"class":146},[140,992,241],{"class":158},[140,994,995],{"class":244},"headers",[140,997,658],{"class":259},[140,999,1000],{"class":158}," {\n",[140,1002,1004,1007,1010,1012,1014,1016,1019,1021],{"class":142,"line":1003},28,[140,1005,1006],{"class":645},"          \"",[140,1008,1009],{"class":649},"Content-Type",[140,1011,646],{"class":645},[140,1013,159],{"class":158},[140,1015,661],{"class":645},[140,1017,1018],{"class":649},"application\u002Fjson",[140,1020,646],{"class":645},[140,1022,802],{"class":158},[140,1024,1026,1028,1031,1033,1035,1038,1041,1045,1047,1049,1051,1053,1056,1058,1060,1062,1065],{"class":142,"line":1025},29,[140,1027,1006],{"class":645},[140,1029,1030],{"class":649},"Authorization",[140,1032,646],{"class":645},[140,1034,159],{"class":158},[140,1036,1037],{"class":872}," f",[140,1039,1040],{"class":649},"\"Token ",[140,1042,1044],{"class":1043},"scyET","{",[140,1046,634],{"class":154},[140,1048,241],{"class":158},[140,1050,639],{"class":244},[140,1052,642],{"class":158},[140,1054,1055],{"class":645},"'",[140,1057,650],{"class":649},[140,1059,1055],{"class":645},[140,1061,655],{"class":158},[140,1063,1064],{"class":1043},"}",[140,1066,735],{"class":649},[140,1068,1070],{"class":142,"line":1069},30,[140,1071,1072],{"class":158},"        }\n",[140,1074,1076],{"class":142,"line":1075},31,[140,1077,885],{"class":154},[140,1079,1081,1083,1087,1089,1091,1093,1097,1099,1102],{"class":142,"line":1080},32,[140,1082,891],{"class":872},[140,1084,1086],{"class":1085},"sbcIq"," search_memory",[140,1088,267],{"class":158},[140,1090,900],{"class":899},[140,1092,169],{"class":158},[140,1094,1096],{"class":1095},"sM07a"," query",[140,1098,169],{"class":158},[140,1100,1101],{"class":1095}," user_id",[140,1103,903],{"class":158},[140,1105,1107,1111,1115],{"class":142,"line":1106},33,[140,1108,1110],{"class":1109},"s9tbJ","      \"\"\"",[140,1112,1114],{"class":1113},"soLfw","查询相关记忆",[140,1116,1117],{"class":1109},"\"\"\"\n",[140,1119,1121,1124,1126],{"class":142,"line":1120},34,[140,1122,1123],{"class":154},"      data ",[140,1125,832],{"class":259},[140,1127,1000],{"class":158},[140,1129,1131,1134,1137,1139,1141,1143],{"class":142,"line":1130},35,[140,1132,1133],{"class":645},"        \"",[140,1135,1136],{"class":649},"query",[140,1138,646],{"class":645},[140,1140,159],{"class":158},[140,1142,1096],{"class":154},[140,1144,802],{"class":158},[140,1146,1148,1150,1153,1155,1157,1159],{"class":142,"line":1147},36,[140,1149,1133],{"class":645},[140,1151,1152],{"class":649},"user_id",[140,1154,646],{"class":645},[140,1156,159],{"class":158},[140,1158,1101],{"class":154},[140,1160,802],{"class":158},[140,1162,1164,1166,1169,1171,1173,1175],{"class":142,"line":1163},37,[140,1165,1133],{"class":645},[140,1167,1168],{"class":649},"conversation_id",[140,1170,646],{"class":645},[140,1172,159],{"class":158},[140,1174,1101],{"class":154},[140,1176,802],{"class":158},[140,1178,1180,1182,1185,1187,1189,1192,1194],{"class":142,"line":1179},38,[140,1181,1133],{"class":645},[140,1183,1184],{"class":649},"knowledgebase_ids",[140,1186,646],{"class":645},[140,1188,159],{"class":158},[140,1190,1191],{"class":146}," self",[140,1193,241],{"class":158},[140,1195,1196],{"class":244},"knowledge_base_ids\n",[140,1198,1200],{"class":142,"line":1199},39,[140,1201,1202],{"class":158},"      }\n",[140,1204,1206,1209,1211,1214,1216,1219,1221,1224,1226,1228,1230,1232,1234,1236,1239,1241,1244,1246,1248,1250,1252,1254,1257,1259,1262,1264,1266,1268,1271],{"class":142,"line":1205},40,[140,1207,1208],{"class":154},"      res ",[140,1210,832],{"class":259},[140,1212,1213],{"class":154}," requests",[140,1215,241],{"class":158},[140,1217,1218],{"class":263},"post",[140,1220,267],{"class":158},[140,1222,1223],{"class":872},"f",[140,1225,646],{"class":649},[140,1227,1044],{"class":1043},[140,1229,900],{"class":146},[140,1231,241],{"class":158},[140,1233,929],{"class":244},[140,1235,1064],{"class":1043},[140,1237,1238],{"class":649},"\u002Fsearch\u002Fmemory\"",[140,1240,169],{"class":158},[140,1242,1243],{"class":840}," headers",[140,1245,832],{"class":259},[140,1247,900],{"class":146},[140,1249,241],{"class":158},[140,1251,995],{"class":244},[140,1253,169],{"class":158},[140,1255,1256],{"class":840}," data",[140,1258,832],{"class":259},[140,1260,1261],{"class":263},"json",[140,1263,241],{"class":158},[140,1265,771],{"class":263},[140,1267,267],{"class":158},[140,1269,1270],{"class":263},"data",[140,1272,861],{"class":158},[140,1274,1276],{"class":142,"line":1275},41,[140,1277,1278],{"class":154},"      \n",[140,1280,1282,1285,1288,1290,1292,1295,1298,1300,1302,1304,1306,1308,1311,1314],{"class":142,"line":1281},42,[140,1283,1284],{"class":577},"      if",[140,1286,1287],{"class":154}," res",[140,1289,241],{"class":158},[140,1291,1261],{"class":263},[140,1293,1294],{"class":158},"().",[140,1296,1297],{"class":263},"get",[140,1299,267],{"class":158},[140,1301,1055],{"class":645},[140,1303,137],{"class":649},[140,1305,1055],{"class":645},[140,1307,274],{"class":158},[140,1309,1310],{"class":259}," !=",[140,1312,1313],{"class":150}," 0",[140,1315,233],{"class":158},[140,1317,1319,1322,1324,1326,1329,1331,1334,1336,1338,1340,1342,1344,1346,1349,1351,1353,1355,1357],{"class":142,"line":1318},43,[140,1320,1321],{"class":270},"        print",[140,1323,267],{"class":158},[140,1325,1223],{"class":872},[140,1327,1328],{"class":649},"\"❌ 查询记忆失败, ",[140,1330,1044],{"class":1043},[140,1332,1333],{"class":263},"res",[140,1335,241],{"class":158},[140,1337,1261],{"class":263},[140,1339,1294],{"class":158},[140,1341,1297],{"class":263},[140,1343,267],{"class":158},[140,1345,1055],{"class":645},[140,1347,1348],{"class":649},"message",[140,1350,1055],{"class":645},[140,1352,274],{"class":158},[140,1354,1064],{"class":1043},[140,1356,646],{"class":649},[140,1358,400],{"class":158},[140,1360,1362,1365,1368],{"class":142,"line":1361},44,[140,1363,1364],{"class":577},"        return",[140,1366,1367],{"class":158}," [],",[140,1369,1370],{"class":158}," []\n",[140,1372,1374],{"class":142,"line":1373},45,[140,1375,323],{"emptyLinePlaceholder":322},[140,1377,1379,1382,1384,1386,1388,1390,1392,1394,1396,1398,1400,1402,1405,1407,1409,1411,1414,1416,1418],{"class":142,"line":1378},46,[140,1380,1381],{"class":154},"      memory_detail_list_raw ",[140,1383,832],{"class":259},[140,1385,1287],{"class":154},[140,1387,241],{"class":158},[140,1389,1261],{"class":263},[140,1391,1294],{"class":158},[140,1393,1297],{"class":263},[140,1395,267],{"class":158},[140,1397,1055],{"class":645},[140,1399,1270],{"class":649},[140,1401,1055],{"class":645},[140,1403,1404],{"class":158},").",[140,1406,1297],{"class":263},[140,1408,267],{"class":158},[140,1410,1055],{"class":645},[140,1412,1413],{"class":649},"memory_detail_list",[140,1415,1055],{"class":645},[140,1417,169],{"class":158},[140,1419,1420],{"class":158}," [])\n",[140,1422,1424],{"class":142,"line":1423},47,[140,1425,1426],{"class":224},"      # 过滤掉相关性小于0.5的记忆\n",[140,1428,1430,1433,1435],{"class":142,"line":1429},48,[140,1431,1432],{"class":154},"      memory_detail_list ",[140,1434,832],{"class":259},[140,1436,1437],{"class":158}," [\n",[140,1439,1441,1444,1447,1450,1453],{"class":142,"line":1440},49,[140,1442,1443],{"class":154},"          x ",[140,1445,1446],{"class":577},"for",[140,1448,1449],{"class":154}," x ",[140,1451,1452],{"class":577},"in",[140,1454,1455],{"class":154}," memory_detail_list_raw \n",[140,1457,1459,1462,1465,1467,1469,1471,1473,1476,1478,1480,1482,1484,1487],{"class":142,"line":1458},50,[140,1460,1461],{"class":577},"          if",[140,1463,1464],{"class":154}," x",[140,1466,241],{"class":158},[140,1468,1297],{"class":263},[140,1470,267],{"class":158},[140,1472,1055],{"class":645},[140,1474,1475],{"class":649},"relativity",[140,1477,1055],{"class":645},[140,1479,169],{"class":158},[140,1481,1313],{"class":150},[140,1483,274],{"class":158},[140,1485,1486],{"class":259}," >=",[140,1488,1489],{"class":150}," 0.5\n",[140,1491,1493],{"class":142,"line":1492},51,[140,1494,1495],{"class":158},"      ]\n",[140,1497,1499,1502,1504,1506,1508,1510,1512,1514,1516,1518,1520,1522,1524,1526,1528,1530,1533,1535],{"class":142,"line":1498},52,[140,1500,1501],{"class":154},"      preference_detail_list ",[140,1503,832],{"class":259},[140,1505,1287],{"class":154},[140,1507,241],{"class":158},[140,1509,1261],{"class":263},[140,1511,1294],{"class":158},[140,1513,1297],{"class":263},[140,1515,267],{"class":158},[140,1517,1055],{"class":645},[140,1519,1270],{"class":649},[140,1521,1055],{"class":645},[140,1523,1404],{"class":158},[140,1525,1297],{"class":263},[140,1527,267],{"class":158},[140,1529,1055],{"class":645},[140,1531,1532],{"class":649},"preference_detail_list",[140,1534,1055],{"class":645},[140,1536,400],{"class":158},[140,1538,1540],{"class":142,"line":1539},53,[140,1541,323],{"emptyLinePlaceholder":322},[140,1543,1545,1548,1551,1553],{"class":142,"line":1544},54,[140,1546,1547],{"class":577},"      return",[140,1549,1550],{"class":154}," memory_detail_list",[140,1552,169],{"class":158},[140,1554,1555],{"class":154}," preference_detail_list\n",[140,1557,1559],{"class":142,"line":1558},55,[140,1560,323],{"emptyLinePlaceholder":322},[140,1562,1564,1566,1569,1571,1573,1575,1578,1580,1583],{"class":142,"line":1563},56,[140,1565,891],{"class":872},[140,1567,1568],{"class":1085}," build_system_prompt",[140,1570,267],{"class":158},[140,1572,900],{"class":899},[140,1574,169],{"class":158},[140,1576,1577],{"class":1095}," memories",[140,1579,169],{"class":158},[140,1581,1582],{"class":1095}," preferences",[140,1584,903],{"class":158},[140,1586,1588,1591,1594],{"class":142,"line":1587},57,[140,1589,1590],{"class":1109},"        \"\"\"",[140,1592,1593],{"class":1113},"构建包含格式化记忆的系统提示",[140,1595,1117],{"class":1109},[140,1597,1599,1602,1604],{"class":142,"line":1598},58,[140,1600,1601],{"class":154},"        base_prompt ",[140,1603,832],{"class":259},[140,1605,1606],{"class":645}," \"\"\"\n",[140,1608,1610],{"class":142,"line":1609},59,[140,1611,1612],{"class":649},"          # Role\n",[140,1614,1616],{"class":142,"line":1615},60,[140,1617,1618],{"class":649},"          你是 MemOS 智能助手，昵称小忆🧚 — 一个由 MemTensor 创建的「记忆操作系统」AI助手。MemTensor 是一家位于上海的人工智能研究公司，由中国科学院院士指导。MemTensor 致力于'低成本、低幻觉、高泛化'的愿景，探索符合中国国情的人工智能发展路径，推动可信人工智能技术的应用。MemOS 的使命是为大语言模型（LLMs）和自主智能体赋予「类人长期记忆」，将记忆从模型权重中的黑盒转变为「可管理、可调度、可审计」的核心资源。你的回应必须符合法律和道德标准，遵守相关法律法规，不得生成非法、有害或有偏见的内容。如果遇到此类请求，模型应明确拒绝并解释背后的法律或道德原则。你的目标是结合检索到的记忆片段，为用户提供高度个性化、准确且逻辑严密的回答。\n",[140,1620,1622],{"class":142,"line":1621},61,[140,1623,323],{"emptyLinePlaceholder":322},[140,1625,1627],{"class":142,"line":1626},62,[140,1628,1629],{"class":649},"          # System Context\n",[140,1631,1633,1636,1639],{"class":142,"line":1632},63,[140,1634,1635],{"class":649},"          - 当前时间: ",[140,1637,1638],{"class":1043},"{current_time}",[140,1640,1641],{"class":649}," (请以此作为判断记忆时效性的基准)\n",[140,1643,1645],{"class":142,"line":1644},64,[140,1646,323],{"emptyLinePlaceholder":322},[140,1648,1650],{"class":142,"line":1649},65,[140,1651,1652],{"class":649},"          # Memory Data\n",[140,1654,1656],{"class":142,"line":1655},66,[140,1657,1658],{"class":649},"          以下是 MemOS 检索到的相关信息，分为“事实”和“偏好”。\n",[140,1660,1662],{"class":142,"line":1661},67,[140,1663,1664],{"class":649},"          - **事实 (Facts)**：可能包含用户属性、历史对话记录或第三方信息。\n",[140,1666,1668],{"class":142,"line":1667},68,[140,1669,1670],{"class":649},"            - **特别注意**：其中标记为 `[assistant观点]`、`[模型总结]` 的内容代表 **AI 过去的推断**，**并非**用户的原话。\n",[140,1672,1674],{"class":142,"line":1673},69,[140,1675,1676],{"class":649},"          - **偏好 (Preferences)**：用户对回答风格、格式或逻辑的显式\u002F隐式要求。\n",[140,1678,1680],{"class":142,"line":1679},70,[140,1681,323],{"emptyLinePlaceholder":322},[140,1683,1685],{"class":142,"line":1684},71,[140,1686,1687],{"class":649},"          \u003Cmemories>\n",[140,1689,1691],{"class":142,"line":1690},72,[140,1692,1693],{"class":1043},"          {memories}\n",[140,1695,1697],{"class":142,"line":1696},73,[140,1698,1699],{"class":649},"          \u003C\u002Fmemories>\n",[140,1701,1703],{"class":142,"line":1702},74,[140,1704,323],{"emptyLinePlaceholder":322},[140,1706,1708],{"class":142,"line":1707},75,[140,1709,323],{"emptyLinePlaceholder":322},[140,1711,1713],{"class":142,"line":1712},76,[140,1714,1715],{"class":649},"          \u003Cpreferences>\n",[140,1717,1719],{"class":142,"line":1718},77,[140,1720,1721],{"class":1043},"          {preferences}\n",[140,1723,1725],{"class":142,"line":1724},78,[140,1726,1727],{"class":649},"          \u003C\u002Fpreferences>\n",[140,1729,1731],{"class":142,"line":1730},79,[140,1732,323],{"emptyLinePlaceholder":322},[140,1734,1736],{"class":142,"line":1735},80,[140,1737,1738],{"class":649},"          # Critical Protocol: Memory Safety (记忆安全协议)\n",[140,1740,1742],{"class":142,"line":1741},81,[140,1743,1744],{"class":649},"          检索到的记忆可能包含**AI 自身的推测**、**无关噪音**或**主体错误**。你必须严格执行以下**“四步判决”**，只要有一步不通过，就**丢弃**该条记忆：\n",[140,1746,1748],{"class":142,"line":1747},82,[140,1749,323],{"emptyLinePlaceholder":322},[140,1751,1753],{"class":142,"line":1752},83,[140,1754,1755],{"class":649},"          1. **来源真值检查 (Source Verification)**：\n",[140,1757,1759],{"class":142,"line":1758},84,[140,1760,1761],{"class":649},"            - **核心**：区分“用户原话”与“AI 推测”。\n",[140,1763,1765],{"class":142,"line":1764},85,[140,1766,1767],{"class":649},"            - 如果记忆带有 '[assistant观点]' 等标签，这仅代表AI过去的**假设**，**不可**将其视为用户的绝对事实。\n",[140,1769,1771],{"class":142,"line":1770},86,[140,1772,1773],{"class":649},"            - *反例*：记忆显示 '[assistant观点] 用户酷爱芒果'。如果用户没提，不要主动假设用户喜欢芒果，防止循环幻觉。\n",[140,1775,1777],{"class":142,"line":1776},87,[140,1778,1779],{"class":649},"            - **原则：AI 的总结仅供参考，权重大幅低于用户的直接陈述。**\n",[140,1781,1783],{"class":142,"line":1782},88,[140,1784,323],{"emptyLinePlaceholder":322},[140,1786,1788],{"class":142,"line":1787},89,[140,1789,1790],{"class":649},"          2. **主语归因检查 (Attribution Check)**：\n",[140,1792,1794],{"class":142,"line":1793},90,[140,1795,1796],{"class":649},"            - 记忆中的行为主体是“用户本人”吗？\n",[140,1798,1800],{"class":142,"line":1799},91,[140,1801,1802],{"class":649},"            - 如果记忆描述的是**第三方**（如“候选人”、“面试者”、“虚构角色”、“案例数据”），**严禁**将其属性归因于用户。\n",[140,1804,1806],{"class":142,"line":1805},92,[140,1807,323],{"emptyLinePlaceholder":322},[140,1809,1811],{"class":142,"line":1810},93,[140,1812,1813],{"class":649},"          3. **强相关性检查 (Relevance Check)**：\n",[140,1815,1817],{"class":142,"line":1816},94,[140,1818,1819],{"class":649},"            - 记忆是否直接有助于回答当前的 'Original Query'？\n",[140,1821,1823],{"class":142,"line":1822},95,[140,1824,1825],{"class":649},"            - 如果记忆仅仅是关键词匹配（如：都提到了“代码”）但语境完全不同，**必须忽略**。\n",[140,1827,1829],{"class":142,"line":1828},96,[140,1830,323],{"emptyLinePlaceholder":322},[140,1832,1834],{"class":142,"line":1833},97,[140,1835,1836],{"class":649},"          4. **时效性检查 (Freshness Check)**：\n",[140,1838,1840],{"class":142,"line":1839},98,[140,1841,1842],{"class":649},"            - 记忆内容是否与用户的最新意图冲突？以当前的 'Original Query' 为最高事实标准。\n",[140,1844,1846],{"class":142,"line":1845},99,[140,1847,323],{"emptyLinePlaceholder":322},[140,1849,1851],{"class":142,"line":1850},100,[140,1852,323],{"emptyLinePlaceholder":322},[140,1854,1856],{"class":142,"line":1855},101,[140,1857,1858],{"class":649},"          # Instructions\n",[140,1860,1862],{"class":142,"line":1861},102,[140,1863,1864],{"class":649},"            1. **审视**：先阅读 `facts memories`，执行“四步判决”，剔除噪音和不可靠的 AI 观点。\n",[140,1866,1868],{"class":142,"line":1867},103,[140,1869,1870],{"class":649},"            2. **执行**：\n",[140,1872,1874],{"class":142,"line":1873},104,[140,1875,1876],{"class":649},"              - **优先采用知识库中的专业建议**（如产品选型、技术方案）\n",[140,1878,1880],{"class":142,"line":1879},105,[140,1881,1882],{"class":649},"              - 仅使用通过筛选的记忆补充背景。\n",[140,1884,1886],{"class":142,"line":1885},106,[140,1887,1888],{"class":649},"              - 严格遵守 `preferences` 中的风格要求。\n",[140,1890,1892],{"class":142,"line":1891},107,[140,1893,1894],{"class":649},"            3. **输出**：\n",[140,1896,1898],{"class":142,"line":1897},108,[140,1899,1900],{"class":649},"              - 直接回答问题，**严禁**提及“记忆库”、“检索”或“AI 观点”等系统内部术语。\n",[140,1902,1904],{"class":142,"line":1903},109,[140,1905,1906],{"class":649},"              - 如果回应内容不在当前知识库\u002F记忆系统中，你必须直接明确地告知用户。在任何情况下都不要编造信息或给出模糊的回应。\n",[140,1908,1910],{"class":142,"line":1909},110,[140,1911,1912],{"class":649},"            4. **语言**：回答语言应与用户查询语言一致。\n",[140,1914,1916],{"class":142,"line":1915},111,[140,1917,323],{"emptyLinePlaceholder":322},[140,1919,1921],{"class":142,"line":1920},112,[140,1922,1923],{"class":649},"          # Markdown 格式转换要求\n",[140,1925,1927],{"class":142,"line":1926},113,[140,1928,1929],{"class":649},"          - 当你需要将给定的 Markdown（MD）格式文本转换为纯文本时，你必须严格遵循以下要求，以确保清晰的可读性和无格式错误：\n",[140,1931,1933],{"class":142,"line":1932},114,[140,1934,1935],{"class":649},"          - 核心格式适配要求：微信不支持原生 MD 语法（如 #标题、粗体文本、代码块、表格）。你必须使用'符号 + 换行 + 空格'来模拟层级结构，避免使用微信无法识别的标记；\"\n",[140,1937,1939],{"class":142,"line":1938},115,[140,1940,1941],{"class":649},"          - 标题层级处理：首先，检查原文是否包含 Markdown 标题格式（以 # 开头的行）。如果有：一级标题（最高级）使用中文数字序号，如' 一. '、' 二. '、' 三. '（注意：使用'.'而不是'、'）；二级标题（比最高级多一个 #）使用阿拉伯数字序号，如'1. '、'2. '、'3. '；三级标题（比最高级多两个 #）及以下使用'・'符号作为无序列表。序号必须根据文档结构自动递增以保持一致的层级。如果没有：不添加任何标题序号，保持原有段落结构不变。示例：原 MD 标题 '### 标题 1' → ' 一. 标题 1'；原 MD 标题 '#### 标题 2' → '1. 标题 2'；原 MD 标题 '##### 标题 3' → '・标题 3'；当原文中没有 MD 标题时，'标题 1'保持为'标题 1'；\n",[140,1943,1945],{"class":142,"line":1944},116,[140,1946,1947],{"class":649},"          - 链接处理：保持'文本'格式的 Markdown 链接不变。不要修改或删除任何链接内容（示例：MemOS 文档保持为 MemOS 文档）；\"\n",[140,1949,1951],{"class":142,"line":1950},117,[140,1952,1953],{"class":649},"          - 列表处理：统一将'- 内容'格式的 MD 列表转换为有序列表（如'1. 内容'、'2. 内容'）或无序列表（使用'・'符号，如'・内容'）。每个列表项必须单独成行，前后各留 1 个空行以提高可读性；\"\n",[140,1955,1957],{"class":142,"line":1956},118,[140,1958,1959],{"class":649},"          - 表格替换：如果原 MD 包含表格，将其分解为'▶ 场景类型 A：XXX'、'▶ 场景类型 B：XXX'格式的要点。在每个类别下，使用'1. 2. 3. '列出相应内容，确保不遗漏信息且不保留表格符号；\"\n",[140,1961,1963],{"class":142,"line":1962},119,[140,1964,1965],{"class":649},"          - 强调关键内容：不使用 * 或 ** 符号，用'「XXX」'（中文双引号）替换原 MD 中的粗体内容；\"\n",[140,1967,1969],{"class":142,"line":1968},120,[140,1970,1971],{"class":649},"          - 优化阅读体验：在主要段落之间留 1 个空行（如' 一. XXX'、' 二. XXX'）。对于原 MD 中过长的技术术语或复杂描述，用更口语化的表达简化，但不改变原意；使用中文符号作为所有分隔符（如 ▶、・、：），避免中英文符号混用导致格式混乱；\"\n",[140,1973,1975],{"class":142,"line":1974},121,[140,1976,1977],{"class":649},"          - 输出要求：仅输出转换后的纯文本；不包含额外说明（如'转换完成'）；不修改原始内容 — 仅替换格式；确保 100% 保留原 MD 的核心信息（如比较维度、功能点、链接、数据）不遗漏或改变；最终文本必须可以直接复制发送，无需进一步编辑。\"\n",[140,1979,1981],{"class":142,"line":1980},122,[140,1982,1983],{"class":645},"          \"\"\"\n",[140,1985,1987],{"class":142,"line":1986},123,[140,1988,323],{"emptyLinePlaceholder":322},[140,1990,1992],{"class":142,"line":1991},124,[140,1993,1994],{"class":224},"        # 构造记忆文本（允许为空）\n",[140,1996,1998,2001,2004,2006,2009,2011,2014,2016],{"class":142,"line":1997},125,[140,1999,2000],{"class":577},"        if",[140,2002,2003],{"class":270}," len",[140,2005,267],{"class":158},[140,2007,2008],{"class":263},"memories",[140,2010,274],{"class":158},[140,2012,2013],{"class":259}," >",[140,2015,1313],{"class":150},[140,2017,233],{"class":158},[140,2019,2021,2024,2026,2028,2031,2035],{"class":142,"line":2020},126,[140,2022,2023],{"class":154},"            formatted_memories ",[140,2025,832],{"class":259},[140,2027,661],{"class":645},[140,2029,2030],{"class":649},"## 相关记忆:",[140,2032,2034],{"class":2033},"seOsA","\\n",[140,2036,735],{"class":645},[140,2038,2040,2043,2046,2048,2051,2053,2056,2058,2060,2062,2064],{"class":142,"line":2039},127,[140,2041,2042],{"class":577},"            for",[140,2044,2045],{"class":154}," i",[140,2047,169],{"class":158},[140,2049,2050],{"class":154}," memory ",[140,2052,1452],{"class":577},[140,2054,2055],{"class":270}," enumerate",[140,2057,267],{"class":158},[140,2059,2008],{"class":263},[140,2061,169],{"class":158},[140,2063,151],{"class":150},[140,2065,903],{"class":158},[140,2067,2069,2072,2075,2077,2079,2081,2084,2086,2089,2091,2094,2096,2098,2100,2102,2105,2107,2109,2111,2113],{"class":142,"line":2068},128,[140,2070,2071],{"class":154},"                formatted_memories ",[140,2073,2074],{"class":259},"+=",[140,2076,1037],{"class":872},[140,2078,646],{"class":649},[140,2080,1044],{"class":1043},[140,2082,2083],{"class":154},"i",[140,2085,1064],{"class":1043},[140,2087,2088],{"class":649},". ",[140,2090,1044],{"class":1043},[140,2092,2093],{"class":154},"memory",[140,2095,241],{"class":158},[140,2097,1297],{"class":263},[140,2099,267],{"class":158},[140,2101,1055],{"class":645},[140,2103,2104],{"class":649},"memory_value",[140,2106,1055],{"class":645},[140,2108,274],{"class":158},[140,2110,1064],{"class":1043},[140,2112,2034],{"class":2033},[140,2114,735],{"class":649},[140,2116,2118,2121],{"class":142,"line":2117},129,[140,2119,2120],{"class":577},"        else",[140,2122,233],{"class":158},[140,2124,2126,2128,2130],{"class":142,"line":2125},130,[140,2127,2023],{"class":154},[140,2129,832],{"class":259},[140,2131,2132],{"class":645}," \"\"\n",[140,2134,2136],{"class":142,"line":2135},131,[140,2137,323],{"emptyLinePlaceholder":322},[140,2139,2141],{"class":142,"line":2140},132,[140,2142,2143],{"class":224},"        # 构造偏好文本（允许为空）\n",[140,2145,2147,2149,2151,2153,2156,2158,2160,2162],{"class":142,"line":2146},133,[140,2148,2000],{"class":577},[140,2150,2003],{"class":270},[140,2152,267],{"class":158},[140,2154,2155],{"class":263},"preferences",[140,2157,274],{"class":158},[140,2159,2013],{"class":259},[140,2161,1313],{"class":150},[140,2163,233],{"class":158},[140,2165,2167,2170,2172,2174,2177,2179],{"class":142,"line":2166},134,[140,2168,2169],{"class":154},"            formatted_preferences ",[140,2171,832],{"class":259},[140,2173,661],{"class":645},[140,2175,2176],{"class":649},"## 偏好:",[140,2178,2034],{"class":2033},[140,2180,735],{"class":645},[140,2182,2184,2186,2188,2190,2193,2195,2197,2199,2201,2203,2205],{"class":142,"line":2183},135,[140,2185,2042],{"class":577},[140,2187,2045],{"class":154},[140,2189,169],{"class":158},[140,2191,2192],{"class":154}," preference_detail ",[140,2194,1452],{"class":577},[140,2196,2055],{"class":270},[140,2198,267],{"class":158},[140,2200,2155],{"class":263},[140,2202,169],{"class":158},[140,2204,151],{"class":150},[140,2206,903],{"class":158},[140,2208,2210,2213,2215,2217,2219,2221,2223,2225,2227,2229,2232,2234,2236,2238,2240,2243,2245,2247,2249,2251],{"class":142,"line":2209},136,[140,2211,2212],{"class":154},"                formatted_preferences ",[140,2214,2074],{"class":259},[140,2216,1037],{"class":872},[140,2218,646],{"class":649},[140,2220,1044],{"class":1043},[140,2222,2083],{"class":154},[140,2224,1064],{"class":1043},[140,2226,2088],{"class":649},[140,2228,1044],{"class":1043},[140,2230,2231],{"class":154},"preference_detail",[140,2233,241],{"class":158},[140,2235,1297],{"class":263},[140,2237,267],{"class":158},[140,2239,1055],{"class":645},[140,2241,2242],{"class":649},"preference",[140,2244,1055],{"class":645},[140,2246,274],{"class":158},[140,2248,1064],{"class":1043},[140,2250,2034],{"class":2033},[140,2252,735],{"class":649},[140,2254,2256,2258],{"class":142,"line":2255},137,[140,2257,2120],{"class":577},[140,2259,233],{"class":158},[140,2261,2263,2265,2267],{"class":142,"line":2262},138,[140,2264,2169],{"class":154},[140,2266,832],{"class":259},[140,2268,2132],{"class":645},[140,2270,2272],{"class":142,"line":2271},139,[140,2273,323],{"emptyLinePlaceholder":322},[140,2275,2277,2279,2281,2284,2286,2289],{"class":142,"line":2276},140,[140,2278,1601],{"class":154},[140,2280,832],{"class":259},[140,2282,2283],{"class":154}," base_prompt",[140,2285,241],{"class":158},[140,2287,2288],{"class":263},"format",[140,2290,2291],{"class":158},"(\n",[140,2293,2295,2298,2300,2303,2305,2308,2310,2313,2315,2317,2320,2323,2326,2328],{"class":142,"line":2294},141,[140,2296,2297],{"class":840},"            current_time",[140,2299,832],{"class":259},[140,2301,2302],{"class":263},"datetime",[140,2304,241],{"class":158},[140,2306,2307],{"class":263},"now",[140,2309,1294],{"class":158},[140,2311,2312],{"class":263},"strftime",[140,2314,267],{"class":158},[140,2316,1055],{"class":645},[140,2318,2319],{"class":649},"%Y-%m-",[140,2321,2322],{"class":1043},"%d",[140,2324,2325],{"class":649}," %H:%M:%S",[140,2327,1055],{"class":645},[140,2329,2330],{"class":158},"),\n",[140,2332,2334,2337,2339,2342],{"class":142,"line":2333},142,[140,2335,2336],{"class":840},"            memories",[140,2338,832],{"class":259},[140,2340,2341],{"class":263},"formatted_memories",[140,2343,802],{"class":158},[140,2345,2347,2350,2352,2355],{"class":142,"line":2346},143,[140,2348,2349],{"class":840},"            preferences",[140,2351,832],{"class":259},[140,2353,2354],{"class":263},"formatted_preferences",[140,2356,802],{"class":158},[140,2358,2360],{"class":142,"line":2359},144,[140,2361,2362],{"class":158},"        )\n",[140,2364,2366],{"class":142,"line":2365},145,[140,2367,323],{"emptyLinePlaceholder":322},[140,2369,2371,2373],{"class":142,"line":2370},146,[140,2372,1364],{"class":577},[140,2374,2375],{"class":154}," base_prompt\n",[140,2377,2379],{"class":142,"line":2378},147,[140,2380,323],{"emptyLinePlaceholder":322},[140,2382,2384,2386,2389,2391,2393,2395,2398,2400,2402],{"class":142,"line":2383},148,[140,2385,891],{"class":872},[140,2387,2388],{"class":1085}," add_message",[140,2390,267],{"class":158},[140,2392,900],{"class":899},[140,2394,169],{"class":158},[140,2396,2397],{"class":1095}," messages",[140,2399,169],{"class":158},[140,2401,1101],{"class":1095},[140,2403,903],{"class":158},[140,2405,2407,2409,2412],{"class":142,"line":2406},149,[140,2408,1110],{"class":1109},[140,2410,2411],{"class":1113},"添加消息",[140,2413,1117],{"class":1109},[140,2415,2417,2419,2421],{"class":142,"line":2416},150,[140,2418,1123],{"class":154},[140,2420,832],{"class":259},[140,2422,1000],{"class":158},[140,2424,2426,2428,2431,2433,2435,2437],{"class":142,"line":2425},151,[140,2427,1133],{"class":645},[140,2429,2430],{"class":649},"messages",[140,2432,646],{"class":645},[140,2434,159],{"class":158},[140,2436,2397],{"class":154},[140,2438,802],{"class":158},[140,2440,2442,2444,2446,2448,2450,2452],{"class":142,"line":2441},152,[140,2443,1133],{"class":645},[140,2445,1152],{"class":649},[140,2447,646],{"class":645},[140,2449,159],{"class":158},[140,2451,1101],{"class":154},[140,2453,802],{"class":158},[140,2455,2457,2459,2461,2463,2465],{"class":142,"line":2456},153,[140,2458,1133],{"class":645},[140,2460,1168],{"class":649},[140,2462,646],{"class":645},[140,2464,159],{"class":158},[140,2466,2467],{"class":154}," user_id\n",[140,2469,2471],{"class":142,"line":2470},154,[140,2472,1202],{"class":158},[140,2474,2476],{"class":142,"line":2475},155,[140,2477,323],{"emptyLinePlaceholder":322},[140,2479,2481,2483,2485,2487,2489,2491,2493,2495,2497,2499,2501,2503,2505,2507,2510,2512,2514,2516,2518,2520,2522,2524,2526,2528,2530,2532,2534,2536,2538],{"class":142,"line":2480},156,[140,2482,1208],{"class":154},[140,2484,832],{"class":259},[140,2486,1213],{"class":154},[140,2488,241],{"class":158},[140,2490,1218],{"class":263},[140,2492,267],{"class":158},[140,2494,1223],{"class":872},[140,2496,646],{"class":649},[140,2498,1044],{"class":1043},[140,2500,900],{"class":146},[140,2502,241],{"class":158},[140,2504,929],{"class":244},[140,2506,1064],{"class":1043},[140,2508,2509],{"class":649},"\u002Fadd\u002Fmessage\"",[140,2511,169],{"class":158},[140,2513,1243],{"class":840},[140,2515,832],{"class":259},[140,2517,900],{"class":146},[140,2519,241],{"class":158},[140,2521,995],{"class":244},[140,2523,169],{"class":158},[140,2525,1256],{"class":840},[140,2527,832],{"class":259},[140,2529,1261],{"class":263},[140,2531,241],{"class":158},[140,2533,771],{"class":263},[140,2535,267],{"class":158},[140,2537,1270],{"class":263},[140,2539,861],{"class":158},[140,2541,2543],{"class":142,"line":2542},157,[140,2544,323],{"emptyLinePlaceholder":322},[140,2546,2548,2550,2552,2554,2556,2558,2560,2562,2564,2566,2568,2570,2573,2575],{"class":142,"line":2547},158,[140,2549,1284],{"class":577},[140,2551,1287],{"class":154},[140,2553,241],{"class":158},[140,2555,1261],{"class":263},[140,2557,1294],{"class":158},[140,2559,1297],{"class":263},[140,2561,267],{"class":158},[140,2563,1055],{"class":645},[140,2565,137],{"class":649},[140,2567,1055],{"class":645},[140,2569,274],{"class":158},[140,2571,2572],{"class":259}," ==",[140,2574,1313],{"class":150},[140,2576,233],{"class":158},[140,2578,2580,2582,2584,2586,2589],{"class":142,"line":2579},159,[140,2581,1321],{"class":270},[140,2583,267],{"class":158},[140,2585,1223],{"class":872},[140,2587,2588],{"class":649},"\"✅ 添加成功\"",[140,2590,400],{"class":158},[140,2592,2594,2597],{"class":142,"line":2593},160,[140,2595,2596],{"class":577},"      else",[140,2598,233],{"class":158},[140,2600,2602,2604,2606,2608,2611,2613,2615,2617,2619,2621,2623,2625,2627,2629,2631,2633,2635,2637],{"class":142,"line":2601},161,[140,2603,1321],{"class":270},[140,2605,267],{"class":158},[140,2607,1223],{"class":872},[140,2609,2610],{"class":649},"\"❌ 添加失败, ",[140,2612,1044],{"class":1043},[140,2614,1333],{"class":263},[140,2616,241],{"class":158},[140,2618,1261],{"class":263},[140,2620,1294],{"class":158},[140,2622,1297],{"class":263},[140,2624,267],{"class":158},[140,2626,1055],{"class":645},[140,2628,1348],{"class":649},[140,2630,1055],{"class":645},[140,2632,274],{"class":158},[140,2634,1064],{"class":1043},[140,2636,646],{"class":649},[140,2638,400],{"class":158},[140,2640,2642],{"class":142,"line":2641},162,[140,2643,323],{"emptyLinePlaceholder":322},[140,2645,2647],{"class":142,"line":2646},163,[140,2648,323],{"emptyLinePlaceholder":322},[140,2650,2652,2654,2657,2659,2661,2663,2665],{"class":142,"line":2651},164,[140,2653,891],{"class":872},[140,2655,2656],{"class":1085}," get_message",[140,2658,267],{"class":158},[140,2660,900],{"class":899},[140,2662,169],{"class":158},[140,2664,1101],{"class":1095},[140,2666,903],{"class":158},[140,2668,2670,2672,2675],{"class":142,"line":2669},165,[140,2671,1590],{"class":1109},[140,2673,2674],{"class":1113},"获取消息",[140,2676,1117],{"class":1109},[140,2678,2680,2683,2685],{"class":142,"line":2679},166,[140,2681,2682],{"class":154},"        data ",[140,2684,832],{"class":259},[140,2686,1000],{"class":158},[140,2688,2690,2692,2694,2696,2698,2700],{"class":142,"line":2689},167,[140,2691,1006],{"class":645},[140,2693,1152],{"class":649},[140,2695,646],{"class":645},[140,2697,159],{"class":158},[140,2699,1101],{"class":154},[140,2701,802],{"class":158},[140,2703,2705,2707,2709,2711,2713,2715],{"class":142,"line":2704},168,[140,2706,1006],{"class":645},[140,2708,1168],{"class":649},[140,2710,646],{"class":645},[140,2712,159],{"class":158},[140,2714,1101],{"class":154},[140,2716,802],{"class":158},[140,2718,2720,2722,2725,2727,2729],{"class":142,"line":2719},169,[140,2721,1006],{"class":645},[140,2723,2724],{"class":649},"message_limit_number",[140,2726,646],{"class":645},[140,2728,159],{"class":158},[140,2730,2731],{"class":150}," 15\n",[140,2733,2735],{"class":142,"line":2734},170,[140,2736,1072],{"class":158},[140,2738,2740,2743,2745,2747,2749,2751,2753,2755,2757,2759,2761,2763,2765,2767,2770,2772,2774,2776,2778,2780,2782,2784,2786,2788,2790,2792,2794,2796,2798],{"class":142,"line":2739},171,[140,2741,2742],{"class":154},"        res ",[140,2744,832],{"class":259},[140,2746,1213],{"class":154},[140,2748,241],{"class":158},[140,2750,1218],{"class":263},[140,2752,267],{"class":158},[140,2754,1223],{"class":872},[140,2756,646],{"class":649},[140,2758,1044],{"class":1043},[140,2760,900],{"class":146},[140,2762,241],{"class":158},[140,2764,929],{"class":244},[140,2766,1064],{"class":1043},[140,2768,2769],{"class":649},"\u002Fget\u002Fmessage\"",[140,2771,169],{"class":158},[140,2773,1243],{"class":840},[140,2775,832],{"class":259},[140,2777,900],{"class":146},[140,2779,241],{"class":158},[140,2781,995],{"class":244},[140,2783,169],{"class":158},[140,2785,1256],{"class":840},[140,2787,832],{"class":259},[140,2789,1261],{"class":263},[140,2791,241],{"class":158},[140,2793,771],{"class":263},[140,2795,267],{"class":158},[140,2797,1270],{"class":263},[140,2799,861],{"class":158},[140,2801,2803],{"class":142,"line":2802},172,[140,2804,2805],{"class":154},"        \n",[140,2807,2809,2811,2813,2815,2817,2819,2821,2823,2825,2827,2829,2831,2833,2835],{"class":142,"line":2808},173,[140,2810,2000],{"class":577},[140,2812,1287],{"class":154},[140,2814,241],{"class":158},[140,2816,1261],{"class":263},[140,2818,1294],{"class":158},[140,2820,1297],{"class":263},[140,2822,267],{"class":158},[140,2824,1055],{"class":645},[140,2826,137],{"class":649},[140,2828,1055],{"class":645},[140,2830,274],{"class":158},[140,2832,2572],{"class":259},[140,2834,1313],{"class":150},[140,2836,233],{"class":158},[140,2838,2840,2843,2845,2847,2849,2851,2853,2855,2857,2859,2861,2863,2865,2867,2869,2872,2874],{"class":142,"line":2839},174,[140,2841,2842],{"class":577},"          return",[140,2844,1287],{"class":154},[140,2846,241],{"class":158},[140,2848,1261],{"class":263},[140,2850,1294],{"class":158},[140,2852,1297],{"class":263},[140,2854,267],{"class":158},[140,2856,1055],{"class":645},[140,2858,1270],{"class":649},[140,2860,1055],{"class":645},[140,2862,1404],{"class":158},[140,2864,1297],{"class":263},[140,2866,267],{"class":158},[140,2868,1055],{"class":645},[140,2870,2871],{"class":649},"message_detail_list",[140,2873,1055],{"class":645},[140,2875,400],{"class":158},[140,2877,2879,2881],{"class":142,"line":2878},175,[140,2880,2120],{"class":577},[140,2882,233],{"class":158},[140,2884,2886,2889,2891,2893,2896,2898,2900,2902,2904,2906,2908,2910,2912,2914,2916,2918,2920,2922],{"class":142,"line":2885},176,[140,2887,2888],{"class":270},"          print",[140,2890,267],{"class":158},[140,2892,1223],{"class":872},[140,2894,2895],{"class":649},"\"❌ 获取消息失败, ",[140,2897,1044],{"class":1043},[140,2899,1333],{"class":263},[140,2901,241],{"class":158},[140,2903,1261],{"class":263},[140,2905,1294],{"class":158},[140,2907,1297],{"class":263},[140,2909,267],{"class":158},[140,2911,1055],{"class":645},[140,2913,1348],{"class":649},[140,2915,1055],{"class":645},[140,2917,274],{"class":158},[140,2919,1064],{"class":1043},[140,2921,646],{"class":649},[140,2923,400],{"class":158},[140,2925,2927,2929],{"class":142,"line":2926},177,[140,2928,2842],{"class":577},[140,2930,1370],{"class":158},[140,2932,2934],{"class":142,"line":2933},178,[140,2935,2936],{"class":154},"       \n",[140,2938,2940,2942,2945,2947,2949,2951,2953,2955,2957],{"class":142,"line":2939},179,[140,2941,891],{"class":872},[140,2943,2944],{"class":1085}," chat",[140,2946,267],{"class":158},[140,2948,900],{"class":899},[140,2950,169],{"class":158},[140,2952,1096],{"class":1095},[140,2954,169],{"class":158},[140,2956,1101],{"class":1095},[140,2958,903],{"class":158},[140,2960,2962,2964,2967],{"class":142,"line":2961},180,[140,2963,1590],{"class":1109},[140,2965,2966],{"class":1113},"处理包含记忆集成的对话的主要聊天函数",[140,2968,1117],{"class":1109},[140,2970,2972],{"class":142,"line":2971},181,[140,2973,2974],{"class":224},"        # 1. 查询近期会话\n",[140,2976,2978,2981,2983,2985,2987,2990,2992,2994],{"class":142,"line":2977},182,[140,2979,2980],{"class":154},"        chat_history ",[140,2982,832],{"class":259},[140,2984,1191],{"class":146},[140,2986,241],{"class":158},[140,2988,2989],{"class":263},"get_message",[140,2991,267],{"class":158},[140,2993,1152],{"class":263},[140,2995,400],{"class":158},[140,2997,2999],{"class":142,"line":2998},183,[140,3000,2805],{"class":154},[140,3002,3004],{"class":142,"line":3003},184,[140,3005,3006],{"class":224},"        # 2. 搜索相关记忆\n",[140,3008,3010,3013,3015,3018,3020,3022,3024,3027,3029,3031,3033,3035],{"class":142,"line":3009},185,[140,3011,3012],{"class":154},"        memories",[140,3014,169],{"class":158},[140,3016,3017],{"class":154}," preferences ",[140,3019,832],{"class":259},[140,3021,1191],{"class":146},[140,3023,241],{"class":158},[140,3025,3026],{"class":263},"search_memory",[140,3028,267],{"class":158},[140,3030,1136],{"class":263},[140,3032,169],{"class":158},[140,3034,1101],{"class":263},[140,3036,400],{"class":158},[140,3038,3040],{"class":142,"line":3039},186,[140,3041,323],{"emptyLinePlaceholder":322},[140,3043,3045],{"class":142,"line":3044},187,[140,3046,3047],{"class":224},"        # 3. 构建包含记忆的系统提示\n",[140,3049,3051,3054,3056,3058,3060,3063,3065,3067,3069,3071],{"class":142,"line":3050},188,[140,3052,3053],{"class":154},"        system_prompt ",[140,3055,832],{"class":259},[140,3057,1191],{"class":146},[140,3059,241],{"class":158},[140,3061,3062],{"class":263},"build_system_prompt",[140,3064,267],{"class":158},[140,3066,2008],{"class":263},[140,3068,169],{"class":158},[140,3070,1582],{"class":263},[140,3072,400],{"class":158},[140,3074,3076],{"class":142,"line":3075},189,[140,3077,2805],{"class":154},[140,3079,3081,3084,3086],{"class":142,"line":3080},190,[140,3082,3083],{"class":154},"        messages ",[140,3085,832],{"class":259},[140,3087,1437],{"class":158},[140,3089,3091,3094,3096,3099,3101,3103,3105,3108,3110,3112,3114,3117,3119,3121,3124],{"class":142,"line":3090},191,[140,3092,3093],{"class":158},"          {",[140,3095,646],{"class":645},[140,3097,3098],{"class":649},"role",[140,3100,646],{"class":645},[140,3102,159],{"class":158},[140,3104,661],{"class":645},[140,3106,3107],{"class":649},"system",[140,3109,646],{"class":645},[140,3111,169],{"class":158},[140,3113,661],{"class":645},[140,3115,3116],{"class":649},"content",[140,3118,646],{"class":645},[140,3120,159],{"class":158},[140,3122,3123],{"class":154}," system_prompt",[140,3125,3126],{"class":158},"},\n",[140,3128,3130,3133,3136],{"class":142,"line":3129},192,[140,3131,3132],{"class":259},"          *",[140,3134,3135],{"class":154},"chat_history",[140,3137,802],{"class":158},[140,3139,3141,3143,3145,3147,3149,3151,3153,3156,3158,3160,3162,3164,3166,3168,3170],{"class":142,"line":3140},193,[140,3142,3093],{"class":158},[140,3144,646],{"class":645},[140,3146,3098],{"class":649},[140,3148,646],{"class":645},[140,3150,159],{"class":158},[140,3152,661],{"class":645},[140,3154,3155],{"class":649},"user",[140,3157,646],{"class":645},[140,3159,169],{"class":158},[140,3161,661],{"class":645},[140,3163,3116],{"class":649},[140,3165,646],{"class":645},[140,3167,159],{"class":158},[140,3169,1096],{"class":154},[140,3171,3172],{"class":158},"}\n",[140,3174,3176],{"class":142,"line":3175},194,[140,3177,3178],{"class":158},"        ]\n",[140,3180,3182],{"class":142,"line":3181},195,[140,3183,323],{"emptyLinePlaceholder":322},[140,3185,3187],{"class":142,"line":3186},196,[140,3188,3189],{"class":224},"        # 4. 使用OpenAI生成回答\n",[140,3191,3193,3196,3198,3200,3202,3204,3206,3209,3211,3214,3216,3219],{"class":142,"line":3192},197,[140,3194,3195],{"class":154},"        response ",[140,3197,832],{"class":259},[140,3199,1191],{"class":146},[140,3201,241],{"class":158},[140,3203,914],{"class":244},[140,3205,241],{"class":158},[140,3207,3208],{"class":244},"chat",[140,3210,241],{"class":158},[140,3212,3213],{"class":244},"completions",[140,3215,241],{"class":158},[140,3217,3218],{"class":263},"create",[140,3220,2291],{"class":158},[140,3222,3224,3227,3229,3231,3234,3236],{"class":142,"line":3223},198,[140,3225,3226],{"class":840},"            model",[140,3228,832],{"class":259},[140,3230,646],{"class":645},[140,3232,3233],{"class":649},"gpt-4o",[140,3235,646],{"class":645},[140,3237,802],{"class":158},[140,3239,3241,3244,3246,3248],{"class":142,"line":3240},199,[140,3242,3243],{"class":840},"            messages",[140,3245,832],{"class":259},[140,3247,2430],{"class":263},[140,3249,802],{"class":158},[140,3251,3253,3256,3258,3261],{"class":142,"line":3252},200,[140,3254,3255],{"class":840},"            temperature",[140,3257,832],{"class":259},[140,3259,3260],{"class":150},"0.3",[140,3262,802],{"class":158},[140,3264,3266,3269,3271],{"class":142,"line":3265},201,[140,3267,3268],{"class":840},"            top_p",[140,3270,832],{"class":259},[140,3272,3273],{"class":150},"0.9\n",[140,3275,3277],{"class":142,"line":3276},202,[140,3278,2362],{"class":158},[140,3280,3282,3285,3287,3290,3292,3295,3297,3300,3303,3305,3307],{"class":142,"line":3281},203,[140,3283,3284],{"class":154},"        answer ",[140,3286,832],{"class":259},[140,3288,3289],{"class":154}," response",[140,3291,241],{"class":158},[140,3293,3294],{"class":244},"choices",[140,3296,642],{"class":158},[140,3298,3299],{"class":150},"0",[140,3301,3302],{"class":158},"].",[140,3304,1348],{"class":244},[140,3306,241],{"class":158},[140,3308,3309],{"class":244},"content\n",[140,3311,3313],{"class":142,"line":3312},204,[140,3314,323],{"emptyLinePlaceholder":322},[140,3316,3318],{"class":142,"line":3317},205,[140,3319,3320],{"class":224},"        # 5. 将对话保存到记忆中\n",[140,3322,3324,3326,3328],{"class":142,"line":3323},206,[140,3325,3083],{"class":154},[140,3327,832],{"class":259},[140,3329,1437],{"class":158},[140,3331,3333,3336,3338,3340,3342,3344,3346,3348,3350,3352,3354,3356,3358,3360,3362],{"class":142,"line":3332},207,[140,3334,3335],{"class":158},"            {",[140,3337,646],{"class":645},[140,3339,3098],{"class":649},[140,3341,646],{"class":645},[140,3343,159],{"class":158},[140,3345,661],{"class":645},[140,3347,3155],{"class":649},[140,3349,646],{"class":645},[140,3351,169],{"class":158},[140,3353,661],{"class":645},[140,3355,3116],{"class":649},[140,3357,646],{"class":645},[140,3359,159],{"class":158},[140,3361,1096],{"class":154},[140,3363,3126],{"class":158},[140,3365,3367,3369,3371,3373,3375,3377,3379,3382,3384,3386,3388,3390,3392,3394,3397],{"class":142,"line":3366},208,[140,3368,3335],{"class":158},[140,3370,646],{"class":645},[140,3372,3098],{"class":649},[140,3374,646],{"class":645},[140,3376,159],{"class":158},[140,3378,661],{"class":645},[140,3380,3381],{"class":649},"assistant",[140,3383,646],{"class":645},[140,3385,169],{"class":158},[140,3387,661],{"class":645},[140,3389,3116],{"class":649},[140,3391,646],{"class":645},[140,3393,159],{"class":158},[140,3395,3396],{"class":154}," answer",[140,3398,3172],{"class":158},[140,3400,3402],{"class":142,"line":3401},209,[140,3403,3178],{"class":158},[140,3405,3407,3409,3411,3414,3416,3418,3420,3422],{"class":142,"line":3406},210,[140,3408,909],{"class":146},[140,3410,241],{"class":158},[140,3412,3413],{"class":263},"add_message",[140,3415,267],{"class":158},[140,3417,2430],{"class":263},[140,3419,169],{"class":158},[140,3421,1101],{"class":263},[140,3423,400],{"class":158},[140,3425,3427],{"class":142,"line":3426},211,[140,3428,323],{"emptyLinePlaceholder":322},[140,3430,3432],{"class":142,"line":3431},212,[140,3433,3434],{"class":224},"        # 6. 返回回答\n",[140,3436,3438,3440],{"class":142,"line":3437},213,[140,3439,1364],{"class":577},[140,3441,3442],{"class":154}," answer\n",[140,3444,3446],{"class":142,"line":3445},214,[140,3447,323],{"emptyLinePlaceholder":322},[140,3449,3451,3454,3456,3458],{"class":142,"line":3450},215,[140,3452,3453],{"class":154},"ai_assistant ",[140,3455,832],{"class":259},[140,3457,877],{"class":263},[140,3459,3460],{"class":158},"()\n",[140,3462,3464,3467,3469,3471,3474],{"class":142,"line":3463},216,[140,3465,3466],{"class":154},"user_id ",[140,3468,832],{"class":259},[140,3470,661],{"class":645},[140,3472,3473],{"class":649},"memos_knowledge_base_user_123",[140,3475,735],{"class":645},[140,3477,3479],{"class":142,"line":3478},217,[140,3480,323],{"emptyLinePlaceholder":322},[140,3482,3484,3487,3490],{"class":142,"line":3483},218,[140,3485,3486],{"class":872},"def",[140,3488,3489],{"class":1085}," demo_questions",[140,3491,3492],{"class":158},"():\n",[140,3494,3496,3499],{"class":142,"line":3495},219,[140,3497,3498],{"class":577},"    return",[140,3500,1437],{"class":158},[140,3502,3504,3507,3510],{"class":142,"line":3503},220,[140,3505,3506],{"class":645},"      '",[140,3508,3509],{"class":649},"你是谁",[140,3511,3512],{"class":645},"'\n",[140,3514,3516],{"class":142,"line":3515},221,[140,3517,3518],{"class":158},"    ]\n",[140,3520,3522],{"class":142,"line":3521},222,[140,3523,323],{"emptyLinePlaceholder":322},[140,3525,3527,3529,3532],{"class":142,"line":3526},223,[140,3528,3486],{"class":872},[140,3530,3531],{"class":1085}," main",[140,3533,3492],{"class":158},[140,3535,3537,3540,3542,3544,3547,3549,3551],{"class":142,"line":3536},224,[140,3538,3539],{"class":270},"    print",[140,3541,267],{"class":158},[140,3543,646],{"class":645},[140,3545,3546],{"class":649},"💡 欢迎使用知识库问答助手！",[140,3548,2034],{"class":2033},[140,3550,646],{"class":645},[140,3552,400],{"class":158},[140,3554,3556,3558,3560,3562,3564,3567,3569],{"class":142,"line":3555},225,[140,3557,3539],{"class":270},[140,3559,267],{"class":158},[140,3561,646],{"class":645},[140,3563,2034],{"class":2033},[140,3565,3566],{"class":649},"🎯 以下是一些示例问题，您可以继续跟助手对话:",[140,3568,646],{"class":645},[140,3570,400],{"class":158},[140,3572,3574,3577,3579,3581,3584,3586,3588,3590,3593,3596,3598],{"class":142,"line":3573},226,[140,3575,3576],{"class":577},"    for",[140,3578,2045],{"class":154},[140,3580,169],{"class":158},[140,3582,3583],{"class":154}," question ",[140,3585,1452],{"class":577},[140,3587,2055],{"class":270},[140,3589,267],{"class":158},[140,3591,3592],{"class":263},"demo_questions",[140,3594,3595],{"class":158},"(),",[140,3597,151],{"class":150},[140,3599,903],{"class":158},[140,3601,3603,3606,3608,3610,3613,3615,3617,3619,3621,3623,3626,3628,3630],{"class":142,"line":3602},227,[140,3604,3605],{"class":270},"      print",[140,3607,267],{"class":158},[140,3609,1223],{"class":872},[140,3611,3612],{"class":649},"\"  ",[140,3614,1044],{"class":1043},[140,3616,2083],{"class":263},[140,3618,1064],{"class":1043},[140,3620,2088],{"class":649},[140,3622,1044],{"class":1043},[140,3624,3625],{"class":263},"question",[140,3627,1064],{"class":1043},[140,3629,646],{"class":649},[140,3631,400],{"class":158},[140,3633,3635],{"class":142,"line":3634},228,[140,3636,323],{"emptyLinePlaceholder":322},[140,3638,3640,3643,3647],{"class":142,"line":3639},229,[140,3641,3642],{"class":577},"    while",[140,3644,3646],{"class":3645},"smHB8"," True",[140,3648,233],{"class":158},[140,3650,3652,3655,3657,3660,3662,3664,3666,3669,3671,3673,3676],{"class":142,"line":3651},230,[140,3653,3654],{"class":154},"        user_query ",[140,3656,832],{"class":259},[140,3658,3659],{"class":270}," input",[140,3661,267],{"class":158},[140,3663,646],{"class":645},[140,3665,2034],{"class":2033},[140,3667,3668],{"class":649},"🤔 请输入您的问题 (或输入 'exit' 退出): ",[140,3670,646],{"class":645},[140,3672,1404],{"class":158},[140,3674,3675],{"class":263},"strip",[140,3677,3460],{"class":158},[140,3679,3681],{"class":142,"line":3680},231,[140,3682,2805],{"class":154},[140,3684,3686,3688,3691,3693,3696,3699,3702,3705,3707,3710,3712,3714,3717,3720,3722,3724,3726,3729,3731,3733,3735,3738,3740],{"class":142,"line":3685},232,[140,3687,2000],{"class":577},[140,3689,3690],{"class":154}," user_query",[140,3692,241],{"class":158},[140,3694,3695],{"class":263},"lower",[140,3697,3698],{"class":158},"()",[140,3700,3701],{"class":259}," in",[140,3703,3704],{"class":158}," [",[140,3706,1055],{"class":645},[140,3708,3709],{"class":649},"quit",[140,3711,1055],{"class":645},[140,3713,169],{"class":158},[140,3715,3716],{"class":645}," '",[140,3718,3719],{"class":649},"exit",[140,3721,1055],{"class":645},[140,3723,169],{"class":158},[140,3725,3716],{"class":645},[140,3727,3728],{"class":649},"q",[140,3730,1055],{"class":645},[140,3732,169],{"class":158},[140,3734,3716],{"class":645},[140,3736,3737],{"class":649},"退出",[140,3739,1055],{"class":645},[140,3741,3742],{"class":158},"]:\n",[140,3744,3746,3749,3751,3753,3756,3758],{"class":142,"line":3745},233,[140,3747,3748],{"class":270},"            print",[140,3750,267],{"class":158},[140,3752,646],{"class":645},[140,3754,3755],{"class":649},"👋 感谢使用知识库问答助手！",[140,3757,646],{"class":645},[140,3759,400],{"class":158},[140,3761,3763],{"class":142,"line":3762},234,[140,3764,3765],{"class":577},"            break\n",[140,3767,3769],{"class":142,"line":3768},235,[140,3770,2805],{"class":154},[140,3772,3774,3776,3779,3781],{"class":142,"line":3773},236,[140,3775,2000],{"class":577},[140,3777,3778],{"class":259}," not",[140,3780,3690],{"class":154},[140,3782,233],{"class":158},[140,3784,3786],{"class":142,"line":3785},237,[140,3787,3788],{"class":577},"            continue\n",[140,3790,3792],{"class":142,"line":3791},238,[140,3793,2805],{"class":154},[140,3795,3797,3799,3801,3803,3806,3808],{"class":142,"line":3796},239,[140,3798,1321],{"class":270},[140,3800,267],{"class":158},[140,3802,646],{"class":645},[140,3804,3805],{"class":649},"🤖 正在处理...",[140,3807,646],{"class":645},[140,3809,400],{"class":158},[140,3811,3813,3815,3817,3820,3822,3824,3826,3829,3831,3833],{"class":142,"line":3812},240,[140,3814,3284],{"class":154},[140,3816,832],{"class":259},[140,3818,3819],{"class":154}," ai_assistant",[140,3821,241],{"class":158},[140,3823,3208],{"class":263},[140,3825,267],{"class":158},[140,3827,3828],{"class":263},"user_query",[140,3830,169],{"class":158},[140,3832,1101],{"class":263},[140,3834,400],{"class":158},[140,3836,3838,3840,3842,3844,3847,3849,3852,3854,3856],{"class":142,"line":3837},241,[140,3839,1321],{"class":270},[140,3841,267],{"class":158},[140,3843,1223],{"class":872},[140,3845,3846],{"class":649},"\"💡 [助手]: ",[140,3848,1044],{"class":1043},[140,3850,3851],{"class":263},"answer",[140,3853,1064],{"class":1043},[140,3855,646],{"class":649},[140,3857,400],{"class":158},[140,3859,3861,3863,3865,3867,3870,3872,3875,3878],{"class":142,"line":3860},242,[140,3862,1321],{"class":270},[140,3864,267],{"class":158},[140,3866,646],{"class":645},[140,3868,3869],{"class":649},"-",[140,3871,646],{"class":645},[140,3873,3874],{"class":259}," *",[140,3876,3877],{"class":150}," 60",[140,3879,400],{"class":158},[140,3881,3883],{"class":142,"line":3882},243,[140,3884,323],{"emptyLinePlaceholder":322},[140,3886,3888],{"class":142,"line":3887},244,[140,3889,323],{"emptyLinePlaceholder":322},[140,3891,3893,3896,3899,3901,3903,3906,3908],{"class":142,"line":3892},245,[140,3894,3895],{"class":577},"if",[140,3897,3898],{"class":146}," __name__",[140,3900,2572],{"class":259},[140,3902,661],{"class":645},[140,3904,3905],{"class":649},"__main__",[140,3907,646],{"class":645},[140,3909,233],{"class":158},[140,3911,3913,3916],{"class":142,"line":3912},246,[140,3914,3915],{"class":263},"    main",[140,3917,3460],{"class":158},[23,3919],{},[211,3921,3923],{"id":3922},"_222初始化运行环境","2.2.2 初始化运行环境",[130,3925,3927],{"className":132,"code":3926,"language":134,"meta":135,"style":135},"pip install OpenAI && pip install datetime\n",[137,3928,3929],{"__ignoreMap":135},[140,3930,3931,3934,3937],{"class":142,"line":143},[140,3932,3933],{"class":154},"pip install OpenAI ",[140,3935,3936],{"class":165},"&&",[140,3938,3939],{"class":154}," pip install datetime\n",[23,3941],{},[211,3943,3945],{"id":3944},"_223替换代码中的环境变量","2.2.3 替换代码中的环境变量",[3947,3948,3950],"h5",{"id":3949},"获取秘钥api_key","获取秘钥(API_KEY)",[16,3952,3953,3954,3958],{},"登录控制台",[516,3955,3956],{"href":3956,"rel":3957},"https:\u002F\u002Fmemos-dashboard.openmem.net\u002Fcn\u002Fapikeys\u002F",[520],"，复制秘钥",[16,3960,3961],{},[532,3962],{"alt":534,"src":3963},"https:\u002F\u002Fcdn.memtensor.com.cn\u002Fimg\u002F1768481468406_q51iqx_compressed.png",[130,3965,3967],{"className":132,"code":3966,"language":134,"meta":135,"style":135},"os.environ[\"MEMOS_API_KEY\"] = \"mpg-xx\" \n",[137,3968,3969],{"__ignoreMap":135},[140,3970,3971,3973,3975,3977,3979,3981,3983,3985,3987,3989,3991,3994],{"class":142,"line":143},[140,3972,634],{"class":154},[140,3974,241],{"class":158},[140,3976,639],{"class":244},[140,3978,642],{"class":158},[140,3980,646],{"class":645},[140,3982,650],{"class":649},[140,3984,646],{"class":645},[140,3986,655],{"class":158},[140,3988,658],{"class":259},[140,3990,661],{"class":645},[140,3992,3993],{"class":649},"mpg-xx",[140,3995,735],{"class":645},[3947,3997,3999],{"id":3998},"大模型client","大模型Client",[130,4001,4003],{"className":132,"code":4002,"language":134,"meta":135,"style":135},"# 替换为你自己的API_KEY\nos.environ[\"OPENAI_API_KEY\"] = \"sk-xx\" \n\nopenai_client = OpenAI(api_key=os.getenv(\"OPENAI_API_KEY\"))\n",[137,4004,4005,4009,4038,4042],{"__ignoreMap":135},[140,4006,4007],{"class":142,"line":143},[140,4008,674],{"class":224},[140,4010,4011,4013,4015,4017,4019,4021,4023,4025,4027,4029,4031,4034,4036],{"class":142,"line":178},[140,4012,634],{"class":154},[140,4014,241],{"class":158},[140,4016,639],{"class":244},[140,4018,642],{"class":158},[140,4020,646],{"class":645},[140,4022,690],{"class":649},[140,4024,646],{"class":645},[140,4026,655],{"class":158},[140,4028,658],{"class":259},[140,4030,661],{"class":645},[140,4032,4033],{"class":649},"sk-xx",[140,4035,646],{"class":645},[140,4037,669],{"class":154},[140,4039,4040],{"class":142,"line":188},[140,4041,323],{"emptyLinePlaceholder":322},[140,4043,4044,4046,4048,4050,4052,4054,4056,4058,4060,4062,4064,4066,4068,4070],{"class":142,"line":248},[140,4045,829],{"class":154},[140,4047,832],{"class":259},[140,4049,835],{"class":263},[140,4051,267],{"class":158},[140,4053,841],{"class":840},[140,4055,832],{"class":259},[140,4057,634],{"class":263},[140,4059,241],{"class":158},[140,4061,850],{"class":263},[140,4063,267],{"class":158},[140,4065,646],{"class":645},[140,4067,690],{"class":649},[140,4069,646],{"class":645},[140,4071,861],{"class":158},[3947,4073,4075],{"id":4074},"获取知识库id","获取知识库ID",[16,4077,4078],{},"针对刚才上传的知识库，复制ID，并保存",[16,4080,4081],{},[532,4082],{"alt":534,"src":4083},"https:\u002F\u002Fcdn.memtensor.com.cn\u002Fimg\u002F1768481493435_bkwqlu_compressed.png",[130,4085,4087],{"className":132,"code":4086,"language":134,"meta":135,"style":135},"# 替换为你自己的知识库ID，以下ID仅为示例，并非真实知识库ID\nos.environ[\"KNOWLEDGE_BASE_IDS\"] = json.dumps([\n  \"based540fb25-ddf1-4456-935b-41d901518e04\"\n])\n",[137,4088,4089,4093,4121,4129],{"__ignoreMap":135},[140,4090,4091],{"class":142,"line":143},[140,4092,741],{"class":224},[140,4094,4095,4097,4099,4101,4103,4105,4107,4109,4111,4113,4115,4117,4119],{"class":142,"line":178},[140,4096,634],{"class":154},[140,4098,241],{"class":158},[140,4100,639],{"class":244},[140,4102,642],{"class":158},[140,4104,646],{"class":645},[140,4106,757],{"class":649},[140,4108,646],{"class":645},[140,4110,655],{"class":158},[140,4112,658],{"class":259},[140,4114,766],{"class":154},[140,4116,241],{"class":158},[140,4118,771],{"class":263},[140,4120,774],{"class":158},[140,4122,4123,4125,4127],{"class":142,"line":188},[140,4124,780],{"class":645},[140,4126,783],{"class":649},[140,4128,735],{"class":645},[140,4130,4131],{"class":142,"line":248},[140,4132,818],{"class":158},[3947,4134,4135],{"id":4135},"执行代码",[130,4137,4139],{"className":132,"code":4138,"language":134,"meta":135,"style":135},"python knowledge_qa_assistant.py\n",[137,4140,4141],{"__ignoreMap":135},[140,4142,4143,4146,4148],{"class":142,"line":143},[140,4144,4145],{"class":154},"python knowledge_qa_assistant",[140,4147,241],{"class":158},[140,4149,4150],{"class":244},"py\n",[16,4152,4153],{},[532,4154],{"alt":534,"src":4155},"https:\u002F\u002Fcdn.memtensor.com.cn\u002Fimg\u002F1768533833272_krke26_compressed.jpeg",[23,4157],{},[26,4159,4161],{"id":4160},"_23代码说明","2.3 代码说明",[454,4163,4164,4167,4170,4177],{},[457,4165,4166],{},"在环境变量中设置你的自己的MemOS API秘钥、OpenAI的秘钥、知识库ID",[457,4168,4169],{},"实例化KnowledgeBaseAssistant",[457,4171,4172,4173,4176],{},"使用",[137,4174,4175],{},"main()","函数通过对话循环与助手进行交互",[457,4178,4179],{},"助手会调用chat，跟你进行交互，chat在执行以下步骤后，将大模型返回的答案返回给你",[4181,4182,4183,4186,4189,4192,4195,4198],"ul",{},[457,4184,4185],{},"调用get_message，搜索历史对话消息",[457,4187,4188],{},"调用search_memory，获取记忆以及偏好",[457,4190,4191],{},"构建基于记忆系统的prompt",[457,4193,4194],{},"使用大模型生成答案",[457,4196,4197],{},"调用add_message，将用户query以及大模型回答保存到记忆中，形成长期记忆",[457,4199,4200],{},"返回大模型答案",[4202,4203,4204],"style",{},"html pre.shiki code .sZaqd, html code.shiki .sZaqd{--shiki-light:#90A4AE;--shiki-default:#023B95;--shiki-dark:#79C0FF}html pre.shiki code .sJNII, html code.shiki .sJNII{--shiki-light:#F76D47;--shiki-default:#023B95;--shiki-dark:#79C0FF}html pre.shiki code .s5ojA, html code.shiki .s5ojA{--shiki-light:#90A4AE;--shiki-default:#0E1116;--shiki-dark:#E6EDF3}html pre.shiki code .suWxN, html code.shiki .suWxN{--shiki-light:#39ADB5;--shiki-default:#0E1116;--shiki-dark:#E6EDF3}html pre.shiki code .ssLBp, html code.shiki .ssLBp{--shiki-light:#90A4AE;--shiki-light-font-style:inherit;--shiki-default:#6E011A;--shiki-default-font-style:italic;--shiki-dark:#FFA198;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sfVK4, html code.shiki .sfVK4{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#66707B;--shiki-default-font-style:inherit;--shiki-dark:#8B949E;--shiki-dark-font-style:inherit}html pre.shiki code .s5qkx, html code.shiki .s5qkx{--shiki-light:#E53935;--shiki-default:#0E1116;--shiki-dark:#E6EDF3}html pre.shiki code .saN0X, html code.shiki .saN0X{--shiki-light:#39ADB5;--shiki-default:#A0111F;--shiki-dark:#FF7B72}html pre.shiki code .sa-2m, html code.shiki .sa-2m{--shiki-light:#6182B8;--shiki-default:#0E1116;--shiki-dark:#E6EDF3}html pre.shiki code .svxCd, html code.shiki .svxCd{--shiki-light:#6182B8;--shiki-default:#023B95;--shiki-dark:#79C0FF}html pre.shiki code .sBMTB, html code.shiki .sBMTB{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#A0111F;--shiki-default-font-style:inherit;--shiki-dark:#FF7B72;--shiki-dark-font-style:inherit}html pre.shiki code .sjUum, html code.shiki .sjUum{--shiki-light:#39ADB5;--shiki-default:#032563;--shiki-dark:#A5D6FF}html pre.shiki code .sp1uZ, html code.shiki .sp1uZ{--shiki-light:#91B859;--shiki-default:#032563;--shiki-dark:#A5D6FF}html pre.shiki code .sp4zP, html code.shiki .sp4zP{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#702C00;--shiki-default-font-style:inherit;--shiki-dark:#FFA657;--shiki-dark-font-style:inherit}html pre.shiki code .sZ6T4, html code.shiki .sZ6T4{--shiki-light:#9C3EDA;--shiki-default:#A0111F;--shiki-dark:#FF7B72}html pre.shiki code .saonL, html code.shiki .saonL{--shiki-light:#E2931D;--shiki-default:#702C00;--shiki-dark:#FFA657}html pre.shiki code .sZhmI, html code.shiki .sZhmI{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#0E1116;--shiki-default-font-style:inherit;--shiki-dark:#E6EDF3;--shiki-dark-font-style:inherit}html pre.shiki code .scyET, html code.shiki .scyET{--shiki-light:#F76D47;--shiki-default:#A0111F;--shiki-dark:#FF7B72}html pre.shiki code .sbcIq, html code.shiki .sbcIq{--shiki-light:#6182B8;--shiki-default:#622CBC;--shiki-dark:#D2A8FF}html pre.shiki code .sM07a, html code.shiki .sM07a{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#0E1116;--shiki-default-font-style:inherit;--shiki-dark:#E6EDF3;--shiki-dark-font-style:inherit}html pre.shiki code .s9tbJ, html code.shiki .s9tbJ{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#032563;--shiki-default-font-style:inherit;--shiki-dark:#A5D6FF;--shiki-dark-font-style:inherit}html pre.shiki code .soLfw, html code.shiki .soLfw{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#032563;--shiki-default-font-style:inherit;--shiki-dark:#A5D6FF;--shiki-dark-font-style:inherit}html pre.shiki code .seOsA, html code.shiki .seOsA{--shiki-light:#90A4AE;--shiki-default:#A0111F;--shiki-dark:#FF7B72}html pre.shiki code .smHB8, html code.shiki .smHB8{--shiki-light:#39ADB5;--shiki-default:#023B95;--shiki-dark:#79C0FF}",{"title":135,"searchDepth":178,"depth":178,"links":4206},[4207,4212],{"id":13,"depth":178,"text":14,"children":4208},[4209,4210,4211],{"id":28,"depth":188,"text":29},{"id":124,"depth":188,"text":125},{"id":448,"depth":188,"text":449},{"id":503,"depth":178,"text":504,"children":4213},[4214,4215,4216],{"id":507,"depth":188,"text":508},{"id":557,"depth":188,"text":558},{"id":4160,"depth":188,"text":4161},"融合长期记忆与知识库，告别 “千人一面” 的检索结果，基于用户背景与偏好提供个性化、精准化解答，让知识库成为懂你的专属顾问。","md",{},"\u002Fcn\u002Fusecase\u002Fknowledge_qa_assistant",{"title":5,"description":135},"cn\u002Fusecase\u002Fknowledge_qa_assistant","n_1_dyN5AZ7Ea-o6OuW_lAw2Y29fAkN4rbLpZHsii7s",[4225],{"title":4226,"path":4227,"stem":4228,"icon":4229,"framework":6,"module":6,"class":4230,"target":-1,"active":4231,"defaultOpen":4231,"children":-1,"description":4232},"理财助手","\u002Fcn\u002Fusecase\u002Ffinancial_assistant","usecase\u002Ffinancial_assistant","i-ri-money-dollar-circle-line",[],false,"借助 MemOS，将用户的操作与对话行为抽象为“记忆”，从而识别并提炼背后的投资偏好，实现更懂客户的个性化服务。",1778836918065]