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

检索增强生成(RAG)

检索增强生成(Retrieval-Augmented Generation, RAG)是一种结合了检索机制和生成模型的先进技术,旨在提高自然语言处理系统的准确性和上下文相关性。本文将详细介绍如何从零开始构建一个RAG系统,包括数据处理、检索、生成以及部署等各个环节。

💢RAG系统的核心组件

一个完整的RAG系统通常由以下几个核心组件构成:

  • 索引管道:负责数据的摄取和预处理,创建向量嵌入,并将其存储在快速访问的向量数据库中。
  • 检索管道:根据用户的查询从已索引的数据库中检索最相关的信息,使用检索策略和重排序方法来优化结果。
  • 生成管道:将检索到的数据与用户的查询结合,生成准确、相关且连贯的响应。

💢构建RAG系统的步骤 

1. 数据摄取与预处理

在构建RAG系统之前,需要准备好用于训练和检索的数据。这通常包括以下步骤:

  • 数据收集:选择合适的数据源,例如文档库、API或数据库,以确保信息的相关性和时效性。
  • 数据清洗:去除冗余信息,处理缺失值,并确保数据格式一致,以便后续处理。
  • 文本分块:将长文本分割成较小的块,以便于后续的嵌入和检索。

2. 向量嵌入生成

向量嵌入是RAG系统的基础,它将文本数据转换为数值表示,使得计算机能够理解其语义。可以使用以下方法生成嵌入:

  • 选择嵌入模型:使用如BERT、SentenceTransformers等预训练模型来生成文本嵌入。根据应用场景,可以对模型进行微调以提高特定领域的准确性。
  • 存储向量:将生成的向量存储在高性能向量数据库中,如Pinecone或Weaviate,以支持快速相似性搜索。

3. 检索过程

在用户提交查询后,RAG系统会执行以下步骤:

  • 查询预处理:对用户输入进行清洗和标准化,例如去除停用词、词形还原等,以提高检索效果。
  • 生成查询嵌入:将预处理后的查询转换为向量表示,以便与数据库中的文档进行比较。
  • 执行检索:利用向量数据库执行相似性搜索,从中获取与用户查询最相关的文档片段。

4. 上下文整合与生成响应

一旦获得相关文档,RAG系统将执行以下操作:

  • 上下文整合:将检索到的信息与用户查询结合,形成一个丰富的上下文提示,这一步骤对于生成准确响应至关重要。
  • 调用生成模型:使用大模型(如GPT系列)来生成最终响应。此时,模型会依据整合后的信息生成更加准确且上下文相关的答案。

💥常用RAG工具

  1. Haystack
    • Haystack是一个强大的开源框架,支持多种文档存储方案(如Elasticsearch、FAISS等),并与多种语言模型无缝集成。
  2. LangChain
    • LangChain提供了一个灵活的框架,允许开发者快速构建和管理链式应用程序,适合用于RAG系统的构建。
  3. RAGFlow
    • RAGFlow是一个用户友好的框架,专注于简化RAG应用程序的开发过程,适合初学者和有经验的开发者。

使用LangChain构建RAG演示

from langchain import hub
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import Chroma
from langchain_openai import ChatOpenAI# 加载文档并创建向量存储
loader = WebBaseLoader("https://example.com")
documents = loader.load()
vectorstore = Chroma.from_documents(documents)# 创建检索器
retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 5})# 创建生成模型
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)# 定义RAG链
def format_docs(docs):return "\n\n".join(doc.page_content for doc in docs)rag_chain = ({"context": retriever | format_docs, "question": "What is the role of Microsoft?"}| llm
)
response = rag_chain.invoke("What does Microsoft do?")
print(response)

💫构建一个简单的问答系统

pip install langchain openai

创建知识库

创建一个简单的知识库,包含一些常见问题及其对应答案。可以使用Python字典来存储这些信息:

knowledge_base = {"What is LangChain?": "LangChain is an open-source framework for developing applications powered by large language models.","What is the capital of France?": "The capital of France is Paris.","Who is the CEO of OpenAI?": "As of 2023, Sam Altman is the CEO of OpenAI."
}

创建提示模板

接下来,我们创建一个提示模板,用于格式化用户输入并生成查询:

from langchain import PromptTemplatetemplate = "Answer the following question based on the knowledge base: {question}"
prompt = PromptTemplate(template=template, input_variables=["question"])

创建大型模型实例

import os
from langchain.llms import OpenAIos.environ["OPENAI_API_KEY"] = "*******"  # 替换为自己的API密钥
llm = OpenAI(model_name="gpt-3.5-turbo")

创建问答链

创建一个问答链,将提示和语言模型结合起来:

from langchain.chains import LLMChain# 创建问答链
qa_chain = LLMChain(llm=llm, prompt=prompt)

实现查询功能

def answer_question(question):# 检查知识库中是否有答案if question in knowledge_base:answer = knowledge_base[question]else:answer = "I'm sorry, I don't know the answer to that question."# 使用LLM生成回答result = qa_chain.run(question)return result

🍺测试:

if __name__ == "__main__":user_question = input("Please ask a question: ")response = answer_question(user_question)print(response)

http://www.lryc.cn/news/514082.html

相关文章:

  • 【第二部分--Python之基础】03 容器类型的数据
  • 【人工智能机器学习基础篇】——深入详解深度学习之复杂网络结构:卷积神经网络(CNN)、循环神经网络(RNN)、生成对抗网络(GAN)等概念及原理
  • MySQL 入门教程
  • 【sql】CAST(GROUP_CONCAT())实现一对多对象json输出
  • QT:控件属性及常用控件(1)------核心控件及属性
  • 使用 Python结合ffmpeg 实现单线程和多线程推流
  • Linux一些问题
  • 在 Ubuntu 24.04.1 LTS | Python 3.12 环境下部署 Crypto 库
  • HTML5实现好看的二十四节气网页源码
  • C++(9)—类和对象(上) ②实例化
  • Effective C++读书笔记——item2(const,enum,inlines取代#define)
  • 如何科学评估与选择新版本 Python 编程语言和工具
  • 第十届“挑战杯”大学生课外学术科技作品竞赛解析及资料
  • 【门铃工作原理】2021-12-25
  • Chain of Agents(COA):大型语言模型在长文本任务中的协作新范式
  • 业务模型与UI设计
  • Apache SeaTunnel深度优化:CSV字段分割能力的增强
  • 免费下载 | 2024年具身大模型关键技术与应用报告
  • SSM-Spring-AOP
  • jenkins修改端口以及开机自启
  • 按照人们阅读Excel习惯来格式化BigDecimal
  • IDEA开发Java应用的初始化设置
  • Java网络套接字
  • 2025差旅平台推荐:一体化降本30%
  • 多个DataV遍历生成
  • mysql_real_connect的概念和使用案例
  • Python性能分析深度解析:从`cProfile`到`line_profiler`的优化之路
  • Momentum Contrast for Unsupervised Visual Representation Learning论文笔记
  • 用户界面的UML建模07
  • Node.js中使用Joi 和 express-joi-validation进行数据验证和校验