第三节 大模型搭建本地知识库问答

亮子 | 2026-04-11 09:29:50 | 109 | 0 | 0 | 0

一、基础概念类(标准答案)

1. 什么是本地知识库 / RAG?和直接问大模型有什么区别?

  • 本地知识库:把企业内部文档、PDF、业务数据等向量化后存入向量库,让大模型**只基于本地私有数据回答**,不依赖模型自带知识。
  • RAG(检索增强生成):先从知识库检索相关内容,再交给大模型生成答案,本质是**外挂私有知识**。
  • 区别
  1. 大模型自带知识是通用、过时的,**不能实时更新**;
  2. 直接问会出现**幻觉**,RAG 能保证**来源可追溯**;
  3. 本地知识库**数据不出内网**,满足隐私与合规要求。

2. RAG 的核心流程是什么?

标准六步:
1. 文档加载:读取 PDF/Word/Excel/网页/数据库数据
2. 文本切片:按语义或长度切分成 Chunk
3. 向量化:通过 Embedding 模型转为向量
4. 向量入库:存入向量数据库建立索引
5. 相似度检索:用户问题转向量,召回最相关片段
6. 提示词拼接:把检索内容+问题+历史对话喂给大模型生成答案

3. 为什么要做文档切片?不切会怎样?

  • 大模型有**上下文窗口限制**,超长文本会被截断;
  • 向量检索需要**粒度适中**,太长相关性差,太短信息碎片化;
  • 不切分:
  1. 无法完整输入模型
  2. 检索召回不准
  3. 答案逻辑混乱、容易幻觉

4. 向量数据库是干嘛的?和普通数据库区别?

  • 作用:**存储高维向量,支持高效相似度检索**(余弦、内积、欧氏距离)。
  • 与普通数据库区别:
  1. 普通库做精确匹配,向量库做**模糊语义匹配**;
  2. 支持**百万级高维数据快速检索**;
  3. 自带索引优化(IVF、HNSW),普通库不擅长。

5. 什么是 Embedding?作用是什么?

  • 将文本、图片转为**固定长度高维数值向量**,让机器能理解语义。
  • 作用:
  1. 把文字变成可计算的数字
  2. 实现**语义相似度计算**
  3. 是 RAG 检索的基础

6. RAG 和微调(Fine-tune)区别?怎么选?

  • RAG:外挂知识,**实时更新、成本低、隐私安全、适合结构化文档**。
  • 微调:修改模型权重,**成本高、周期长、不能实时更新、适合风格/逻辑学习**。
  • 选择原则:
  1. 业务文档频繁更新 → RAG
  2. 私有数据不能出外网 → RAG
  3. 要统一回答风格、复杂指令遵循 → 微调+RAG结合

二、架构与选型类(标准答案)

1. 项目整体架构

经典三层:
1. 接入层:前端/接口 → SpringBoot 后端 → Spring AI / LangChain
2. 核心处理层:文档解析 → 切片 → Embedding → 向量检索
3. 存储层:MySQL(元数据)+ PGVector/Milvus(向量)+ MinIO(源文件)

2. 常用技术栈(背这套最稳)

  • 大模型:Qwen、Llama3、ChatGLM(Ollama 本地部署)
  • 向量库:**PGVector**(易用)、Milvus(高性能)、Chroma(轻量)
  • 框架:**Spring AI**(Java 主流)、LangChain4j
  • 文档解析:PDFBox、Tika、OpenPDF
  • 部署:Docker + Docker Compose

3. 为什么选 PGVector?

  • 基于 PostgreSQL,**学习成本低、运维简单**;
  • 支持**结构化+向量混合查询**;
  • 企业接受度高,不用额外维护独立组件;
  • 支持索引优化,满足中小规模场景。

4. 文本切片策略

  • 优先**语义分块**:按段落、标题层级切分;
  • 辅助**固定长度**:512/1024 字符,加**重叠窗口(100~200字符)**;
  • 目的:避免上下文断裂,提升召回准确率。

5. 检索方式

  • 基础:**余弦相似度检索**
  • 进阶:**混合检索**(关键词 BM25 + 向量检索)
  • 重排:使用 Rerank 模型精排,提升准确率

三、关键技术细节(深度必背)

1. 长文档切割上下文丢失怎么解决?

  • 使用**滑动窗口+重叠切片**;
  • 保留**标题、层级结构**;
  • 检索后**多块内容拼接**,补充上下文;
  • 使用**父子分块**:细粒度检索,粗粒度生成。

2. 检索不准确、答非所问怎么办?

  • 优化切片大小与重叠度
  • 改用**混合检索**
  • 加入 Rerank 重排模型
  • 优化 Embedding 模型
  • 对查询做**意图识别与改写**

3. 重复、冲突文档怎么处理?

  • 建立**文档指纹**去重
  • 按更新时间保留最新版本
  • 增加**权重机制**,高优先级覆盖低优先级
  • 冲突内容在提示词中让模型择优回答

4. 增量更新知识库

  • 新增:直接解析切片入库
  • 修改:先删除旧向量,再插入新向量
  • 删除:根据文档 ID 批量删除向量
  • 避免全量重建,提升效率

5. 敏感数据不出内网

  • 大模型本地部署(Ollama)
  • Embedding 本地运行
  • 向量库内网部署
  • 全程不调用第三方 API
  • 数据不落地、不日志打印敏感信息

6. 向量维度怎么选?

  • 通用:**768 / 1024 维**
  • 维度太高:占用存储大、检索慢
  • 维度太低:语义表达不足,召回差
  • 根据 Embedding 模型默认维度选择即可

7. 百万级数据检索优化

  • 使用 HNSW/IVF 索引
  • 分段建索引,按业务维度分片
  • 混合检索减少向量召回数量
  • 使用 Rerank 精排替代粗排

8. 怎么避免幻觉?

  • 严格限制模型**只能使用检索内容**
  • 提示词强制:**不知道就说未找到,不编造**
  • 增加引用溯源,展示来源片段
  • 低置信度答案直接拒绝回答

9. 效果评估指标

  • 召回率、精确率
  • 回答准确率、流畅度
  • 幻觉率
  • 响应耗时
  • 用户满意度

10. 多轮对话实现

  • 保存**历史问答对**
  • 限制历史轮数,防止超长
  • 对历史做**摘要压缩**
  • 结合当前问题做**上下文关联改写**

四、SpringBoot 落地(Java 后端必背)

1. SpringBoot 集成本地大模型

  • 通过 HTTP 调用 Ollama 本地接口
  • 使用 Spring AI 封装 ChatClient
  • 支持同步/流式(SSE)返回

2. Spring AI 实现 Embedding

  • 注入 EmbeddingModel
  • 调用 embed 方法转文本为向量
  • 批量插入 PGVector

3. 流式输出 SSE

  • 使用 Spring MVC 的 SseEmitter
  • 或 Spring AI 内置 Stream 接口
  • 前端 EventSource 接收

4. PDF/Word 解析

  • PDFBox 解析 PDF
  • Tika 解析多格式文档
  • 清洗空格、换行、乱码

5. 并发与稳定性

  • 接口限流
  • 异步处理文档导入
  • 重试机制
  • 全局异常处理

6. Docker 部署

  • 大模型:Ollama 容器
  • 后端:SpringBoot 容器
  • 数据库:PostgreSQL + PGVector
  • 使用 docker-compose 一键启动

五、场景优化题(高分答案)

1. 数据量大检索慢

  • 建 HNSW 索引
  • 混合检索减少召回量
  • 业务维度分片
  • 使用 Rerank 精排

2. 用户问题模糊

  • 意图识别
  • 问题澄清交互
  • 关键词提取
  • 多轮引导补全信息

3. 冲突答案

  • 按时间/权重排序
  • 提示词要求模型综合说明
  • 展示多个来源供用户参考

4. 响应慢

  • 异步构建索引
  • 缓存高频问答
  • 优化向量检索参数
  • 模型量化(GPTQ、GGUF)

六、项目亮点包装(面试加分)

  1. 实现**本地私有化部署**,数据安全合规
  2. 采用**混合检索+重排**,准确率显著提升
  3. 支持**多格式文档自动解析入库**
  4. 支持**增量更新+权限隔离**
  5. 基于 SpringBoot 微服务架构,可横向扩展
  6. 完整日志、监控、异常兜底机制