【llm对话系统】大模型RAG之基本逻辑
大模型 RAG 之基本逻辑:让 LLM 更精准地回答你的问题(降低幻觉)
你是否遇到过这样的情况:当你向 LLM 提问时,它可能会给出一些“一本正经胡说八道”的答案,或者无法回答一些特定领域的专业问题?
为了解决这个问题,RAG (Retrieval-Augmented Generation,检索增强生成) 技术应运而生。RAG 将 检索 (Retrieval) 和 生成 (Generation) 结合起来,让 LLM 在回答问题时,能够参考外部的知识库,从而给出更准确、更可靠的答案。
一、RAG 是什么?
简单来说,RAG 是一种结合了信息检索和文本生成的技术,它可以让 LLM 在生成答案时,先从一个外部知识库中检索相关的信息,然后根据检索到的信息和原始问题生成答案。
RAG 的基本流程:
- 检索 (Retrieval): 根据用户的问题,从知识库中检索出相关的文档片段。
- 生成 (Generation): 将原始问题和检索到的文档片段一起输入到 LLM 中,让 LLM 根据这些信息生成答案。
通俗理解:
想象一下,你正在写一篇论文 (生成答案),但是你对某个领域不太熟悉 (知识不足)。这时候,你会怎么办?你可能会去图书馆或者网上搜索相关的资料 (检索),然后根据这些资料来完成你的论文 (生成)。
RAG 的工作原理与此类似,它可以让 LLM 在“知识不足”的时候,先去“查阅资料”,然后再回答问题。
二、RAG 的核心组件
一个典型的 RAG 系统通常包含以下几个核心组件:
- 知识库 (Knowledge Base): 存储着大量的文档片段,可以是文本、表格、代码等各种形式。
- 检索器 (Retriever): 根据用户的问题,从知识库中检索出相关的文档片段。常用的检索器包括:
- 稀疏检索器 (Sparse Retriever): 例如 TF-IDF、BM25 等基于关键词匹配的传统检索方法。
- 稠密检索器 (Dense Retriever): 例如 DPR (Dense Passage Retriever) 等基于语义向量匹配的检索方法。
- 生成器 (Generator): 通常是一个 LLM,例如 GPT、BART 等,它接收原始问题和检索到的文档片段作为输入,并生成最终的答案。
三、RAG 的工作流程
下面我们详细介绍一下 RAG 的工作流程:
1. 构建知识库:
首先,我们需要构建一个知识库。这个知识库可以包含各种类型的文档,例如:
- 公司内部的文档: 产品手册、技术文档、常见问题解答等。
- 公开的网页: 维基百科、新闻文章等。
- 学术论文: 各种领域的学术论文。
2. 将文档切分成片段:
由于 LLM 通常有输入长度的限制,我们需要将文档切分成较小的片段,例如按照段落或句子进行切分。
3. 对文档片段进行索引:
为了能够快速地检索到相关的文档片段,我们需要对文档片段进行索引。
- 对于稀疏检索器: 通常会构建倒排索引 (Inverted Index)。
- 对于稠密检索器: 通常会使用向量数据库 (Vector Database),例如 FAISS、Annoy 等,将文档片段编码成向量,并存储到向量数据库中。
4. 检索相关的文档片段:
当用户提出问题时,检索器会根据问题从知识库中检索出相关的文档片段。
- 稀疏检索器: 通过计算问题和文档片段之间的关键词重叠程度来检索。
- 稠密检索器: 将问题编码成向量,然后在向量数据库中搜索与其最相似的文档片段向量。
5. 生成答案:
将原始问题和检索到的文档片段一起输入到 LLM 中,让 LLM 根据这些信息生成答案。
Prompt 示例:
请根据以下问题和文档片段,生成一个准确且完整的答案:
问题:{question}
文档片段:
{document_1}
{document_2}
...
答案:
四、RAG 的优势
RAG 相比于传统的 LLM,具有以下优势:
- 更准确的答案: 通过检索相关的文档片段,RAG 可以让 LLM 获得更多的背景知识,从而给出更准确的答案。
- 更可靠的答案: 由于答案是基于检索到的文档片段生成的,因此更加可靠,可以减少 LLM “胡编乱造”的情况。
- 更好的可解释性: 我们可以知道 LLM 生成的答案是基于哪些文档片段,从而更好地理解 LLM 的推理过程。
- 更容易更新知识: 只需要更新知识库,就可以让 LLM 掌握新的知识,而不需要重新训练整个模型。
五、代码示例 (使用 LangChain 和 FAISS)
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
# 准备文档
documents = [
"大语言模型是指参数量很大的语言模型。",
"RAG 技术结合了检索和生成。",
"FAISS 是一个高效的向量数据库。",
# ... 更多文档 ...
]
# 初始化文本分割器
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
# 将文档分割成片段
texts = text_splitter.create_documents(documents)
# 初始化 Embedding 模型
embeddings = OpenAIEmbeddings()
# 构建向量数据库
db = FAISS.from_documents(texts, embeddings)
# 初始化 LLM
llm = OpenAI()
# 构建 RAG 链
qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=db.as_retriever())
# 提问
query = "什么是 RAG 技术?"
result = qa.run(query)
print(result)
代码解释:
- 我们使用 LangChain 框架来构建 RAG 系统。
- 我们使用 OpenAI 的 Embedding 模型将文档片段编码成向量。
- 我们使用 FAISS 构建向量数据库。
- 我们使用 OpenAI 的 LLM 作为生成器。
- 我们使用
RetrievalQA
链将检索器和生成器连接起来。