主题
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 流程中从「粗筛」到「精筛」的关键环节
为什么需要重排序:
- 弥补向量检索的天然精度缺陷:向量检索(粗召回)采用双编码器(Bi-Encoder)架构,查询和文档没有深层语义交互,只能捕捉粗粒度的主题相似性,很容易召回大量 “主题沾边但实际不相关” 的噪声文档;而重排序通常采用交叉编码器(Cross-Encoder)架构,排序精度远高于向量相似度
- 过滤检索噪声,避免上下文污染:粗召回阶段为了保证 “不遗漏”,优先保障召回率,但牺牲了准确率,结果中可能混入大量低相关、甚至无关的文档;重排序通过精准打分筛选出 Top-N 高相关文档,最大限度过滤噪声,保证送入大模型的上下文都是高质量的有效信息
4. Reranker 精排的流程是什么
- 输入准备:接收用户查询 Query,以及粗排阶段召回的候选文档集合(通常几十至上百篇)。
- 预处理:对候选文档做长度截断、格式清洗,使其符合 Reranker 模型的输入长度限制。
- 相关性打分:将 Query 分别与每一篇候选文档拼接为
[CLS] Query [SEP] 文档内容 [SEP]的格式,输入 Cross-Encoder 类的重排序模型,模型输出 0~1 之间的相关性得分。- 排序筛选:按照相关性得分从高到低对所有候选文档排序,选取 Top-N(通常 3~10 篇)得分最高的高质量文档。
- 输出交付:将筛选后的文档作为上下文,送入后续的提示词拼接与大模型生成环节。
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特点:高召回低延迟,内存开销高
5. 为什么Bi-Encoder适合粗排,而Cross-Encoder适合精排
核心差异:查询与文档的交互方式
- Bi-Encoder(双编码器):查询和文档分别通过独立(或共享权重)的编码器生成向量,相似度通过向量空间距离计算。
- Cross-Encoder(交叉编码器):将查询与文档拼接后共同输入编码器,通过注意力机制做深层语义交互,直接输出相似度得分。
Bi-Encoder 适合粗排的原因:
- 计算效率极高
- 吞吐量大、算力成本低,支持全量文档批量向量化
Cross-Encoder 适合精排的原因:
- 排序精度更高
6. 什么是Embedding?它在RAG系统中有什么作用
Embedding:一种将文本、图像等非结构化数据转换为低维稠密数值向量的技术。在向量空间中,语义越相近的内容,对应的向量距离(如余弦距离)越近,从而将语义相似度转化为可计算的数值距离
在线链路:把用户提问转换成同维度的查询向量,通过向量相似度计算,从海量文档中快速召回语义相关的文本片段,支撑混合检索的语义匹配效果,为后续重排序、大模型生成答案提供相关素材
离线链路:把切分后的文本片段转换成固定维度的数值向量,将自然语言的语义信息编码为可计算、可存储的向量数据,存入 Milvus 构建语义索引,让文档具备可被语义检索的能力
