完整复盘掌柜智库项目的 RAG 核心流程:准备阶段 7 个节点与检索阶段 7 个节点,汇总 LangGraph、Milvus、MCP、reranker 等核心技术点,并记录 tester/runner 打桩面试点与后续安排。

本篇要点

  • 为什么用 RAG,以及 RAG 的基本准备 / 检索流程
  • 项目准备阶段 7 个节点、检索阶段 7 个节点的作用与意义
  • 项目核心技术点清单:技术点 + 关键用法
  • 项目相关面试(tester / runner 的 patch 打桩)、AI 生成页面的基本流程与后续安排

项目总览

项目阶段 ≈ Python 基础阶段,不用过多去理解,更多的去写、去敲——键盘敲烂,月薪过 3 万。

整篇总结分为五块:项目核心流程(RAG 扩展 + 准备 7 节点 + 检索 7 节点)、项目核心技术点清单、项目相关面试、使用 AI 生成页面的基本流程、后续安排。

1、项目核心流程

1.1 RAG 流程的扩展

1.1.1 为什么使用 RAG

现在的模型上下文窗口已经巨大了,为什么还要用 RAG?

  1. 模型窗口大小:每次真的使用都会消耗 token,内容过多反而不准确了。
  2. 模型某些方面有知识欠缺:不会的也会答,也就是幻觉。

1.1.2 RAG 的基本流程

1
2
3
4
5
6
7
准备  各种数据文件 -> text -> 嵌入式模型 -> 向量 ->
|
向量数据库
|
检索 用户 -> 提问 -> 嵌入式模型 -> 向量 - 相似度 --
| |
结果 - lm - 提示词 - 问题+上下文 - chunk -|

1.2 项目准备阶段(7 个节点)

1.2.1 节点 1:node_entry

  • 核心作用:导入文件类型的识别判断,跳转到对应合适的解析节点(依赖 state)。
  • 意义:后续扩展文件类型时,需要扩展此节点的语法判断。

1.2.2 节点 2:node_pdf_to_md

  • 核心作用:将 PDF 类型的数据转成 md 数据。表面的含义是——把非结构化的数据,转成结构化的文本。
  • 意义:ppt / word / excel / json / 图片…… 扩展多了之后,统一转成结构化的文本(md / json)。

1.2.3 节点 3:node_md_img

  • 核心作用:处理图片,识别图片的含义,进行图片地址的上传(http)。
  • 意义:图片内容的识别。

**面试题:**你的 RAG 是做图文混合检索的么?
是——图片 -> [文本] -> 模型;图片 - http - 用户可视化显示……

  • 意义:图片 / 表格(数据)-> 单独处理 -> 数据库存储 -> 问题 -> llm -> sql -> 数据库表格数据查询,也就是自然语言处理数据库的数据检索(问数)。

1.2.4 节点 4:node_document_split

  • 核心作用:将 document 切成合理的 chunk。
  • 意义:避免过多的内容给到模型,干扰模型的回答。
  • 意义:目标是最合适的 chunk 送给最合适的问题。
  • 原则:
  1. 语义优先。# 标题、法律条件、财报、对话。
  2. 确保大小合适。500 - 1200,需要考虑嵌入式模型、重排序模型大小、文件类型。
  3. 边界清晰,保持合理的 overlap。
  4. 保留可追溯的元数据:item_name、title 等。

项目切割参数:400 / 600 / 1000。

1.2.5 节点 5:node_item_name_recognition

  • 核心作用:主体识别,小范围确认搜索对应的文档。
  • 意义:锁定范围,item_name / file_title / 时间。

1.2.6 节点 6:chunks 的向量化

对切好的 chunks 做向量化处理。

1.2.7 节点 7:chunks 的向量存储

将向量结果写入向量库,供检索阶段使用。

1.3 项目检索阶段(7 个节点)

1.3.1 节点 1:node_item_name_confirm

  • 核心作用:item_name 意图识别和问题重写。
  • 意义(问题重写):用户的问题往往口语化、非专业化、带代词,直接进行向量查询会结果不存在;因此要做问题重写标准化,明确的主体、标准的提问,避免过多的口语。
  • 意义(item_name):缩小范围。通过 llm - milvus 做置信度识别,阈值 0.7 / 0.6。
  • 阈值说明:0.7?满分 1 -> 满分 0.2……

1.3.2 节点 2:召回 1 —— 问题向量检索

  • 缺点:问题的语义单一,检索命中降低(召回率低)。

1.3.3 节点 3:召回 2 —— 问题假设性答案检索

  • 优点:丰富检索语义,提高命中率和召回率。
  • 缺点:文档类型极其隐私,因此通过降低权重减少影响。

1.3.4 节点 4:召回 3 —— MCP 网络检索

  • 优点:弥补单一向量库的内容缺失,是对文档内容的一种补充。

1.3.5 节点 5:node_rrf

自己融合,同源,融合召回 1 与召回 2;有参照、排名 + 权重。

1.3.6 节点 6:node_reranker

  1. 凑齐 [[问题, 答案]] -> 过长需要压缩,512 - 4。
  2. 打分。
  3. 动态 topk。

1.3.7 节点 7:node_answer

  1. 之前 answer。
  2. 本次模型 answer。
  3. 正则提取 image_urls。

2、项目核心技术点

2.1 RAG 思想

RAG 的整体思想:准备阶段的向量化 + 存储,检索阶段的多路召回 + 融合 + 重排 + 生成。

2.2 LangGraph

state 定义、图定义、图测试、图执行、state 并发问题。

2.3 LangChain

模型加载 init_chat_model、提示词 Message、Chains、执行模型、解析器……

**遗憾:**没有智能体,也没有递归切割器。

2.4 MinerU

申请 / 上传 / 解析 / 下载。

2.5 HTTP 协议

HTTP 协议请求和响应报文、请求方式、响应状态码。

2.6 requests

传递参数 requests.get / post(url、headers、json、param、data、timeout)。

1
2
3
4
5
6
7
8
9
# 响应对象常用属性 / 方法
response.status_code
response.json()
response.text
response.content

# 会话与代理环境
session = requests.Session()
session.trust_env = False

2.7 Path / shutil

1
2
3
4
5
Path 属性: name  stem  suffix  parent  parents
Path 函数: is_file is_dir exists mk_dir rglob("*.x") glob("*.x")
read_xx write_x

shutil: rmtree unpack_archive make_archive

2.8 MinIO

minio 安装、minio api。MinioClient(url, 账号, 密码, 是否 https);创建桶、设置权限、查询文件(prefix=,/ 不能 [:1])、删除文件、上传文件、拼接文件访问地址。

2.9 视觉模型

关键在于传递数据格式问题。

1
2
3
4
5
6
7
8
9
10
11
12
base64.b64encode(图片字节数据).decode("utf-8")

{
"type": "image_url",
# 需要注意,传入 Base64,图像格式(即 image/{format})需要与支持的图片列表中的 Content Type 保持一致。
# "f" 是字符串格式化的方法。
# PNG 图像: f"data:image/png;base64,{base64_image}"
# JPEG 图像: f"data:image/jpeg;base64,{base64_image}"
# WEBP 图像: f"data:image/webp;base64,{base64_image}"
"image_url": {"url": f"data:image/png;base64,{base64_image}"},
},
{"type": "text", "text": "图中描绘的是什么景象?"},

2.10 正则使用

match、search、findall、finditer、sub(..)。

2.11 guess_type

1
guess_type(name)[0]

2.12 Milvus

  • 创建集合:schema、field(数据类型)、index(多图 HNSW、全部检索 FLAT、分桶检索 IVF_F...),创建集合 / has 查看集合。
  • 插入数据 insert(data = [])。
  • 删除数据 delete(filter="")。
  • 混合检索。

2.13 bge-m3

加载方式:官方 | milvus;上下文 8192;识别 130 种语言;批量向量化。

2.14 MongoDB

非关系型数据,可以存储关系数据(BSON),存储运行内存。

安装之后常用命令:

1
2
3
4
5
6
使用 use 库
使用 db.表名
crud: .find() .insertOne .insertMany .updateOne .deleteOne ... ({ , $or:[{},{}] })
索引: createIndexs({k:1, k:-1})
单列索引 -> 有筛选条件
复合索引 -> 有筛选条件 + sort 排序

另外还涉及 pymongo 的使用……

2.15 MCP

  • 对 MCP 的理解:tool / resources / prompt 共享的协议,提升 agent 智能体的能力。
  • 类似:skill -> 提示词 + 代码。
  • MCP 协议:stdio、sse、streamable http。
  • 使用方式(适配器方式):
    • langchain -> create_agent(tools)
    • openai -> open Agent | 直接在图中调用 connect()、call_tool()、cleanup()

2.16 RRF

融合算法 -> 同源、有参照物 -> rrf + 排名 + 权重。

2.17 reranker

打分 + 动态 topk。

2.18 FastAPI

路径设计、接收参数、响应数据、异步调用。

2.19 SSE

后端的流式 + 前端技术 EventSource。

3、项目相关面试(非重点)

说明:测试性能时,有些位置指定了方法有固定的返回值,你的方法名一定要对应上即可。

3.1 tester 第 188 行

item_name 识别固定了:

1
with patch("app.rag.import_.item_name_service.recognize_item_name_by_chunks [你的方法]", return_value=TEST_ITEM_NAME):

假设性提问:问题 -> 假设性答案。

3.2 runner 第 261 行

1
2
3
4
with patch(
"app.rag.query.hyde_search_service.call_llm_answer",
return_value="HAK 180 局部烫印通过设置 50mm 起点和 170mm 终点实现区域控制。",
):

4、使用 AI 生成页面的基本流程

  1. 明确需求和功能。
  2. 设计接口(api):url、method、参数、响应。
  3. 接口和需求文档设计页面的原型图。
  4. 原型图、接口文档、需求文档设计项目页面(明确添加对应接口的交互流程)。
  5. 样式调整即可。

举个例子:进销存系统 = 进货 + 销售,就好比你家有个大超市——胖东来。

5、后续安排

  1. 今晚思考项目优化的点(参考发的内容)。
  2. 项目没写完 -> 写项目。
  3. 项目一遍写完 -> 设计需求。