当前位置: 首页 > article >正文

【llm对话系统】大模型RAG之基本逻辑

大模型 RAG 之基本逻辑:让 LLM 更精准地回答你的问题(降低幻觉)

你是否遇到过这样的情况:当你向 LLM 提问时,它可能会给出一些“一本正经胡说八道”的答案,或者无法回答一些特定领域的专业问题?

为了解决这个问题,RAG (Retrieval-Augmented Generation,检索增强生成) 技术应运而生。RAG 将 检索 (Retrieval)生成 (Generation) 结合起来,让 LLM 在回答问题时,能够参考外部的知识库,从而给出更准确、更可靠的答案。

一、RAG 是什么?

简单来说,RAG 是一种结合了信息检索文本生成的技术,它可以让 LLM 在生成答案时,先从一个外部知识库中检索相关的信息,然后根据检索到的信息和原始问题生成答案。

RAG 的基本流程:

  1. 检索 (Retrieval): 根据用户的问题,从知识库中检索出相关的文档片段。
  2. 生成 (Generation): 将原始问题和检索到的文档片段一起输入到 LLM 中,让 LLM 根据这些信息生成答案。

通俗理解:

想象一下,你正在写一篇论文 (生成答案),但是你对某个领域不太熟悉 (知识不足)。这时候,你会怎么办?你可能会去图书馆或者网上搜索相关的资料 (检索),然后根据这些资料来完成你的论文 (生成)。

RAG 的工作原理与此类似,它可以让 LLM 在“知识不足”的时候,先去“查阅资料”,然后再回答问题。

二、RAG 的核心组件

一个典型的 RAG 系统通常包含以下几个核心组件:

  1. 知识库 (Knowledge Base): 存储着大量的文档片段,可以是文本、表格、代码等各种形式。
  2. 检索器 (Retriever): 根据用户的问题,从知识库中检索出相关的文档片段。常用的检索器包括:
    • 稀疏检索器 (Sparse Retriever): 例如 TF-IDF、BM25 等基于关键词匹配的传统检索方法。
    • 稠密检索器 (Dense Retriever): 例如 DPR (Dense Passage Retriever) 等基于语义向量匹配的检索方法。
  3. 生成器 (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)

代码解释:

  1. 我们使用 LangChain 框架来构建 RAG 系统。
  2. 我们使用 OpenAI 的 Embedding 模型将文档片段编码成向量。
  3. 我们使用 FAISS 构建向量数据库。
  4. 我们使用 OpenAI 的 LLM 作为生成器。
  5. 我们使用 RetrievalQA 链将检索器和生成器连接起来。

http://www.kler.cn/a/523031.html

相关文章:

  • 设计模式-建造者模式、原型模式
  • 【Jave全栈】Java与JavaScript比较
  • [蓝桥杯 2014 省 AB] 蚂蚁感冒
  • 阿里云域名备案
  • 如何解决跨浏览器兼容性问题
  • 双层Git管理项目,github托管显示正常
  • python实现dbscan
  • 【huawei】云计算的备份和容灾
  • 基于vue和elementui的简易课表
  • skynet 源码阅读 -- 核心概念服务 skynet_context
  • 图像分类(image classification)简介
  • 2001-2021年 全国各地级市宽带接入用户统计数据
  • npm cnpm pnpm npx yarn的区别
  • 《机器学习数学基础》补充资料:第343页结论证明
  • linux常用加固方式
  • 大语言模型LLM在地理信息GIS中应用场景
  • 【Validator】自定义字段、结构体补充及自定义验证,go案例讲解ReportError和errors.As在其中的使用
  • 2. Java-MarkDown文件解析-工具类
  • 20【变量的深度理解】
  • 最大值的期望 与 期望的最大值
  • mysql学习笔记-事务基础知识
  • 渗透测试之WAF规则触发绕过规则之规则库绕过方式
  • Linux进程调度与等待:背后的机制与实现
  • 大数据学习之Kafka消息队列、Spark分布式计算框架一
  • AWS SimSpace Weaver
  • 如何在本地部署deepseek r1模型?