Yudo · 操作指南

← 返回知识库

1. 🚀 快速上手

Yudo 是一个面向水利工程的 AI 知识库助手,核心能力是多模态文献检索与学术问答。拥有 4 项工具技能,由 LLM 自主判断何时调用。

① 启动服务
python app.py
② 上传文献
PDF / DOCX / TXT
③ 提问对话
自然语言检索

2. 🧠 核心架构

Yudo 采用 三层 Agent 架构:LLM ↔ Host(app.py)↔ MCP Server(mcp_server.py)+ Host 工具

LLM(DeepSeek API)
接收 system prompt + 历史 + 工具列表 · 自主决策是否调用工具 · 通过 Function Calling 协议返回 tool_calls
Host(app.py:AI Agent 编排器)
构建 system prompt(人设+记忆+历史)· 管理 MCP 子进程 · 执行 Host 工具 · 异步流式推送 (SSE)
MCP 工具
search_knowledge_base
子Agent检索管线
read_knowledge_file
list_knowledge_folder
Host 工具
write_note
写入记忆笔记

与普通 RAG 不同,Yudo 没有硬编码分支——所有行为由 LLM 自主决策。当 LLM 返回 tool_calls 时,Host 根据工具名路由到 MCP 或 Host 执行器,结果以 tool role 发回 LLM 进行第二轮生成。

💡 MCP vs Host 工具

MCP 工具(mcp_server.py):需要调用 LLM 子 Agent 或访问向量库的服务端能力。

Host 工具(app.py):直接操作用户状态,无需额外进程。

3. 🔍 多模态 RAG 工作原理

3.1 索引阶段(上传/重建索引时)

上传文件后,系统根据文件类型选择对应解析器,生成文本嵌入向量。PDF 额外支持页面图像多模态嵌入:

PDF 文件
PDF
PyMuPDF 解析
文本
文本提取
get_text()
语义切分
200-1200 字/块
图像
页面渲染
JPEG base64
每页单独处理
最多 30 页
非 PDF 文件
DOCX / TXT / MD
+ 代码文件等
对应解析器提取文本
python-docx / 纯文本 / HTML 剥离等
文献文件
语义切分
200-1200 字/块
代码文件
结构切分
按函数/类边界
Ark 文本嵌入
2048 维向量
PDF 图像走 Ark 图像嵌入
SimpleVectorStore
按 vector_space 分文献/代码空间存储

3.2 检索阶段(用户提问时)

用户问题
① LLM 关键词优化
"曼宁公式适用条件" → "曼宁公式 适用范围 粗糙度"
② HyDE 假想文档
LLM 生成可能的答案段落(可选)
③ Ark 文本嵌入
查询文本 → 2048 维向量
文本块检索
向量 + BM25 混合
cosine 相似度 + BM25 关键词
分数融合
0.6 × vec + 0.4 × bm25
图像块检索
纯向量检索
cosine 相似度(无 BM25)
BM25 不适用
图像块文本是占位符
④ 合并排序
文本结果 + 图像结果统一排序
⑤ 按文件聚合
提取摘要/引言/结论 + 匹配片段
返回结构化结果给 LLM

3.3 向量空间可视化

点击侧边栏的 【向量】 按钮打开 3D 可视化页面,可直观查看向量空间分布:

  • 文本块:按文件着色,使用标准色板(蓝、绿、橙、紫等 10 色循环)
  • 图像块:在文件基色上叠加 #FF6F00 暖橙色(blend 45%),尺寸更大(0.14 vs 0.08),一眼可辨
  • 统计栏:显示 X 个片段(Y 文本 · Z 图片)· N 个文件
  • 文件面板:每文件旁显示 (5文+2图) 明细

PCA 降维将 2048 维向量投影到 3D 空间。同主题的文本/图像块会在空间中聚集,便于理解检索相似性。

💡 为什么分开存储?

文本和图像的向量分数分布不同——文本块可以同时参与 BM25 关键词匹配获得额外加分,而图像块只能靠向量相似度。混在一起用同一个阈值过滤不够精细。分开后可以分别控制权重和阈值,也避免了图像占位符 [第N页图片] 污染 BM25 索引。

4. 🔧 工具清单

4.1 📡 MCP 工具(mcp_server.py 独立进程)

工具名功能参数
search_knowledge_base 语义检索知识库,自动经过子 Agent 优化流程(AI 空间判断 → 关键词优化 → HyDE → 混合检索 → 摘要提取)。支持文献/代码双空间,AI 自动判断检索范围 query:搜索语句
read_knowledge_file 根据文件名读取知识库中的文件全文(截断至 1 万字符) filename:含扩展名的文件名
list_knowledge_folder 浏览知识库目录结构(最多 3 层),含文件大小 path(可选):子路径

4.2 🏠 Host 工具(app.py 内置)

工具名功能参数
write_note 将文本写入 Yudo 的记忆笔记(user_preferences.md text:自由文本

4.3 子 Agent 搜索流程

search_knowledge_base 始终经过子 Agent 处理:

  1. AI 空间判断:LLM 分析问题属于"文献空间"(document)还是"代码空间"(code),决定检索范围
  2. 关键词优化:LLM 分析原始问题,改写为更适合向量检索的语句
  3. HyDE 假想文档(可选):LLM 生成一段可能的答案段落,用于增强向量匹配
  4. 混合检索:向量检索 + BM25 关键词检索,分数融合。仅在指定空间中搜索
  5. 跨空间 fallback:若当前空间无结果,自动尝试另一空间
  6. 摘要提取:逐篇提取摘要/引言/结论/匹配片段
  7. 结构化输出:返回带相关度评分的文献摘要给主 Agent
💡 文献 vs 代码空间

PDF、Word、TXT 等学术资料归入 文献空间(document);Python、JavaScript、C++ 等编程代码归入 代码空间(code)。检索时 AI 自动判断问题类型,只搜索相关空间,提升检索精度。

5. 🖥️ 界面说明

5.1 主界面布局

左侧栏
对话 · 文件 · 向量 · 设置
主聊天区
消息气泡 · 工具调用展示 · 流式输出
输入框
回车发送 · Shift+Enter 换行

5.2 工具调用气泡

Yudo 调用工具时,气泡内实时显示当前活动(带旋转动画),如:

  • 🔍 正在搜索知识库 · 关键词
  • 📖 正在读取文件 · xxx.pdf
  • 📂 正在浏览目录

LLM 开始输出文本后,状态标记为"完成"。最终回复下方保留可折叠的调用历史。

5.3 设置面板(⚙)

设置项说明默认值
主题配色5 种主题切换(学术蓝/深海藏蓝/青屿松石/晴空浅蓝/竹影青雾)默认 (学术蓝)
LLM 模型DeepSeek 模型名称(支持运行时修改,MCP 子进程自动同步)deepseek-v4-flash
携带上下文条数每轮携带的历史消息数20
检索上限 (TOP_K)每次检索返回的片段数5
相似度阈值低于此分数的片段被过滤(滑块调整,主题色填充)0.30
💡 设置自动保存

点击"保存"按钮后,配置持久化到 search_config.json。MCP Server 通过 _get_runtime_model() 读取同一文件,自动同步模型名变更。

5.4 📄 对话导出

聊天头部新增 📄 按钮,点击可将当前会话的全部对话记录导出为 Markdown 文件,便于保存和分享问答结果。

5.5 📚 向量空间可视化

在聊天头部点击 坐标轴图标 打开向量可视化页面:

  • 左右双 3D 场景:左侧显示文献空间点云,右侧显示代码空间点云,各自独立 PCA 降维
  • 双侧文件面板:左侧文献列表、右侧代码列表,可分别隐藏/展开
  • 颜色标识:每个文件分配独立颜色,图片块叠加暖橙色区分

5.6 📖 阅读器支持

  • 语法高亮:代码文件(.py/.js/.ts/.java/.cpp/.css 等)使用 highlight.js 自动着色
  • 主题联动:阅读器自动继承主页的主题配色设置(深海藏蓝/青屿松石等)
  • 公式渲染:KaTeX 渲染 LaTeX 数学公式
  • PDF 阅读:内嵌 PDF.js 渲染器,支持缩放/翻页

6. 🧩 记忆与角色系统

所有配置统一存放在 role_and_memory/ 文件夹:

文件内容管理者
yudo_persona.mdAI Agent 人设、技能、行为准则可手动编辑
context.json对话历史(最近 200 条)系统自动管理
user_preferences.md记忆笔记(带时间戳的自由文本)Yudo 通过 write_note 写入

6.1 System Prompt 构成

① 角色设定
yudo_persona.md
+
② 记忆笔记
user_preferences.md
+
③ 历史上下文
最近 N 条对话
+
④ 当前任务
用户提问
=
System Prompt
💡 修改 Agent 人设

编辑 role_and_memory/yudo_persona.md,重启后生效。

7. 📤 文件管理

7.1 支持格式

类别格式
文档PDF DOCX DOC
文本TXT MD
Python代码PY
JavaScript代码JS
TypeScript代码TS
Java代码JAVA
C/C++代码CPP C H
HTML文件HTML HTM
CSS文件CSS
数据JSON XML CSV XLSX
演示PPT PPTX

7.2 分块策略

不同类型文件采用不同的分块策略:

  • 文献文件(PDF/DOCX/TXT/MD):语义分块,按章节标题和段落边界切分,200-1200 字符/块,带句子重叠
  • 代码文件(PY/JS/TS/JAVA/CPP/C/CSS/HTML):结构分块,按函数/类/方法边界切分,优先保持函数完整性

7.3 重建索引

上传新文件后,系统自动建立索引。如需重建全部索引,在设置面板点击"重建索引":

点击重建索引
清空向量库
重新解析所有文件
异步执行,不阻塞服务
完成
⚠️ 注意

50 篇 PDF 含多模态嵌入可能需要数分钟。重建过程在后台异步执行,不影响其他操作。

8. ⚙ 配置说明

8.1 核心配置(config.py)

配置项说明默认值
DEEPSEEK_API_KEYDeepSeek API 密钥硬编码(生产环境用环境变量覆盖)
DEEPSEEK_MODEL默认 LLM 模型名deepseek-v4-flash
ARK_API_KEY火山引擎 Ark API 密钥硬编码
ARK_EMBEDDING_MODEL多模态嵌入模型doubao-embedding-vision-251215
ARK_EMBEDDING_DIM嵌入向量维度2048
MAX_PAGE_IMAGES_PER_DOC每个 PDF 最多嵌入页数30
ENABLE_HYDE是否启用 HyDE 假想文档True
HYBRID_VECTOR_WEIGHT向量检索权重0.6
HYBRID_BM25_WEIGHTBM25 检索权重0.4

8.2 运行时配置(search_config.json)

通过设置面板修改,持久化到 search_config.json

字段说明默认值
model运行时 LLM 模型名(MCP Server 自动同步)deepseek-v4-flash
top_k检索返回片段数5
similarity_threshold相似度阈值0.3
context_count携带上下文条数20

8.3 权限说明

操作权限要求
对话 / 搜索 / 上传文件登录用户
修改设置 / 重建索引登录用户
开发者统计白名单账号

9. ❓ 常见问题

Yudo 和普通 RAG 问答有什么区别?

Yudo 是 Agent,不是 pipeline。普通 RAG 是固定流程:搜索→拼接→回答。Yudo 自主判断要不要搜索、用什么词搜索、搜完是否需要读全文、是否需要记录信息。没有硬编码分支。

多模态检索是什么意思?Yudo 能看图吗?

Yudo 的嵌入模型(Ark doubao-embedding-vision)能同时处理文本和图片,将它们编码到同一个向量空间。上传 PDF 时,每一页会被渲染成图片并生成嵌入向量。检索时,用户的文字查询会同时与文本块和图片块做相似度匹配。但 Yudo 的 LLM(DeepSeek)是纯文本模型,不会"看图"——它只知道"第 N 页有一张匹配的图片"。

子 Agent 什么时候触发?

每次调用 search_knowledge_base 都走子 Agent 流程。子 Agent 优化关键词 → HyDE 生成假想文档 → 混合检索 → 提取摘要 → 返回结构化结果,即使只匹配到 1 篇也走完整流程以保证质量。

修改了模型名为什么搜索还能用?

设置面板保存模型名后,写入 search_config.json。MCP Server 通过 _get_runtime_model() 读取该文件,子 Agent 的关键词优化和 HyDE 调用会自动使用新模型名。

Yudo 会联网搜索吗?

不会。Yudo 基于 DeepSeek 内置知识 + 本地知识库文件回答。

如何备份?

运行 backup.sh 脚本自动备份知识库文件、向量索引、配置和记忆数据到 backup 目录。

文献空间和代码空间有什么区别?

上传文件时,系统根据扩展名自动归类:PDF/DOCX/TXT/MD 等归入文献空间,PY/JS/TS/JAVA 等代码文件归入代码空间。检索时 AI 判断问题类型,只搜索相关空间,避免文献结果干扰代码查找。如果一个空间无结果,系统会自动尝试另一个空间。

代码文件怎么分块?和文献一样吗?

不一样。文献文件按章节和段落边界做语义分块(200-1200 字符)。代码文件则按函数、类、方法边界做结构分块,每个函数/类独立成块,保证代码逻辑完整性。支持 Python、JavaScript、TypeScript、Java、C/C++、HTML、CSS 七种语言。