GPT 知识库实现原理

想理解平台「私有知识库 / 一键上传知识库问答助手」背后的 RAG 原理与 llama_index 抽象(Index/Retriever/QueryEngine、Vector/Table/Tree Index)时读这篇

06-二次开发 / 知识库
知识库私有知识库RAG检索增强生成Retrieval-Augmented Generationllama_indexgpt-indexLangChainembedding向量检索VectorIndexTableIndexTreeIndexIndexRetrieverQueryEngine

GPT 知识库实现原理(RAG / llama_index)

本文偏实现原理,介绍平台「私有知识库 / 一键上传知识库问答助手」背后的检索增强生成(RAG)思路与 llama_index 的核心抽象。面向使用者的功能操作见 私有知识库

背景

大型语言模型(LLM)的核心用例之一,就是针对用户自己的数据进行问答,主要为了解决「文档全文超出 token 限制」的问题。

知识库系统做的事情其实是:用一种算法搜索文档、挑出相关摘录,然后只把这些相关资料连同用户问题一起传给 LLM。

借用开源项目 langchain-ChatGLM 的一张图来描述:

RAG 流程示意

向量知识库的实现过程:

  1. 解析用户上传文档,转成向量,用向量存储来保存这些非结构化文档(知识语料库);
  2. 用户给定查询,使用检索模型从语料库中检索相关文档,再用合成模型生成响应;
  3. 检索模型通过「嵌入查询的相似度」获取前 k 个文档。

设计目标

团队的一个目标是打造「一键上传知识库的问答助手」,满足内部平台文档问答、客服小助手等需求。由此对系统提出以下要求:

  • 多格式:支持各种数据格式文档接入,所见即可接入(iwiki / tme 乐享 / doc / csv / md / pdf / neo4j / pandas);
  • 多模型:支持本地和非本地多种大模型引擎(tme 文曲大模型 / chatgpt …);
  • 精准匹配:效果持续优化;
  • 好用:应用、权限、数据集、对话管理;快速配置,自由编排 prompt,命中测试、对话测试;支持前端 SDK 接入、API 接入应用。

llama_index

在文档检索增强生成(Retrieval-Augmented Generation)领域,目前最主流的两个框架是 llama_indexLangChain。llama_index 在该领域更深入一些,所以平台选择用 llama_index 构建系统。

项目地址:https://gpt-index.readthedocs.io/en/latest/guides/primer/index_guide.html

llama_index 对文档检索过程的抽象:

llama_index 检索过程抽象

llama_index 主要提供下面几个控制器来管理流程:

  • 索引(Index):通过索引来控制如何组织和存储数据。这里的索引不一定基于 embedding,llama_index 还支持更多模型(下文详述)。
  • 检索器(Retriever):根据给定查询从索引中获取一组节点,像一个搜索工具,从大型数据集中找到相关信息。一般与 Index 类型绑定。
  • 查询引擎(Query Engine):处理用户输入的查询,与底层数据结构(如索引)交互,并返回综合响应。

索引:llama_index 的核心

索引是 llama_index 的核心。llama_index 提供了一些通用索引,用户可以复用、组合,应对不同格式、不同数据形式。

llama_index 通用索引方式

几种通用索引方式:

  • VectorIndex:把文档调用 embedding API 转为向量;输入 query 时也转为向量做向量搜索,得到相关资料文档,用于喂给 GPT 回答问题。
  • TableIndex:提取子 index 的关键词;输入 query 时提取 query 关键词,找出关键词匹配的子 index。
  • TreeIndex:构建时让 LLM 或自定义模型做摘要,让 GPT 决定哪 n 个子 index 最能回答问题。

TreeIndex 类定义:

TreeIndex 类定义

所有索引都可以通过 service_context 设置索引中用到的 embedding、LLM 引擎;并通过其他参数控制索引的形态、构建过程等。

每种索引又能支持不同的检索方式;索引之间还能互相引用、多路执行、自定义,从而衍生出丰富的索引流程。最后可以经过响应合成器(response synthesizer)合成问询,通过 QueryEngine 与 LLM 交互;在此之上还能通过其他组件(如节点后处理器、令牌优化器)扩充响应合成器。

响应合成与查询引擎

llama_index 的一个价值,在于支持很多数据形式的 index,用户可以快速对各种数据发起问询:

多种数据形式的 index

Pandas Index 效果:

Pandas Index 效果

说明:上述配图托管在 gitee(foruda.gitee.com),本文核对时可正常访问;若后续失效不影响正文理解。gpt-index.readthedocs.io 为 llama_index 早期文档地址,保留原文链接。

在 CubeStudio 中的落地

以下为对照本仓代码补充的落地映射,便于把上面的原理与平台实现对应起来;具体以源码为准。

  • 知识库的上传与召回:聊天应用(myapp/views/view_chat.py)通过 chat-embedding aihub 应用对接知识库——上传走 http://chat-embedding.aihub:80/aihub/chat-embedding/api/upload_files,召回走 .../api/recall(见 view_chat.py:474-475)。
  • Prompt 中的知识占位:聊天应用的 prompt 模板支持 {{knowledge}}(知识库召回内容)、{{history}}(多轮对话)、{{query}}(用户问题)占位符(view_chat.py:152,371)。
  • QA 数据集生成aihub/deep-learning/chat-embedding/gen_qa.py 使用 llama_index 的 ServiceContextPromptHelperLLMPredictorSimpleDirectoryReaderDatasetGenerator 自动生成问答数据集。
  • 向量索引构建(示例)aihub/deep-learning/chat-embedding/csv-data.py 另用 LangChain 的 VectorstoreIndexCreator 演示 CSV 数据的向量索引与检索。

具体以源码为准,本节仅供导航。

相关文档

最后更新 2026-07-04完整文档以官方仓库为准:GitHub Wiki