GPT 知识库实现原理(RAG / llama_index)
本文偏实现原理,介绍平台「私有知识库 / 一键上传知识库问答助手」背后的检索增强生成(RAG)思路与 llama_index 的核心抽象。面向使用者的功能操作见 私有知识库。
背景
大型语言模型(LLM)的核心用例之一,就是针对用户自己的数据进行问答,主要为了解决「文档全文超出 token 限制」的问题。
知识库系统做的事情其实是:用一种算法搜索文档、挑出相关摘录,然后只把这些相关资料连同用户问题一起传给 LLM。
借用开源项目 langchain-ChatGLM 的一张图来描述:

向量知识库的实现过程:
- 解析用户上传文档,转成向量,用向量存储来保存这些非结构化文档(知识语料库);
- 用户给定查询,使用检索模型从语料库中检索相关文档,再用合成模型生成响应;
- 检索模型通过「嵌入查询的相似度」获取前 k 个文档。
设计目标
团队的一个目标是打造「一键上传知识库的问答助手」,满足内部平台文档问答、客服小助手等需求。由此对系统提出以下要求:
- 多格式:支持各种数据格式文档接入,所见即可接入(iwiki / tme 乐享 / doc / csv / md / pdf / neo4j / pandas);
- 多模型:支持本地和非本地多种大模型引擎(tme 文曲大模型 / chatgpt …);
- 精准匹配:效果持续优化;
- 好用:应用、权限、数据集、对话管理;快速配置,自由编排 prompt,命中测试、对话测试;支持前端 SDK 接入、API 接入应用。
llama_index
在文档检索增强生成(Retrieval-Augmented Generation)领域,目前最主流的两个框架是 llama_index 和 LangChain。llama_index 在该领域更深入一些,所以平台选择用 llama_index 构建系统。
项目地址:https://gpt-index.readthedocs.io/en/latest/guides/primer/index_guide.html
llama_index 对文档检索过程的抽象:

llama_index 主要提供下面几个控制器来管理流程:
- 索引(Index):通过索引来控制如何组织和存储数据。这里的索引不一定基于 embedding,llama_index 还支持更多模型(下文详述)。
- 检索器(Retriever):根据给定查询从索引中获取一组节点,像一个搜索工具,从大型数据集中找到相关信息。一般与 Index 类型绑定。
- 查询引擎(Query Engine):处理用户输入的查询,与底层数据结构(如索引)交互,并返回综合响应。
索引:llama_index 的核心
索引是 llama_index 的核心。llama_index 提供了一些通用索引,用户可以复用、组合,应对不同格式、不同数据形式。

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

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

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

Pandas Index 效果:

说明:上述配图托管在 gitee(
foruda.gitee.com),本文核对时可正常访问;若后续失效不影响正文理解。gpt-index.readthedocs.io为 llama_index 早期文档地址,保留原文链接。
在 CubeStudio 中的落地
以下为对照本仓代码补充的落地映射,便于把上面的原理与平台实现对应起来;具体以源码为准。
- 知识库的上传与召回:聊天应用(
myapp/views/view_chat.py)通过chat-embeddingaihub 应用对接知识库——上传走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 的ServiceContext、PromptHelper、LLMPredictor、SimpleDirectoryReader、DatasetGenerator自动生成问答数据集。 - 向量索引构建(示例):
aihub/deep-learning/chat-embedding/csv-data.py另用 LangChain 的VectorstoreIndexCreator演示 CSV 数据的向量索引与检索。
具体以源码为准,本节仅供导航。
相关文档
- 功能使用:私有知识库
- 大模型用于标注(NLP 自动化标注调用 LLM):LabelStudio 标注平台二次开发
- 平台整体定位:项目简介