Skip to content

KnowForgeRag

Group 1

1. @lru_cache(maxsize) 的作用及 maxsize 参数含义

@lru_cache(maxsize) 是 Python 的缓存装饰器

作用:缓存函数的调用结果,当使用相同参数再次调用函数时,直接返回缓存的结果,无需重复执行函数逻辑

maxsize 参数:指定缓存的最大条目数(即最多缓存多少组不同参数的返回结果)。当缓存条目达到上限时,会自动淘汰最久未被使用的缓存结果;若设置为 None,则缓存无上限,禁用 LRU (Least Recently Used,最近最少使用)淘汰逻辑。该参数默认值为 128

2. 什么是 RAG?解决大模型哪些痛点

定义:RAG 全称 Retrieval-Augmented Generation(检索增强生成),在大模型生成回答前,先根据用户查询从外部知识库中检索相关的文档片段,再将检索到的信息作为上下文注入提示词,辅助大模型生成基于真实信息的回答

解决的大模型痛点:

  • 知识时效性差
  • 幻觉问题
  • 私有 / 领域知识缺失
  • 落地成本高:针对新场景重新训练 / 微调大模型成本极高
  • 数据安全风险

3. 重排序在哪一步后面,以及为什么要重排序

执行位置:重排序(Rerank)位于 向量检索(粗召回)步骤之后,「上下文拼接 + 大模型生成」步骤之前,是 RAG 流程中从「粗筛」到「精筛」的关键环节

为什么需要重排序:

  1. 弥补向量检索的天然精度缺陷:向量检索(粗召回)采用双编码器(Bi-Encoder)架构,查询和文档没有深层语义交互,只能捕捉粗粒度的主题相似性,很容易召回大量 “主题沾边但实际不相关” 的噪声文档;而重排序通常采用交叉编码器(Cross-Encoder)架构,排序精度远高于向量相似度
  2. 过滤检索噪声,避免上下文污染:粗召回阶段为了保证 “不遗漏”,优先保障召回率,但牺牲了准确率,结果中可能混入大量低相关、甚至无关的文档;重排序通过精准打分筛选出 Top-N 高相关文档,最大限度过滤噪声,保证送入大模型的上下文都是高质量的有效信息

4. Reranker 精排的流程是什么

  1. 输入准备:接收用户查询 Query,以及粗排阶段召回的候选文档集合(通常几十至上百篇)。
  2. 预处理:对候选文档做长度截断、格式清洗,使其符合 Reranker 模型的输入长度限制。
  3. 相关性打分:将 Query 分别与每一篇候选文档拼接为 [CLS] Query [SEP] 文档内容 [SEP] 的格式,输入 Cross-Encoder 类的重排序模型,模型输出 0~1 之间的相关性得分。
  4. 排序筛选:按照相关性得分从高到低对所有候选文档排序,选取 Top-N(通常 3~10 篇)得分最高的高质量文档。
  5. 输出交付:将筛选后的文档作为上下文,送入后续的提示词拼接与大模型生成环节。

5. 批归一化和层归一化的区别与相同点,及各自的应用模型

相同点:

二者都是神经网络的归一化技术,核心目标一致:

  • 将输入分布调整为均值 0、方差 1 的标准分布,再通过可学习的缩放、平移参数恢复模型表达能力;
  • 稳定训练过程,加速模型收敛,缓解梯度消失 / 爆炸问题,提升模型训练的稳定性。

核心区别:

对比维度批归一化(Batch Normalization, BN)层归一化(Layer Normalization, LN)
归一化维度同一批次内所有样本,在同一个特征维度上计算均值、方差并归一化单个样本自身的所有特征计算均值、方差并归一化
Batch 依赖高度依赖 batch size,batch 过小时统计量估计偏差大,效果显著下降不依赖 batch 大小,单样本即可计算,小 batch 下表现稳定
训练 & 推理差异训练用当前 batch 统计量,推理用训练阶段累计的移动平均统计量训练与推理逻辑完全一致,无需累计全局统计量
适配场景适合固定维度、batch 较大的场景适合变长序列、小 batch 的场景
应用模型卷积神经网络(CNN)Transformer 架构的标准组件

6. LangChain 三类消息对应 OpenAI 接口的角色

SystemMessage <-> system:设置模型的全局人设、规则、边界条件等系统级提示

HumanMessage <-> user:代表用户输入的提问、指令等人类侧消息

AIMessage <-> assistant:代表 AI 模型生成的回复内容

Group 2

1. Pydantic核心作用是什么,附加额外信息,约束时用什么

核心作用:

  • 数据校验:在运行时对输入数据的类型、格式、取值范围进行严格校验,保障数据合法性
  • 类型转换:自动将符合规则的输入强制转换为声明的目标类型(如字符串转整数、字典转模型对象)
  • 结构化数据建模:以类的方式定义数据 Schema,自带序列化 / 反序列化能力,让数据在模块间传递更规范

附加额外信息、约束主要通过 Field() 字段函数实现:可以为字段设置默认值、描述文本、数值边界(gt/lt/ge/le)、字符串长度、正则匹配、字段别名等约束与元信息

2. LangChain 解析器(parser)的作用与举例

作用:输出解析器(Output Parser)用于将大模型生成的非结构化自然语言文本,转换为可被程序直接调用的结构化数据(如 JSON、字典、列表、Pydantic 对象等)

常见解析器:

  • StrOutputParser:默认解析器。将 LLM 的输出直接解析为字符串。
  • CommaSeparatedListParser:将 LLM 输出的内容用逗号分隔的文本解析为列表。
  • JsonOutputParser:极其常用。将 LLM 输出的JSON 字符串解析为Python 字典
  • PydanticOutputParser:极其常用。将 LLM 输出解析为预先定义的** Pydantic 对象**,提供类型安全和数据验证。

3. 说明LangChain有哪五类提示词模板,日常开发有哪些主流组合方式

五类模板:

PromptTemplate — 最简单:单变量文本模板 FewShotPromptTemplate — 带示例:给模型提供输入→输出范例 ChatPromptTemplate — 对话模板:简化的多角色消息构建 System + Human 组合 — 双角色:系统指令 + 用户模板 MessagesPlaceholder — 动态历史:不固定数量的对话历史插入

4. 请结合KnowForge的项目需求,说明选择Milvus作为向量数据库的理由,以及索引类型选择HNSW的理由

向量数据库选择Milvus:

  • Milvus特点:面向大规模向量检索,支持 collection/schema/index/load、metadata filter、Docker Compose 生态和 Dense + Sparse 混合检索
  • 混合检索:Milvus 2.5+ 支持 BM25 Function,项目可以把 Dense 语义召回和 Sparse 关键词召回放到同一检索后端。
  • 多集合隔离:每个场景可以配置独立 FAQ collection 和文档 collection
  • 元数据过滤:通过元数据来控制检索范围
  • Docker 部署和后续治理能力

索引类型选择HNSW:

  • HNSW特点:高召回低延迟,内存开销高
  • PixPin_2026-08-29_20-53-41

5. 为什么Bi-Encoder适合粗排,而Cross-Encoder适合精排

核心差异:查询与文档的交互方式

  • Bi-Encoder(双编码器):查询和文档分别通过独立(或共享权重)的编码器生成向量,相似度通过向量空间距离计算。
  • Cross-Encoder(交叉编码器):将查询与文档拼接后共同输入编码器,通过注意力机制做深层语义交互,直接输出相似度得分。

Bi-Encoder 适合粗排的原因:

  1. 计算效率极高
  2. 吞吐量大、算力成本低,支持全量文档批量向量化

Cross-Encoder 适合精排的原因:

  1. 排序精度更高

6. 什么是Embedding?它在RAG系统中有什么作用

Embedding:一种将文本、图像等非结构化数据转换为低维稠密数值向量的技术。在向量空间中,语义越相近的内容,对应的向量距离(如余弦距离)越近,从而将语义相似度转化为可计算的数值距离

在线链路:把用户提问转换成同维度的查询向量,通过向量相似度计算,从海量文档中快速召回语义相关的文本片段,支撑混合检索的语义匹配效果,为后续重排序、大模型生成答案提供相关素材

离线链路:把切分后的文本片段转换成固定维度的数值向量,将自然语言的语义信息编码为可计算、可存储的向量数据,存入 Milvus 构建语义索引,让文档具备可被语义检索的能力