基于mem0和多模态RAG的本地文件问答系统——项目整体流程
湛蓝的泪
2026年02月23日 21:17

00:01|开场:多模态本地文件问答系统

介绍要分享“多模态文件”的问答系统,以及如何表示与实现。

00:05|目标:问答系统怎么表示/实现

说明将讲清楚系统结构与关键实现点。

00:13|配置管理:用统一的全局配置文件管理

用“全局文件/配置文件”统一管理所有配置项。

00:24|模型调用基础:API Base + API Key

需要调用大模型的基础信息(Base/Key),从平台官网获取。

00:36|模型定义:编码模型、文本模型、多模态模型

配置里包含不同用途模型:embedding、文本LLM、多模态LLM等。

00:50|检索参数:topK、重排、向量维度等

配置检索与重排序相关参数(top k、embedding维度等)。

01:05|界面配置:保存UI/页面相关设置

有一块是和界面(F界面/页面)相关的配置。

01:12|Memory0 + 存储:记忆库与相关配置

提到 memory0 的配置与“社控设计库”(更像项目内的记忆/存储模块配置集合)。

01:17|历史记录:history DB / historic DB

用于保存变更/历史线路(对话或记忆的历史记录)。

01:25|用户隔离:用 UID 筛查用户数据

用 UID 做用户级过滤/隔离;这里示例只配置了一个用户。

01:34|记忆检索限制:limit/返回前N条

memory 查询返回本地前几条记录(limit)。

01:39|记忆 embedding:记忆编码模型 + 向量维度强相关

强调记忆编码模型与embedding维度必须严格对应。

01:55|RAGConfig:读取配置文件完成系统初始化

RAGConfig 负责读配置并注入系统基础配置与memory配置。

02:16|记忆抽取Prompt:定义“记忆提取”的提示词

用于从对话中抽取“可长期保存”的信息。

02:39|记忆卡片化:Q/A 记录 → 记忆卡片 → 存储

将问答记录转为“记忆卡片”,再落库(memory0)。

02:55|可选本地模型:支持 Ollama 等

LLM也可用本地模型(例如 Ollama),不强依赖远端。

03:00|Embedding & VectorStore:配置embedding与向量库

配置 embedding 模型,以及向量存储(vector store)相关参数。

03:19|代码结构:main + doc 两条运行路径

  • main:无界面的流程(脚本式)

  • doc:RAG页面/交互(命令行或Web页面两种)

03:56|总体流程三步:入库 → 问答 →(结合记忆)

强调先“导入/入库”,再进入问答流程。

04:07|索引构建:建立索引/检索流程入口

建立索引流程;核心函数类似 process_pdf(逐字稿写作 process gt f)。

04:19|增量入库:只对新增/修改PDF重建索引

做“增量级索引构建”,避免每次全量重算。

04:26|目录扫描:遍历指定目录下所有PDF

扫描PDF并检查是否已入库。

04:32|入库判定:需要一套逻辑识别修改/缺失

判断PDF是否修改、是否完整入库等。

04:52|校验核心:计算文件哈希(hash)

用文件hash做基础校验:不在库里→肯定没入库;hash变→视作修改。

05:09|粒度:以“页面”为单位建索引

数据库按页存储/检索(因此还要校验页是否在库里)。

05:45|重建策略:未完整入库或已修改→先删旧记录再重导

对该PDF的旧页面记录全部删除,然后重新入库。

06:06|有效性校验:检查每页向量与元数据是否有效

向量/metadata无效也触发重建,全部通过才算有效。

06:38|清理旧页面:按 pdf path 删除关联页记录

通过当前PDF路径找到所有页记录并删除。

06:58|PDF转图片:页面导出为图片

未入库PDF先按页导出为图片(后续做多模态处理)。

07:07|实现:用 PyMuPDF 等库导出页面图

描述导出方法(get pixmap / extract map / save 等类似接口)。

07:43|批量入库:按页批量写入,页共享同一个文件hash

每一页都带上文件hash,便于一致性与增量判定。

08:03|默认数据库:SQLite(逐字稿提到“FM的数据库”)

数据库存储默认使用轻量本地库(语音转写里像是 SQLite)。

08:10|入库产物1:先生成每页 summary(摘要)

每页先生成摘要,后续检索主要依赖摘要文本。

08:20|入库产物2:图片向量 + 摘要向量一起存库

图片/summary都会向量化并进入数据库。

08:34|图像向量存储方式:metadata形式存

图像embedding以metadata/字段形式存储(便于后续重排/多模态检索)。

08:43|LangChain兼容:实现自定义embedding接口

为兼容 LangChain 数据库接口,需要继承类并重写方法。

09:04|检索策略:summary做召回,向量做重排

主要用摘要文本检索召回,再用向量相似度进行重排。

09:51|图片传输差异:DashScope可直接用,OpenAI需base64

若调用OpenAI多模态接口,需要把图片转base64再传。

10:10|问答启动:构建数据库后进入交互式对话

索引完成→启动交互式循环。

10:18|长期记忆:结合 memory0 做对话长期记忆

初始化“多模态记忆”(把config传入 memory0 组件)。

10:39|改造 memory0:在项目内重写/二次开发

将memory0作为库引入后做了改造以适配项目。

10:53|中文化Prompt:解决中英混合输出问题

把默认英文prompt改成中文prompt,避免中文任务输出中英混杂。

11:30|Provider扩展:适配通义/DashScope等接口

原库不兼容某些provider,需要加provider/重构方法来支持。

12:13|交互循环:输入query → 加载记忆 → 组装对话历史

  1. 用户输入查询

  2. memory search加载对话记忆

  3. 把记忆作为对话历史注入

12:40|查询策略选择:查询重写 / web查询 / 排序策略

构建“策略决定prompt”,由模型决定走哪种策略。

13:31|三种查询路线

  1. 普通检索:意图清晰、实体明确

  2. 查询重写:需求不明确/有指代,结合历史补全与消解

  3. 多步推理:需要先查A再查B的链式任务,回答更完整

14:37|查询重写要求:保持真实意图,避免历史污染

不要盲目引入历史实体、不要曲解用户目的;输出仅重写后的query。

15:29|多步推理框架:Planner / Executor / Summarizer

  • 规划者:拆解步骤并对齐用户意图

  • 执行者:按步骤检索并回传

  • 总结者:汇总全过程,生成完整答案(Markdown输出)

17:02|运行方式:命令行 or 页面(Web UI)

doc RAG 提供两种使用方式。

17:21|演示:索引已生成 → 跳过入库环节

直接进入问答演示。

17:47|示例需求:对PDF文件做RAG问答

输入任务(对PDF进行问答/“拍照RAG”式多模态问答)。

18:12|返回结果:命中页面 + 完整文件路径

输出包含对应页面与文件路径信息(回答更完整)。

18:23|输出结构:含策略/层级标题(h1/h2)等

返回带结构化格式与策略信息。

19:14|追问:返回实验结果相关页面与实验结果

能定位到“实验结果”相关页并输出结果内容。