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 → 加载记忆 → 组装对话历史
用户输入查询
memory search加载对话记忆
把记忆作为对话历史注入
12:40|查询策略选择:查询重写 / web查询 / 排序策略
构建“策略决定prompt”,由模型决定走哪种策略。
13:31|三种查询路线
普通检索:意图清晰、实体明确
查询重写:需求不明确/有指代,结合历史补全与消解
多步推理:需要先查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|追问:返回实验结果相关页面与实验结果
能定位到“实验结果”相关页并输出结果内容。