[{"data":1,"prerenderedAt":1409},["ShallowReactive",2],{"\u002Fcn\u002Fopen_source\u002Fmodules\u002Fmem_reader":3,"surround-\u002Fcn\u002Fopen_source\u002Fmodules\u002Fmem_reader":1393},{"id":4,"title":5,"avatar":6,"banner":6,"body":7,"category":6,"desc":1386,"description":292,"extension":1387,"links":6,"meta":1388,"navigation":6,"path":1389,"seo":1390,"stem":1391,"__hash__":1392},"docs\u002Fcn\u002Fopen_source\u002Fmodules\u002Fmem_reader.md","MemReader",null,{"type":8,"value":9,"toc":1365},"minimark",[10,15,23,26,48,51,55,58,63,96,100,130,132,136,139,189,191,195,266,268,272,279,286,414,421,424,516,524,535,537,541,545,551,839,843,848,1182,1186,1189,1308,1310,1314,1321,1361],[11,12,14],"h2",{"id":13},"_1-简介","1. 简介",[16,17,18,19,22],"p",{},"在构建 AI 应用时，我们经常遇到这样的问题：用户发来的东西千奇百怪——有的是随口的聊天，有的是 PDF 文档，有的是图片。",[20,21,5],"strong",{}," 的作用就是把这些原始数据（Raw Data）“嚼碎”并“消化”，变成带有 Embedding 和元数据的标准记忆块（Memory Item）。",[16,24,25],{},"简单来说，它做三件事：",[27,28,29,36,42],"ol",{},[30,31,32,35],"li",{},[20,33,34],{},"归一化","：不管你发来的是字符串还是 JSON，先统一变成标准格式。",[30,37,38,41],{},[20,39,40],{},"切片 (Chunking)","：把长对话或长文档切成合适的小块，方便后续处理。",[30,43,44,47],{},[20,45,46],{},"精炼 (Extraction)","：调用 LLM 把非结构化的信息提取成结构化的知识点（Fine 模式），或者直接生成快照（Fast 模式）。",[49,50],"hr",{},[11,52,54],{"id":53},"_2-核心模式","2. 核心模式",[16,56,57],{},"MemReader 设计了两种工作模式，分别对应“快”和“准”两种需求：",[59,60,62],"h3",{"id":61},"fast-模式唯快不破","⚡ Fast 模式（唯快不破）",[64,65,66,76,90],"ul",{},[30,67,68,71,72,75],{},[20,69,70],{},"特点","：",[20,73,74],{},"不调用 LLM","，只做切片和 Embedding。",[30,77,78,81,82],{},[20,79,80],{},"适用场景","：\n",[64,83,84,87],{},[30,85,86],{},"用户发消息飞快，系统需要毫秒级响应。",[30,88,89],{},"只需保留对话的“快照”，不需要深度理解。",[30,91,92,95],{},[20,93,94],{},"产物","：原始文本片段 + 向量索引 + 来源追踪 (Sources)。",[59,97,99],{"id":98},"fine-模式精雕细琢","🧠 Fine 模式（精雕细琢）",[64,101,102,110,125],{},[30,103,104,71,106,109],{},[20,105,70],{},[20,107,108],{},"调用 LLM"," 进行深度分析。",[30,111,112,81,114],{},[20,113,80],{},[64,115,116,119,122],{},[30,117,118],{},"长时记忆写入（需要提取关键事实）。",[30,120,121],{},"文档分析（需要总结核心观点）。",[30,123,124],{},"多模态理解（需要看懂图片里的内容）。",[30,126,127,129],{},[20,128,94],{},"：结构化的事实 + 关键信息提取 (Key) + 背景 (Background) + 向量索引 + 来源追踪 (Sources) + 多模态细节。",[49,131],{},[11,133,135],{"id":134},"_3-代码结构","3. 代码结构",[16,137,138],{},"MemReader 的代码结构非常清晰，主要由以下几部分组成：",[64,140,141,150,162,173],{},[30,142,143,149],{},[20,144,145],{},[146,147,148],"code",{},"base.py",": 定义了所有 Reader 必须遵守的接口规范。",[30,151,152,157,158,161],{},[20,153,154],{},[146,155,156],{},"simple_struct.py",": ",[20,159,160],{},"最常用的实现","。专攻纯文本对话和本地文档，轻量高效。",[30,163,164,157,169,172],{},[20,165,166],{},[146,167,168],{},"multi_modal_struct.py",[20,170,171],{},"全能型选手","。能处理图片、文件 URL、Tool 调用等复杂输入。",[30,174,175,180,181,184,185,188],{},[20,176,177],{},[146,178,179],{},"read_multi_modal\u002F",": 存放了各种具体的解析器（Parser），比如专门解析图片的 ",[146,182,183],{},"ImageParser","，解析文件的 ",[146,186,187],{},"FileParser"," 等。",[49,190],{},[11,192,194],{"id":193},"_4-如何选择","4. 如何选择？",[196,197,198,215],"table",{},[199,200,201],"thead",{},[202,203,204,209,212],"tr",{},[205,206,208],"th",{"align":207},"left","你的需求",[205,210,211],{"align":207},"推荐选择",[205,213,214],{"align":207},"理由",[216,217,218,234,249],"tbody",{},[202,219,220,226,231],{},[221,222,223],"td",{"align":207},[20,224,225],{},"只处理纯文本对话",[221,227,228],{"align":207},[146,229,230],{},"SimpleStructMemReader",[221,232,233],{"align":207},"简单、直接、性能好。",[202,235,236,241,246],{},[221,237,238],{"align":207},[20,239,240],{},"需要处理图片、文件链接",[221,242,243],{"align":207},[146,244,245],{},"MultiModalStructMemReader",[221,247,248],{"align":207},"内置了多模态解析能力。",[202,250,251,256,263],{},[221,252,253],{"align":207},[20,254,255],{},"需要从 Fast 升级到 Fine",[221,257,258,259,262],{"align":207},"任意 Reader 的 ",[146,260,261],{},"fine_transfer"," 方法",[221,264,265],{"align":207},"支持“先存后优”的渐进式策略。",[49,267],{},[11,269,271],{"id":270},"_5-api-概览","5. API 概览",[59,273,275,276],{"id":274},"统一工厂memreaderfactory","统一工厂：",[146,277,278],{},"MemReaderFactory",[16,280,281,282,285],{},"不要自己去 ",[146,283,284],{},"new"," 对象，使用工厂模式是最佳实践：",[287,288,293],"pre",{"className":289,"code":290,"language":291,"meta":292,"style":292},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from memos.configs.mem_reader import MemReaderConfigFactory\nfrom memos.mem_reader.factory import MemReaderFactory\n\n# 从配置创建 Reader\ncfg = MemReaderConfigFactory.model_validate({...})\nreader = MemReaderFactory.from_config(cfg)\n","python","",[146,294,295,326,348,355,362,389],{"__ignoreMap":292},[296,297,300,304,308,312,315,317,320,323],"span",{"class":298,"line":299},"line",1,[296,301,303],{"class":302},"s7zQu","from",[296,305,307],{"class":306},"sTEyZ"," memos",[296,309,311],{"class":310},"sMK4o",".",[296,313,314],{"class":306},"configs",[296,316,311],{"class":310},[296,318,319],{"class":306},"mem_reader ",[296,321,322],{"class":302},"import",[296,324,325],{"class":306}," MemReaderConfigFactory\n",[296,327,329,331,333,335,338,340,343,345],{"class":298,"line":328},2,[296,330,303],{"class":302},[296,332,307],{"class":306},[296,334,311],{"class":310},[296,336,337],{"class":306},"mem_reader",[296,339,311],{"class":310},[296,341,342],{"class":306},"factory ",[296,344,322],{"class":302},[296,346,347],{"class":306}," MemReaderFactory\n",[296,349,351],{"class":298,"line":350},3,[296,352,354],{"emptyLinePlaceholder":353},true,"\n",[296,356,358],{"class":298,"line":357},4,[296,359,361],{"class":360},"sHwdD","# 从配置创建 Reader\n",[296,363,365,368,371,374,376,380,383,386],{"class":298,"line":364},5,[296,366,367],{"class":306},"cfg ",[296,369,370],{"class":310},"=",[296,372,373],{"class":306}," MemReaderConfigFactory",[296,375,311],{"class":310},[296,377,379],{"class":378},"s2Zo4","model_validate",[296,381,382],{"class":310},"({",[296,384,385],{"class":378},"...",[296,387,388],{"class":310},"})\n",[296,390,392,395,397,400,402,405,408,411],{"class":298,"line":391},6,[296,393,394],{"class":306},"reader ",[296,396,370],{"class":310},[296,398,399],{"class":306}," MemReaderFactory",[296,401,311],{"class":310},[296,403,404],{"class":378},"from_config",[296,406,407],{"class":310},"(",[296,409,410],{"class":378},"cfg",[296,412,413],{"class":310},")\n",[59,415,417,418],{"id":416},"核心方法get_memory","核心方法：",[146,419,420],{},"get_memory()",[16,422,423],{},"这是你最常调用的方法。",[287,425,427],{"className":289,"code":426,"language":291,"meta":292,"style":292},"memories = reader.get_memory(\n    scene_data,       # 你的输入数据\n    type=\"chat\",      # 类型：chat 或 doc\n    info=user_info,   # 用户信息（user_id, session_id）\n    mode=\"fine\"       # 模式：fast 或 fine（强烈建议显式指定！）\n)\n",[146,428,429,447,458,480,495,512],{"__ignoreMap":292},[296,430,431,434,436,439,441,444],{"class":298,"line":299},[296,432,433],{"class":306},"memories ",[296,435,370],{"class":310},[296,437,438],{"class":306}," reader",[296,440,311],{"class":310},[296,442,443],{"class":378},"get_memory",[296,445,446],{"class":310},"(\n",[296,448,449,452,455],{"class":298,"line":328},[296,450,451],{"class":378},"    scene_data",[296,453,454],{"class":310},",",[296,456,457],{"class":360},"       # 你的输入数据\n",[296,459,460,464,466,469,473,475,477],{"class":298,"line":350},[296,461,463],{"class":462},"sHdIc","    type",[296,465,370],{"class":310},[296,467,468],{"class":310},"\"",[296,470,472],{"class":471},"sfazB","chat",[296,474,468],{"class":310},[296,476,454],{"class":310},[296,478,479],{"class":360},"      # 类型：chat 或 doc\n",[296,481,482,485,487,490,492],{"class":298,"line":357},[296,483,484],{"class":462},"    info",[296,486,370],{"class":310},[296,488,489],{"class":378},"user_info",[296,491,454],{"class":310},[296,493,494],{"class":360},"   # 用户信息（user_id, session_id）\n",[296,496,497,500,502,504,507,509],{"class":298,"line":364},[296,498,499],{"class":462},"    mode",[296,501,370],{"class":310},[296,503,468],{"class":310},[296,505,506],{"class":471},"fine",[296,508,468],{"class":310},[296,510,511],{"class":360},"       # 模式：fast 或 fine（强烈建议显式指定！）\n",[296,513,514],{"class":298,"line":391},[296,515,413],{"class":310},[16,517,518,71,521],{},[20,519,520],{},"返回结果",[146,522,523],{},"list[list[TextualMemoryItem]]",[525,526,528],"note",{"icon":527},"ri:bnb-fill",[16,529,530,531,534],{},"为什么是双层列表？",[532,533],"br",{},"\n因为一个长对话可能会被切成多个窗口（Window），外层列表代表窗口，内层列表代表该窗口提取出的记忆项。",[49,536],{},[11,538,540],{"id":539},"_6-开发实战","6. 开发实战",[59,542,544],{"id":543},"场景一处理简单的聊天记录","场景一：处理简单的聊天记录",[16,546,547,548,550],{},"这是最基础的用法，使用 ",[146,549,230],{},"。",[287,552,554],{"className":289,"code":553,"language":291,"meta":292,"style":292},"# 1. 准备输入：标准的 OpenAI 格式对话\nconversation = [\n    [\n        {\"role\": \"user\", \"content\": \"我明天下午 3 点有个会\"},\n        {\"role\": \"assistant\", \"content\": \"会议主题是什么？\"},\n        {\"role\": \"user\", \"content\": \"讨论 Q4 项目截止日期\"},\n    ]\n]\n\n# 2. 提取记忆 (Fine 模式)\nmemories = reader.get_memory(\n    conversation,\n    type=\"chat\",\n    mode=\"fine\",\n    info={\"user_id\": \"u1\", \"session_id\": \"s1\"}\n)\n\n# 3. 结果\n# memories 里会包含提取出的事实，例如：\"用户明天下午3点有关于Q4项目的会议\"\n",[146,555,556,561,571,576,620,658,695,701,707,712,718,733,742,757,772,817,822,827,833],{"__ignoreMap":292},[296,557,558],{"class":298,"line":299},[296,559,560],{"class":360},"# 1. 准备输入：标准的 OpenAI 格式对话\n",[296,562,563,566,568],{"class":298,"line":328},[296,564,565],{"class":306},"conversation ",[296,567,370],{"class":310},[296,569,570],{"class":310}," [\n",[296,572,573],{"class":298,"line":350},[296,574,575],{"class":310},"    [\n",[296,577,578,581,583,586,588,591,594,597,599,601,603,606,608,610,612,615,617],{"class":298,"line":357},[296,579,580],{"class":310},"        {",[296,582,468],{"class":310},[296,584,585],{"class":471},"role",[296,587,468],{"class":310},[296,589,590],{"class":310},":",[296,592,593],{"class":310}," \"",[296,595,596],{"class":471},"user",[296,598,468],{"class":310},[296,600,454],{"class":310},[296,602,593],{"class":310},[296,604,605],{"class":471},"content",[296,607,468],{"class":310},[296,609,590],{"class":310},[296,611,593],{"class":310},[296,613,614],{"class":471},"我明天下午 3 点有个会",[296,616,468],{"class":310},[296,618,619],{"class":310},"},\n",[296,621,622,624,626,628,630,632,634,637,639,641,643,645,647,649,651,654,656],{"class":298,"line":364},[296,623,580],{"class":310},[296,625,468],{"class":310},[296,627,585],{"class":471},[296,629,468],{"class":310},[296,631,590],{"class":310},[296,633,593],{"class":310},[296,635,636],{"class":471},"assistant",[296,638,468],{"class":310},[296,640,454],{"class":310},[296,642,593],{"class":310},[296,644,605],{"class":471},[296,646,468],{"class":310},[296,648,590],{"class":310},[296,650,593],{"class":310},[296,652,653],{"class":471},"会议主题是什么？",[296,655,468],{"class":310},[296,657,619],{"class":310},[296,659,660,662,664,666,668,670,672,674,676,678,680,682,684,686,688,691,693],{"class":298,"line":391},[296,661,580],{"class":310},[296,663,468],{"class":310},[296,665,585],{"class":471},[296,667,468],{"class":310},[296,669,590],{"class":310},[296,671,593],{"class":310},[296,673,596],{"class":471},[296,675,468],{"class":310},[296,677,454],{"class":310},[296,679,593],{"class":310},[296,681,605],{"class":471},[296,683,468],{"class":310},[296,685,590],{"class":310},[296,687,593],{"class":310},[296,689,690],{"class":471},"讨论 Q4 项目截止日期",[296,692,468],{"class":310},[296,694,619],{"class":310},[296,696,698],{"class":298,"line":697},7,[296,699,700],{"class":310},"    ]\n",[296,702,704],{"class":298,"line":703},8,[296,705,706],{"class":310},"]\n",[296,708,710],{"class":298,"line":709},9,[296,711,354],{"emptyLinePlaceholder":353},[296,713,715],{"class":298,"line":714},10,[296,716,717],{"class":360},"# 2. 提取记忆 (Fine 模式)\n",[296,719,721,723,725,727,729,731],{"class":298,"line":720},11,[296,722,433],{"class":306},[296,724,370],{"class":310},[296,726,438],{"class":306},[296,728,311],{"class":310},[296,730,443],{"class":378},[296,732,446],{"class":310},[296,734,736,739],{"class":298,"line":735},12,[296,737,738],{"class":378},"    conversation",[296,740,741],{"class":310},",\n",[296,743,745,747,749,751,753,755],{"class":298,"line":744},13,[296,746,463],{"class":462},[296,748,370],{"class":310},[296,750,468],{"class":310},[296,752,472],{"class":471},[296,754,468],{"class":310},[296,756,741],{"class":310},[296,758,760,762,764,766,768,770],{"class":298,"line":759},14,[296,761,499],{"class":462},[296,763,370],{"class":310},[296,765,468],{"class":310},[296,767,506],{"class":471},[296,769,468],{"class":310},[296,771,741],{"class":310},[296,773,775,777,780,782,785,787,789,791,794,796,798,800,803,805,807,809,812,814],{"class":298,"line":774},15,[296,776,484],{"class":462},[296,778,779],{"class":310},"={",[296,781,468],{"class":310},[296,783,784],{"class":471},"user_id",[296,786,468],{"class":310},[296,788,590],{"class":310},[296,790,593],{"class":310},[296,792,793],{"class":471},"u1",[296,795,468],{"class":310},[296,797,454],{"class":310},[296,799,593],{"class":310},[296,801,802],{"class":471},"session_id",[296,804,468],{"class":310},[296,806,590],{"class":310},[296,808,593],{"class":310},[296,810,811],{"class":471},"s1",[296,813,468],{"class":310},[296,815,816],{"class":310},"}\n",[296,818,820],{"class":298,"line":819},16,[296,821,413],{"class":310},[296,823,825],{"class":298,"line":824},17,[296,826,354],{"emptyLinePlaceholder":353},[296,828,830],{"class":298,"line":829},18,[296,831,832],{"class":360},"# 3. 结果\n",[296,834,836],{"class":298,"line":835},19,[296,837,838],{"class":360},"# memories 里会包含提取出的事实，例如：\"用户明天下午3点有关于Q4项目的会议\"\n",[59,840,842],{"id":841},"场景二处理多模态输入","场景二：处理多模态输入",[16,844,845,846,550],{},"当用户发来图片或文件链接时，切换到 ",[146,847,245],{},[287,849,851],{"className":289,"code":850,"language":291,"meta":292,"style":292},"# 1. 准备输入：包含文件和图片的复杂消息\nscene_data = [\n    [\n        {\n            \"role\": \"user\",\n            \"content\": [\n                {\"type\": \"text\", \"text\": \"看看这个文件和图片\"},\n                # 文件支持 URL 自动下载解析\n                {\"type\": \"file\", \"file\": {\"file_data\": \"https:\u002F\u002Fexample.com\u002Freadme.md\"}},\n                # 图片支持 URL\n                {\"type\": \"image_url\", \"image_url\": {\"url\": \"https:\u002F\u002Fexample.com\u002Fchart.png\"}},\n            ]\n        }\n    ]\n]\n\n# 2. 提取记忆\nmemories = multimodal_reader.get_memory(\n    scene_data,\n    type=\"chat\",\n    mode=\"fine\", # 只有 Fine 模式才会调用视觉模型解析图片\n    info={\"user_id\": \"u1\", \"session_id\": \"s1\"}\n)\n",[146,852,853,858,867,871,876,895,907,947,952,1003,1008,1057,1062,1067,1071,1075,1079,1084,1099,1105,1120,1138,1177],{"__ignoreMap":292},[296,854,855],{"class":298,"line":299},[296,856,857],{"class":360},"# 1. 准备输入：包含文件和图片的复杂消息\n",[296,859,860,863,865],{"class":298,"line":328},[296,861,862],{"class":306},"scene_data ",[296,864,370],{"class":310},[296,866,570],{"class":310},[296,868,869],{"class":298,"line":350},[296,870,575],{"class":310},[296,872,873],{"class":298,"line":357},[296,874,875],{"class":310},"        {\n",[296,877,878,881,883,885,887,889,891,893],{"class":298,"line":364},[296,879,880],{"class":310},"            \"",[296,882,585],{"class":471},[296,884,468],{"class":310},[296,886,590],{"class":310},[296,888,593],{"class":310},[296,890,596],{"class":471},[296,892,468],{"class":310},[296,894,741],{"class":310},[296,896,897,899,901,903,905],{"class":298,"line":391},[296,898,880],{"class":310},[296,900,605],{"class":471},[296,902,468],{"class":310},[296,904,590],{"class":310},[296,906,570],{"class":310},[296,908,909,912,914,917,919,921,923,926,928,930,932,934,936,938,940,943,945],{"class":298,"line":697},[296,910,911],{"class":310},"                {",[296,913,468],{"class":310},[296,915,916],{"class":471},"type",[296,918,468],{"class":310},[296,920,590],{"class":310},[296,922,593],{"class":310},[296,924,925],{"class":471},"text",[296,927,468],{"class":310},[296,929,454],{"class":310},[296,931,593],{"class":310},[296,933,925],{"class":471},[296,935,468],{"class":310},[296,937,590],{"class":310},[296,939,593],{"class":310},[296,941,942],{"class":471},"看看这个文件和图片",[296,944,468],{"class":310},[296,946,619],{"class":310},[296,948,949],{"class":298,"line":703},[296,950,951],{"class":360},"                # 文件支持 URL 自动下载解析\n",[296,953,954,956,958,960,962,964,966,969,971,973,975,977,979,981,984,986,989,991,993,995,998,1000],{"class":298,"line":709},[296,955,911],{"class":310},[296,957,468],{"class":310},[296,959,916],{"class":471},[296,961,468],{"class":310},[296,963,590],{"class":310},[296,965,593],{"class":310},[296,967,968],{"class":471},"file",[296,970,468],{"class":310},[296,972,454],{"class":310},[296,974,593],{"class":310},[296,976,968],{"class":471},[296,978,468],{"class":310},[296,980,590],{"class":310},[296,982,983],{"class":310}," {",[296,985,468],{"class":310},[296,987,988],{"class":471},"file_data",[296,990,468],{"class":310},[296,992,590],{"class":310},[296,994,593],{"class":310},[296,996,997],{"class":471},"https:\u002F\u002Fexample.com\u002Freadme.md",[296,999,468],{"class":310},[296,1001,1002],{"class":310},"}},\n",[296,1004,1005],{"class":298,"line":714},[296,1006,1007],{"class":360},"                # 图片支持 URL\n",[296,1009,1010,1012,1014,1016,1018,1020,1022,1025,1027,1029,1031,1033,1035,1037,1039,1041,1044,1046,1048,1050,1053,1055],{"class":298,"line":720},[296,1011,911],{"class":310},[296,1013,468],{"class":310},[296,1015,916],{"class":471},[296,1017,468],{"class":310},[296,1019,590],{"class":310},[296,1021,593],{"class":310},[296,1023,1024],{"class":471},"image_url",[296,1026,468],{"class":310},[296,1028,454],{"class":310},[296,1030,593],{"class":310},[296,1032,1024],{"class":471},[296,1034,468],{"class":310},[296,1036,590],{"class":310},[296,1038,983],{"class":310},[296,1040,468],{"class":310},[296,1042,1043],{"class":471},"url",[296,1045,468],{"class":310},[296,1047,590],{"class":310},[296,1049,593],{"class":310},[296,1051,1052],{"class":471},"https:\u002F\u002Fexample.com\u002Fchart.png",[296,1054,468],{"class":310},[296,1056,1002],{"class":310},[296,1058,1059],{"class":298,"line":735},[296,1060,1061],{"class":310},"            ]\n",[296,1063,1064],{"class":298,"line":744},[296,1065,1066],{"class":310},"        }\n",[296,1068,1069],{"class":298,"line":759},[296,1070,700],{"class":310},[296,1072,1073],{"class":298,"line":774},[296,1074,706],{"class":310},[296,1076,1077],{"class":298,"line":819},[296,1078,354],{"emptyLinePlaceholder":353},[296,1080,1081],{"class":298,"line":824},[296,1082,1083],{"class":360},"# 2. 提取记忆\n",[296,1085,1086,1088,1090,1093,1095,1097],{"class":298,"line":829},[296,1087,433],{"class":306},[296,1089,370],{"class":310},[296,1091,1092],{"class":306}," multimodal_reader",[296,1094,311],{"class":310},[296,1096,443],{"class":378},[296,1098,446],{"class":310},[296,1100,1101,1103],{"class":298,"line":835},[296,1102,451],{"class":378},[296,1104,741],{"class":310},[296,1106,1108,1110,1112,1114,1116,1118],{"class":298,"line":1107},20,[296,1109,463],{"class":462},[296,1111,370],{"class":310},[296,1113,468],{"class":310},[296,1115,472],{"class":471},[296,1117,468],{"class":310},[296,1119,741],{"class":310},[296,1121,1123,1125,1127,1129,1131,1133,1135],{"class":298,"line":1122},21,[296,1124,499],{"class":462},[296,1126,370],{"class":310},[296,1128,468],{"class":310},[296,1130,506],{"class":471},[296,1132,468],{"class":310},[296,1134,454],{"class":310},[296,1136,1137],{"class":360}," # 只有 Fine 模式才会调用视觉模型解析图片\n",[296,1139,1141,1143,1145,1147,1149,1151,1153,1155,1157,1159,1161,1163,1165,1167,1169,1171,1173,1175],{"class":298,"line":1140},22,[296,1142,484],{"class":462},[296,1144,779],{"class":310},[296,1146,468],{"class":310},[296,1148,784],{"class":471},[296,1150,468],{"class":310},[296,1152,590],{"class":310},[296,1154,593],{"class":310},[296,1156,793],{"class":471},[296,1158,468],{"class":310},[296,1160,454],{"class":310},[296,1162,593],{"class":310},[296,1164,802],{"class":471},[296,1166,468],{"class":310},[296,1168,590],{"class":310},[296,1170,593],{"class":310},[296,1172,811],{"class":471},[296,1174,468],{"class":310},[296,1176,816],{"class":310},[296,1178,1180],{"class":298,"line":1179},23,[296,1181,413],{"class":310},[59,1183,1185],{"id":1184},"场景三渐进式优化-fine-transfer","场景三：渐进式优化 (Fine Transfer)",[16,1187,1188],{},"为了用户体验，你可以先用 Fast 模式快速存下对话，等系统空闲时再把它“精炼”成 Fine 记忆。",[287,1190,1192],{"className":289,"code":1191,"language":291,"meta":292,"style":292},"# 1. 先快速存（毫秒级）\nfast_memories = reader.get_memory(conversation, mode=\"fast\", ...)\n\n# ... 存入数据库 ...\n\n# 2. 后台异步精炼\nrefined_memories = reader.fine_transfer_simple_mem(\n    fast_memories_flat_list, # 注意这里传入的是展平后的 Item 列表\n    type=\"chat\"\n)\n\n# 3. 用 refined_memories 替换掉原来的 fast_memories\n",[146,1193,1194,1199,1238,1242,1247,1251,1256,1272,1282,1295,1299,1303],{"__ignoreMap":292},[296,1195,1196],{"class":298,"line":299},[296,1197,1198],{"class":360},"# 1. 先快速存（毫秒级）\n",[296,1200,1201,1204,1206,1208,1210,1212,1214,1217,1219,1222,1224,1226,1229,1231,1233,1236],{"class":298,"line":328},[296,1202,1203],{"class":306},"fast_memories ",[296,1205,370],{"class":310},[296,1207,438],{"class":306},[296,1209,311],{"class":310},[296,1211,443],{"class":378},[296,1213,407],{"class":310},[296,1215,1216],{"class":378},"conversation",[296,1218,454],{"class":310},[296,1220,1221],{"class":462}," mode",[296,1223,370],{"class":310},[296,1225,468],{"class":310},[296,1227,1228],{"class":471},"fast",[296,1230,468],{"class":310},[296,1232,454],{"class":310},[296,1234,1235],{"class":378}," ...",[296,1237,413],{"class":310},[296,1239,1240],{"class":298,"line":350},[296,1241,354],{"emptyLinePlaceholder":353},[296,1243,1244],{"class":298,"line":357},[296,1245,1246],{"class":360},"# ... 存入数据库 ...\n",[296,1248,1249],{"class":298,"line":364},[296,1250,354],{"emptyLinePlaceholder":353},[296,1252,1253],{"class":298,"line":391},[296,1254,1255],{"class":360},"# 2. 后台异步精炼\n",[296,1257,1258,1261,1263,1265,1267,1270],{"class":298,"line":697},[296,1259,1260],{"class":306},"refined_memories ",[296,1262,370],{"class":310},[296,1264,438],{"class":306},[296,1266,311],{"class":310},[296,1268,1269],{"class":378},"fine_transfer_simple_mem",[296,1271,446],{"class":310},[296,1273,1274,1277,1279],{"class":298,"line":703},[296,1275,1276],{"class":378},"    fast_memories_flat_list",[296,1278,454],{"class":310},[296,1280,1281],{"class":360}," # 注意这里传入的是展平后的 Item 列表\n",[296,1283,1284,1286,1288,1290,1292],{"class":298,"line":709},[296,1285,463],{"class":462},[296,1287,370],{"class":310},[296,1289,468],{"class":310},[296,1291,472],{"class":471},[296,1293,1294],{"class":310},"\"\n",[296,1296,1297],{"class":298,"line":714},[296,1298,413],{"class":310},[296,1300,1301],{"class":298,"line":720},[296,1302,354],{"emptyLinePlaceholder":353},[296,1304,1305],{"class":298,"line":735},[296,1306,1307],{"class":360},"# 3. 用 refined_memories 替换掉原来的 fast_memories\n",[49,1309],{},[11,1311,1313],{"id":1312},"_7-配置项说明","7. 配置项说明",[16,1315,1316,1317,1320],{},"在 ",[146,1318,1319],{},".env"," 或配置文件中，你可以调整以下关键参数：",[64,1322,1323,1334,1345],{},[30,1324,1325,157,1330,1333],{},[20,1326,1327],{},[146,1328,1329],{},"chat_window_max_tokens",[20,1331,1332],{},"滑窗大小","。默认 1024。决定了多少上下文会被打包在一起处理。设得太小容易丢失语境，设得太大容易超出 LLM 的 Token 限制。",[30,1335,1336,157,1341,1344],{},[20,1337,1338],{},[146,1339,1340],{},"remove_prompt_example",[20,1342,1343],{},"是否移除 Prompt 里的示例","。True = 省 Token 但可能降低提取质量；False = 保留示例提高准确度但消耗更多 Token（保留 Few-shot 示例）。",[30,1346,1347,1352,1353,1356,1357,1360],{},[20,1348,1349],{},[146,1350,1351],{},"direct_markdown_hostnames"," (仅多模态): ",[20,1354,1355],{},"域名白名单","。列表中的域名（如 ",[146,1358,1359],{},"raw.githubusercontent.com","）会被直接当作 Markdown 文本处理，跳过 OCR\u002F格式转换步骤，加速处理。",[1362,1363,1364],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":292,"searchDepth":328,"depth":328,"links":1366},[1367,1368,1372,1373,1374,1380,1385],{"id":13,"depth":328,"text":14},{"id":53,"depth":328,"text":54,"children":1369},[1370,1371],{"id":61,"depth":350,"text":62},{"id":98,"depth":350,"text":99},{"id":134,"depth":328,"text":135},{"id":193,"depth":328,"text":194},{"id":270,"depth":328,"text":271,"children":1375},[1376,1378],{"id":274,"depth":350,"text":1377},"统一工厂：MemReaderFactory",{"id":416,"depth":350,"text":1379},"核心方法：get_memory()",{"id":539,"depth":328,"text":540,"children":1381},[1382,1383,1384],{"id":543,"depth":350,"text":544},{"id":841,"depth":350,"text":842},{"id":1184,"depth":350,"text":1185},{"id":1312,"depth":328,"text":1313},"“MemReader 是你的“记忆翻译官”。它负责把杂乱的输入（聊天、文档、图片）翻译成系统能理解的、结构化的记忆片段。\"","md",{},"\u002Fcn\u002Fopen_source\u002Fmodules\u002Fmem_reader",{"title":5,"description":292},"cn\u002Fopen_source\u002Fmodules\u002Fmem_reader","HGU_UA79SXe9tofBsojGu42wD59Aep95hMB8e0qTHWk",[1394,1402],{"title":1395,"path":1396,"stem":1397,"icon":1398,"framework":6,"module":6,"class":1399,"target":-1,"active":1400,"defaultOpen":1400,"children":-1,"description":1401},"MemCube记忆立方","\u002Fcn\u002Fopen_source\u002Fmodules\u002Fmem_cube","open_source\u002Fmodules\u002Fmem_cube","i-ri-checkbox-multiple-blank-line",[],false,"MemCube 是你的“记忆收纳箱”，统一管理三种类型的记忆：明文记忆、激活记忆和参数化记忆。它提供简洁的接口，方便加载、保存和操作多个记忆模块，让开发者轻松构建、保存和共享记忆增强应用。",{"title":1403,"path":1404,"stem":1405,"icon":1406,"framework":6,"module":6,"class":1407,"target":-1,"active":1400,"defaultOpen":1400,"children":-1,"description":1408},"MemScheduler 记忆调度","\u002Fcn\u002Fopen_source\u002Fmodules\u002Fmem_scheduler","open_source\u002Fmodules\u002Fmem_scheduler","i-ri-calendar-line",[],"MemScheduler 是你的“记忆组织调度器”，它在后台异步管理记忆的流转和更新，协调工作记忆、长时记忆和激活记忆之间的交互，让对话系统能够动态地组织和利用记忆。",1774339750898]