大型语言模型(LLM)虽然强大,能够快速生成智能且自然的响应,但其训练数据的局限性是主要瓶颈。例如,GPT-4 的知识截止日期为 2021 年 9 月,这意味着模型无法知晓此日期之后的事件或发展。此外,LLM 在信息准确性和幻觉方面存在持续问题——它们可能生成连贯但事实上不正确的回答。最后,LLM 缺乏具体的利基领域知识,只能在通用水平上生成响应。
为了解决这些问题并使 LLM 适用于特定和信息密集型任务,可以将 LLM 连接到 AI 知识库。AI 知识库是由有组织的数据组成的信息存储库,包括产品文档、文章、消息和其他材料。本文将详细解释如何创建一个知识库,并将其连接到 LLM,使其能够生成事实正确和具体的响应。
什么是 RAG?
RAG(Retrieval-Augmented Generation,检索增强生成)是一种技术,它使 LLM 能够访问知识库中的相关文档。它允许 LLM 根据访问的文档生成准确的响应。RAG 技术的工作原理如下:
- 查询处理:首先,将用户的自然语言查询转换为向量表示。
- 检索:在知识库中搜索与该查询最相关的文档片段。
- 上下文构建:将最合适的搜索结果作为上下文添加到提示(Prompt)中,并添加指令,例如:'仅使用以下段落中的信息来回答以下问题'。
- 生成:如果使用的 LLM 模型未针对指令进行调整,则需要添加示例(Few-Shot Learning)来演示预期输入和输出。包含指令、搜索结果和输出格式的提示文本将发送到 LLM 模型。
- 响应:LLM 使用来自上下文的信息生成准确、具体的响应。
RAG 的核心组件
RAG 系统主要由两个核心组件组成:信息检索组件和文本生成器 LLM。
- 检索器(Retriever):这是一个特定的查询编码器和基于矢量的文档搜索索引。现代系统中,向量数据库常被用作高效的检索器。向量数据库存储数据的向量嵌入,它是反映其语义含义的数据的数值表示。例如,单词 "HELLO" 可能被表示为
[0.23, 0.001, 0.707]。知识库可以是向量数据存储,检索器会将查询转换为向量,并使用相似性搜索来查找相关信息。流行的向量数据库包括 Chroma、FAISS 和 Pinecone。
- 文本生成器 LLM:使用的 LLM 模型取决于具体目的。例如,如果最终解决方案要求严格的数据隐私,则不建议使用云端的 OpenAI GPT 模型。出于开源和可控的目的,可以使用 Mistral 7B 等本地部署模型。在此示例中,我们将结合 LangChain 框架,这是一个经常用于创建基于 RAG 应用程序的工具。
创建 AI 知识库的步骤
要利用 RAG 技术,首先需要构建一个结构化的 AI 知识库。这通常涉及四个关键步骤:
- 数据收集与准备:收集原始文档(PDF、TXT、Markdown 等)。此步骤主要是手动执行的数据清洗工作,确保内容无乱码、格式统一。
- 文本分块(Chunking):由于大多数 LLM 的上下文窗口有限(例如 Mistral 7B 最多支持 8192 个 Token),需要将长文档拆分为固定大小的块。最常用的尺寸是 512 到 1024 个字符或 Token。
- 创建向量嵌入:使用专门的嵌入模型(Embedding Model)将文本块转换为向量。常用的模型包括
bge-large-en-1.5 或 all-MiniLM-L6-v2。
- 存储嵌入:将生成的向量存储在向量数据库中,以支持快速的相似度检索。
这些步骤完成后,即可创建 AI 知识库,随后连接到 LLM 以构建完整的 AI 解决方案。
文本分块策略详解
在 RAG 管道中,文本分块是必不可少的预处理步骤。它将冗长的文本文档划分为更易于理解的片段,以便 LLM 能有效处理。分块旨在提高检索准确性并优化模型对上下文窗口的使用。
常见的分块方法包括:
- 固定长度分块:将文本划分为由预定数量的标记或单词组成的部分。简单直接,但可能切断语义。
- 语义分块:沿着语义线划分文本,例如按段落或句子边界分割,保持上下文的完整性。
- 滑动窗口(Sliding Window):使用重叠块来保证围绕块边界的上下文得到维护,防止关键信息在分割时丢失。
使用 LangChain 的代码示例:
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
loader = TextLoader("path_to_your_document.txt")
documents = loader.load()
splitter = RecursiveCharacterTextSplitter(
chunk_size=512,
chunk_overlap=24,
length_function=len,
is_separator_regex=False
)
chunks = splitter.split_documents(documents)
print(f"生成了 {len(chunks)} 个文本块")
使用 LlamaIndex 的代码示例:
from llama_index.core import SimpleDirectoryReader, Settings
Settings.chunk_size = 512
Settings.chunk_overlap = 24
documents = SimpleDirectoryReader("./documents_directory").load_data()
创建和存储向量嵌入
有了文本块后,需要使用嵌入模型将其转换为向量,并存储到向量数据库中。LangChain 和 LlamaIndex 都提供了便捷的接口。
LangChain 完整流程示例:
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
LlamaIndex 完整流程示例:
from llama_index.core import VectorStoreIndex
index = VectorStoreIndex.from_documents(
documents,
show_progress=True
)
query_engine = index.as_query_engine()
response = query_engine.query("关于知识库构建的问题?")
print(response)
如何选择嵌入模型和向量数据库?
随着技术发展,新的嵌入模型每周都在发布。选择合适的模型至关重要。
嵌入模型选择
可以从 MTEB(Massive Text Embedding Benchmark)排行榜或 Hugging Face 开始。在那里可以找到每个模型的最新列表和性能统计。最重要的参数包括:
- 检索质量:衡量检索系统性能的常用指标称为 NDCG(归一化折损累计增益)。较高的分数表明模型在结果列表中更成功地将正确项目排名靠前。
- 模型尺寸:模型的大小(以 GB 为单位)显示运行模型所需的计算资源量。选择一种能够在资源使用和性能之间提供适当平衡的模型非常重要。
- 嵌入延迟:为完整数据集创建嵌入所需的时间。较短的时间通常意味着更高的计算成本或更大的硬件要求。
- 多语言能力:如果您的知识库包含多种语言,请选择支持多语言的嵌入模型。
向量数据库选择
对于向量数据库,其他参数同样关键:
- 开源或私有:开源数据库(如 FAISS, Chroma)通常有活跃的社区,适合预算有限的组织。专有数据库(如 Pinecone)提供额外的功能和有效的客户支持,适合有特定合规性要求的项目。
- 性能:最重要的参数是每秒查询数(QPS)和平均查询延迟。大量并发查询表明数据库可以同时处理多个请求。如果您的应用需要实时响应(如对话式 AI 聊天机器人),快速处理至关重要。
- 成本效益:每个数据库都有特定的定价模型。通常,数据库对向量数量或存储容量收费。某些数据库会收取数据传输费用,需考虑应用的频繁检索需求。
高级 RAG 优化技巧
为了进一步提升 RAG 系统的效果,可以采用以下高级优化技巧:
- 重排序(Re-ranking):初步检索可能返回相关性一般的文档。使用 Cross-Encoder 模型对检索结果进行重新排序,可以显著提高 Top-K 结果的准确性。
- 混合检索(Hybrid Search):结合关键词搜索(BM25)和向量搜索。关键词搜索擅长精确匹配术语,而向量搜索擅长语义理解。两者结合能覆盖更多查询场景。
- 查询重写(Query Rewriting):用户查询可能模糊或不完整。通过 LLM 将查询重写为独立、清晰的搜索语句,可以提高检索命中率。
- 元数据过滤:在向量存储中添加元数据(如文档类型、创建时间、作者),允许在检索时进行过滤,缩小搜索范围。
常见问题与最佳实践
在实际部署过程中,可能会遇到以下问题:
- 幻觉问题:即使有 RAG,LLM 仍可能忽略上下文。可以通过在 Prompt 中强调'如果不知道请回答不知道'来缓解。
- 检索延迟:大规模向量检索可能较慢。建议使用 ANN(近似最近邻)算法索引,如 HNSW,以加速搜索。
- 数据更新:当知识库内容变更时,需要定期更新向量数据库。建议建立自动化流水线,监听文件变化并触发增量更新。
结论
人工智能知识库是以快速且经济高效的方式扩大 LLM 能力的有效方法。知识库充当可靠数据的存储库,用于增强提示并使 LLM 能够生成准确的响应。RAG 技术对于 LLM 和知识库的整合是必不可少的,它为实现发展目标提供了清晰且无问题的途径。通过合理选择嵌入模型、向量数据库以及实施优化策略,可以构建出高性能、低延迟的企业级 AI 应用。
在未来的发展中,随着多模态 RAG 和 Agent 技术的成熟,知识库的应用场景将更加广泛,从简单的问答扩展到复杂的任务规划和决策支持。开发者应持续关注相关技术动态,不断优化系统架构以适应业务需求。