什么是检索增强生成(RAG)?🚀
太长不看
什么是 RAG?
应用程序
项目设置
安装依赖项
获取您的 API 密钥
构建基于 RAG 的 LLM 应用
结论
太长不看
在本文中,我将讨论什么是 RAG 以及如何实现基于 RAG 的 LLM 应用程序(是的,附带完整的代码示例😚)。
让我们直接进入正题。
DeepEval——LLM应用程序的开源评估框架
DeepEval 是一个框架,它通过提供默认指标来衡量幻觉、相关性等等,从而帮助工程师评估其 LLM 应用程序的性能。
我们刚刚起步,真心希望帮助更多开发者构建更安全的AI应用。您能否给我们点个赞,帮助我们宣传一下呢?🥺❤️🥺
什么是 RAG?
检索增强生成(RAG)是自然语言处理(NLP)领域的一项技术,它允许像 ChatGPT 这样的语言学习模型(LLM)生成超出其训练数据范围的定制化输出。如果没有 RAG,LLM 应用就好比让 ChatGPT 总结一封电子邮件,却不提供邮件原文作为上下文。
RAG 系统由两个主要部件组成:回收器和生成器。
检索器负责在知识库中搜索与给定输入最相关的信息,这些信息被称为检索结果。另一方面,生成器利用这些检索结果,根据预定义的提示模板生成一系列提示,从而对输入做出连贯且相关的响应。
这是 RAG 架构的示意图。
在大多数情况下,您的“知识库”由存储在 ChromaDB 等向量数据库中的向量嵌入组成,而您的“检索器”将执行以下操作:1) 在运行时对给定的输入进行向量嵌入;2) 在包含您数据的向量空间中搜索,找到最相关的 K 个检索结果;3) 根据相关性(或与向量化输入嵌入的距离)对结果进行排序。然后,这些结果将被处理成一系列提示,并传递给您的“生成器”,即您选择的语言学习模型(例如 GPT-4、lLama2 等)。
对于更多好奇的用户,以下是检索器通常用于提取最相关检索结果的模型:
-
神经网络嵌入(例如 OpenAI/Cohere 的嵌入模型):根据文档在多维向量空间中的位置邻近性对文档进行排序,从而能够理解输入和文档语料库之间的文本关系和相关性。
-
Best Match 25 (BM25):一种概率检索模型,旨在提高文本检索的精确度。它结合词频和逆文档频率,考虑词项的重要性,确保常用词和罕见词都会影响相关性排序。
-
TF-IDF(词频-逆文档频率):计算词项在文档中相对于整个语料库的重要性。通过将词项在文档中的出现频率与其在整个语料库中的稀有度进行对比,它确保了相关性排名的全面性。
-
混合搜索:通过为不同的方法(如神经网络嵌入、BM25 和 TF-IDF)分配不同的权重来优化搜索结果的相关性。
应用程序
RAG 能够将文本检索和生成相结合,从而提供更优质的响应,因此在不同领域有着广泛的应用。在 Confident 与众多公司合作开发 LLM 应用的过程中,我总结出了以下四个最常见的用例:
-
客户支持/用户引导聊天机器人:这并不令人意外,它会从内部文档中提取数据,生成更加个性化的回复。点击此处阅读完整教程,了解如何使用 lLamaindex 自行构建聊天机器人。
-
数据提取。有趣的是,我们可以使用 RAG 算法从 PDF 等文档中提取相关数据。您可以在这里找到相关教程。
-
销售赋能:从 LinkedIn 个人资料和电子邮件往来中提取数据,以生成更具个性化的推广信息。
-
内容创建与优化:从过往对话中检索数据,生成建议回复。
在下面的代码演练中,我们将构建一个非常通用的聊天机器人,您可以通过调整提示和存储在向量数据库中的数据,将其功能自定义为上面列出的任何用例。
项目设置
在这个项目中,我们将基于您的知识库构建一个问答(QA)聊天机器人。关于如何为您的知识库建立索引,我们暂且不谈,因为这部分内容我们将在以后讨论。
我们将使用 Python、ChromaDB 作为向量数据库,以及 OpenAI 来实现向量嵌入和聊天自动补全功能。我们将围绕你最喜欢的维基百科页面构建一个聊天机器人。
首先,创建一个新的项目目录并安装我们需要的依赖项。
mkdir rag-llm-app
cd rag-llm-app
python3 -m venv venv
source venv/bin/activate
您的终端现在应该会显示类似这样的内容:
(venv)
安装依赖项
pip install openai chromadb
接下来,创建一个新的 main.py 文件——这是 LLM 应用程序的入口点。
touch main.py
获取您的 API 密钥
最后,如果您还没有 OpenAI API 密钥,请在此处获取,并将其设置为环境变量:
export OPENAI_API_KEY="your-openai-api-key"
一切就绪!让我们开始编写代码吧。
构建基于 RAG 的 LLM 应用
首先创建一个检索器类,该类将从 ChromaDB 中检索与给定用户问题最相关的数据。
打开 main.py 文件,并将以下代码粘贴进去:
import chromadb
from chromadb.utils import embedding_functions
import openai
client = chromadb.Client()
client.heartbeat()
class Retriver:
def __init__(self):
pass
def get_retrieval_results(self, input, k):
openai_ef = embedding_functions.OpenAIEmbeddingFunction(api_key="your-openai-api-key", model_name="text-embedding-ada-002")
collection = client.get_collection(name="my_collection", embedding_function=openai_ef)
retrieval_results = collection.query(
query_texts=[input],
n_results=k,
)
return retrieval_results["documents"][0]
这里展示的openai_ef是 ChromaDB 底层用于向量化输入的嵌入函数。当用户向您的聊天机器人发送问题时,它会使用 OpenAI 的text-embedding-ada-002模型从该问题创建一个向量嵌入。然后,ChromaDB 会使用此向量嵌入在集合向量空间中执行向量相似性搜索,该集合向量空间包含来自您的知识库的数据(请记住,我们假设您已经为本教程索引了数据)。此过程允许您针对任何给定的输入搜索前 K 个最相关的检索结果。
现在你已经创建了检索器,请粘贴以下代码以创建生成器:
...
class Generator:
def __init__(self, openai_model="gpt-4"):
self.openai_model = openai_model
self.prompt_template = """
You're a helpful assistant with a thick country accent. Answer the question below and if you don't know the answer, say you don't know.
{text}
"""
def generate_response(self, retrieval_results):
prompts = []
for result in retrieval_results:
prompt = self.prompt_template.format(text=result)
prompts.append(prompt)
prompts.reverse()
response = openai.ChatCompletion.create(
model=self.openai_model,
messages=[{"role": "assistant", "content": prompt} for prompt in prompts],
temperature=0,
)
return response["choices"][0]["message"]["content"]
generate_response在这里,我们根据之前构建的检索器提供的列表,在方法中构建了一系列提示retrieval_results。然后,我们将这一系列提示发送给 OpenAI 以生成答案。借助 RAG,您的问答聊天机器人现在可以通过增强检索结果来生成更个性化的输出!
最后,让我们把所有内容总结起来:
...
class Chatbot:
def __init__(self):
self.retriver = Retriver()
self.generator = Generator()
def answer(self, input):
retrieval_results = self.retriver.get_retrieval_results(input)
return self.generator.generate_response(retrieval_results)
# Creating an instance of the Chatbot class
chatbot = Chatbot()
while True:
user_input = input("You: ") # Taking user input from the CLI
response = chatbot.answer(user_input)
print(f"Chatbot: {response}")
好了,就这些!你刚刚构建了你的第一个基于 RAG 的聊天机器人。
结论
本文介绍了 RAG 的概念、一些应用场景以及如何构建基于 RAG 的 LLM 应用。然而,您可能已经注意到,构建自己的 RAG 应用相当复杂,数据索引也并非易事。幸运的是,LangChain 和 lLamaIndex 等开源框架能够以更简单的方式实现我们演示的内容。
如果您喜欢这篇文章,请不要忘记在 GitHub 上给我们点个赞 ❤️:https://github.com/confident-ai/deepeval
您也可以在这里找到完整的代码示例:https://github.com/confident-ai/blog-examples/tree/main/rag-llm-app
下次再见!
文章来源:https://dev.to/confidentai/what-is-retrieval-augmented- Generation-rag-4n7g


