AI知识库
知识库是辅助AI模型理解和回答问题的结构化信息集合,主要功能包括补充模型知识盲区、实现检索增强生成(RAG)、提升回答相关性和存储私有知识。其工作流程分为检索和生成两个阶段:先通过向量化技术从知识库中查找相关内容,再将检索结果与问题一起输入模型生成回答。知识库包含原始数据、分片文本、向量化表示、向量存储和索引系统。文档解析时需合理拆分文本片段(chunk),平衡大小和语义完整性,过大或过小的chu
简介
知识库是什么
知识库是用来辅助大模型理解和回答问题的一种结构化或半结构化信息集合。
简单来说,它是让 AI **“更懂你”**的工具,主要做以下几件事:
-
补充大模型的知识盲区
大模型不是实时联网的,它的知识有“截止日期”。知识库可以存放最新的公司文档、产品说明、技术资料等,AI 在回答时可以参考这些内容。 -
做检索增强生成(RAG)
AI 在回答问题前,先从知识库里“查资料”,再用查到的内容来生成回答,提高准确性和可信度。 -
提高上下文相关性
比如企业的 AI 助手可以基于公司自己的知识库,准确回答公司内部的问题,而不是泛泛而谈。 -
作为私有领域知识的载体
可以存储用户自己的笔记、项目经验、会议记录等内容,让 AI 成为“你专属的智能助理”。
知识库是如何工作的
RAG 是一种将大语言模型(LLM)和外部知识结合的方法。其核心思想是:
模型先“查资料”(检索),再“回答问题”(生成)。
整体流程分为两个阶段:
- 检索阶段(Retrieval)
- 用户提出问题后,系统不会直接喂给大模型,而是先去知识库中检索相关内容。
- 知识库通常是一个 向量数据库,里面存的是知识文本经过嵌入(embedding)后的向量。由于向量数据库的稀疏性,知识库通常还包含倒排索引技术,用于做混合检索来提升召回效果。
- 检索方式:将问题做 embedding(同时做分词),找出与其最相似的内容(比如前 N 条)(进行互惠排名)。
- 生成阶段(Generation)
- 把“检索到的内容”+“用户问题”一并输入给大模型。
- 大模型基于这些上下文内容生成更准确、有依据的回答。
知识落库流程
文档解析流程
知识库包含什么
| 组成 | 内容 | 示例 |
|---|---|---|
| 原始数据 | 文档、网页、PDF、数据库等 | 产品手册、FAQ、公司 Wiki |
| 分片(Chunk) | 将文档分段,便于处理 | 每段 200~500 字 |
| 向量化(Embedding) | 将文本转换为向量,支持语义相似度计算 | 使用模型如 OpenAI、BGE、MiniLM 等 |
| 向量存储 | 存储和检索嵌入向量 | 向量库如 FAISS、Weaviate、Milvus 等 |
| 倒排索引 | 基于关键词匹配的全文搜索能力 | 使用 Elasticsearch 等,适合精确匹配、关键词搜索 |
| 混合检索 | 同时使用倒排索引和向量检索,提升召回效果 | 先用 ES 召回,再用向量排序;或两者融合打分,提升相关性和覆盖率 |
文档解析
chunk拆分
chunk拆分目标:在保证检索效率的同时,最大化地保留语义完整性和上下文连贯性。
可以参考以下准则进行chunk拆分:
- 切分粒度(Size)
- 理想 Token 范围:大多数应用建议每个 chunk 控制在 200–700 token(大约 150–500 字)之间。
- 动态最大值:如果遇到超长段落(如超过 1,000 token),可二次拆分;若遇到天然短条目(如列表项),可适当缩到 100–200 token。
- 语义边界优先(Semantic Boundaries)
- 标题/小节分割:优先按照文档层级结构(H1/H2/H3、目录、条目号)做第一轮粗粒度切分。
- 段落/句子分割:在大块内部,以换行、句号、分号等自然语言标记做安全拆点,避免在一句话中或同一逻辑段里硬切。
- 主题边界检测:对于长文本,可利用 TextTiling、TopicTiling、BERT-based segmentation 等算法自动发现话题转折点。
- 重叠窗口(Overlap / Sliding Window)
- 重叠比例:在相邻 chunk 之间保留 10%–20% token 重叠(例如每 500 token 切一次,重叠 50–100 token)。
- 作用:保证前后 chunk 在接近边界时有足够上下文,提升跨 chunk 检索的连贯性。
- 元数据与标签(Metadata)
- 结构信息:每个 chunk 带上所属文档 ID、章节标题、父节点层级、规则/条目编号等。
- 业务标签:如“合规/风控/示例说明”之类的类型标签,方便在检索时做过滤或聚合。
- 多模态与附件(Multi-modal / Assets)
- 纯文本优先:chunk 的主字段尽量只保留自然语言,用于向量化或倒排索引。
- 资源引用:图片、表格、公式等以 metadata(链接、描述、位置)方式单独存储,不干扰文本检索。
- 重组机制:检索后通过 metadata 或原始 Markdown/HTML 还原完整表现。
- 索引与检索优化
- 多字段(Multi-field):为同一文本建立“清洁版”(去除占位符/URL)和“原始版”两个索引域,检索用前者,展示用后者。
- 分级检索:先按粗粒度(section/chunk)召回,再在 top-k chunk 内做更细粒度重排序或再分片,兼顾速度与命中。
- 评估与迭代(Evaluation & Tuning)
- 人工打标:设计一批典型问题和预期答案,验证 chunk 分割后检索召回率和回答质量。
- A/B 测试:尝试不同 chunk 大小、重叠比例、分割策略,监测延迟、召回准确度、下游任务效果。
- 自动监控:统计“命中 chunk 长度分布”、“边界召回失败样例”,定期调整策略。
chunk太大的缺点:
- 语义丢失:如果你用的bge-m3模型,它支持的上下文是8192个token,向量维度是1024。chunk大于8192个token的部分语义会丢失。
- 检索性能下降:在 BM25/倒排索引场景下,chunk 越长包含的 term 越多、倒排列表越长,排分(scoring)时就要遍历更多 posting,响应变慢。
- 召回的粒度粗糙,噪声增多
-
- 大 chunk 往往包含多条语义甚至不同主题,召回时由于匹配到 chunk 整体,就很难精准定位用户真正关心的那段内容,回答或生成时需要再做“chunk 内精排”或二次分片,反而更拖延。
-
- 大 chunk 中的无关内容也会干扰模型理解,降低 downstream 任务(问答、摘要)的准确度。
chunk太小的缺点
- 上下文缺失:有些文本的上下文被拆段后,往往是致命的(例如,一个规则的规则明细不能被拆分)。
- 检索性能下降:小chunk导致chunk总量变多,向量相似度计算需要耗费更多时间。
- 存储成本变大:向量的维度是由你的向量模型决定的,chunk太小道中总向量变多,占用空间变大。
图片入库
将多模态文档转换成markdown之后,直接拆分chunk会有以下问题:
- 语义缺失:图片表述的语义没有落库。
- 相似度被稀释:URL 通常很长且包含大量无意义的字符,拉低整体的相似度,影响检索效果。
为了解决这个问题,可以考虑采用以下方案:
- 用单独字段存储关联的图片,原文中用占位符去表示图片。
- 召回时将占位符替换成具体的图片
- 向量化时,用去掉占位符的内容去embedding。
- 存ES时,用单独字段存储原文(不索引),用另外一个字段存储去掉占位符的内容(检索用这个字段)。
- 图片用多模态模型解析后,单独存储chunk。
还有个简化方案:原文不存储图片位置信息,chunk用个单独字段存储关联的图片(会丢失图片位置信息)。
附录
docx
docx本质是一个zip格式的问题,当你把docx后缀改成zip并解压后,当你把 .docx 后缀改成 .zip 并解压后,你会发现它其实是一个包含多个 XML 文件和资源文件的压缩包。这个结构遵循 Office Open XML(OOXML)标准,主要目录和文件如下:
- word/document.xml:主文档内容,即你在 Word 中看到的大部分文本内容都存储在这个文件中。
- word/styles.xml:定义了文档中使用的样式,如标题、加粗、字体等。
- word/numbering.xml:定义了项目符号、编号列表等格式。
- word/media/:包含文档中嵌入的图片和其他媒体文件。
- word/_rels/ 和 _rels/:用于存储各个 XML 文件之间的关系信息(即 .rels 文件),这是 OOXML 的一个核心机制。
- [Content_Types].xml:声明了包内各种内容的 MIME 类型。
内容格式
| 元素 | 含义 |
|---|---|
<w:p> |
一个段落。每个 <w:p> 是 Word 逻辑上的一段,即用户按下 Enter 产生的新段落。 |
<w:r> |
一个 run,表示段落中的一部分内容,比如一段文字、一个图片等。 |
<w:t> |
run 中的文字内容。 |
<w:drawing> |
插入的图片(也可以是图形),可能是 inline 或 anchor 类型。 |
<a:blip r:embed="rId5"/> |
引用了图片资源,rId5 是关系文件中定义的图片 ID,链接到 /word/media/image1.png 之类的实际文件。 |
<w:tbl> |
表格容器,包含整张表格的结构。 |
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
<w:body>
<w:p> <!-- 一个段落 -->
<w:r> <!-- 一段文本 -->
<w:t>这是图片前的文字。</w:t>
</w:r>
<w:r> <!-- 图片本体 -->
<w:drawing>
<wp:inline>
<wp:extent cx="990000" cy="792000"/>
<wp:docPr id="1" name="图片 1"/>
<a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:blipFill>
<a:blip r:embed="rId5"/>
...
</pic:blipFill>
...
</pic:pic>
</a:graphicData>
</a:graphic>
</wp:inline>
</w:drawing>
</w:r>
<w:r> <!-- 图片后的文字 -->
<w:t>这是图片后的文字。</w:t>
</w:r>
</w:p>
<w:tbl> <!-- 表格 -->
<w:tr> <!-- 行 -->
<w:tc> <!-- 单元格 -->
<w:p> <!-- 单元格内部其实就是一个paragraph,可以包含文字,图片
<w:r>
<w:t>单元格里的文字</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
</w:tbl>
</w:body>
</w:document>
docx转markdown
docx 转 Markdown,主要是遍历文档段落,判断段落样式(标题、列表、正文),提取文字、表格和图片,转换为对应的 Markdown 格式,最后写入 .md 文件。
https://blog.csdn.net/liuzhenghua66/article/details/148954240
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)