RAG代码实操之斗气强者萧炎

前言

本文主要是【RAG】——RAG代码实操的文章,如果有什么需要改进的地方还请大佬指出⛺️

作者简介:大家好,我是听风与他
☁️博客首页:CSDN主页听风与他
每日一句:狠狠沉淀,顶峰相见

目录

    • 前言
    • 1.引言
    • 2.什么是RAG?
    • 3.LangChain实现RAG
      • 3.1基础环境准备
      • 3.2向量数据库
        • 1.「加载数据」
        • 2.「数据分块」
        • 3.「数据块存储」
    • 4.RAG实现
      • 1.「第一步:数据检索」
      • 2.「第二步:提示增强」
      • 3.「第三步:答案生成」
    • 文章末尾

1.引言

  • 针对大型语言模型效果不好的问题,之前人们主要关注大模型再训练、大模型微调、大模型的Prompt增强,但对于专有、快速更新的数据却并没有较好的解决方法,为此检索增强生成(RAG)的出现,弥合了LLM常识和专有数据之间的差距。

    今天给大家分享的这篇文章,将介绍RAG的概念理论,并带大家利用LangChain进行编排,OpenAI语言模型、Weaviate 矢量数据库(也可以自己搭建Milvus向量数据库)来实现简单的 RAG 管道。

2.什么是RAG?

  • RAG的全称是Retrieval-Augmented Generation,中文翻译为检索增强生成。它是一个为大模型提供外部知识源的概念,这使它们能够生成准确且符合上下文的答案,同时能够减少模型幻觉。

3.LangChain实现RAG

3.1基础环境准备

  • 1、安装所有需要依赖的相关python包,其中包括用于编排的langchain、大模型接口openai、矢量数据库的客户端 weaviate-client。
pip install langchain openai weaviate-client

3.2向量数据库

接下来,你需要准备一个矢量数据库作为保存所有附加信息的外部知识源。该矢量数据库是通过以下步骤填充的:1)加载数据;2)数据分块;3)数据[块存储]

1.「加载数据」
  • 这里选择了一篇斗破苍穹的小说,作为文档输入 。文档是txt文本,要加载文本这里使用 LangChain 的 TextLoader。
from langchain.document_loaders import TextLoader
loader = TextLoader('a.txt')
documents = loader.load()
2.「数据分块」
  • 因为文档在其原始状态下太长(将近5万行),无法放入大模型的上下文窗口,所以需要将其分成更小的部分。LangChain 内置了许多用于文本的分割器。这里使用 chunk_size 约为 1024 且 chunk_overlap 为128 的 CharacterTextSplitter 来保持块之间的文本连续性。
from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(chunk_size=1024, chunk_overlap=128)
chunks = text_splitter.split_documents(documents)

安装依赖

pip install tiktoken
3.「数据块存储」
  • 要启用跨文本块的语义搜索,需要为每个块生成向量嵌入,然后将它们与其嵌入存储在一起。要生成向量嵌入,可以使用 OpenAI 嵌入模型,并使用 Weaviate 向量数据库来进行存储。通过调用 .from_documents(),矢量数据库会自动填充块。
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Weaviate
import weaviate
from weaviate.embedded import EmbeddedOptions
import openai

client = weaviate.Client(
  embedded_options = EmbeddedOptions()
)

vectorstore = Weaviate.from_documents(
    client = client,
    documents = chunks,
    # embedding = OpenAIEmbeddings(),
    embedding = OpenAIEmbeddings(openai_api_key="openai的key",openai_api_base = "中转api"),
    by_text = False
)

4.RAG实现

1.「第一步:数据检索」

  • 将数据存入矢量数据库后,就可以将其定义为检索器组件,该组件根据用户查询和嵌入块之间的语义相似性获取相关上下文。
retriever = vectorstore.as_retriever()

2.「第二步:提示增强」

  • 完成数据检索之后,就可以使用相关上下文来增强提示。在这个过程中需要准备一个提示模板。可以通过提示模板轻松自定义提示,如下所示。
from langchain.prompts import ChatPromptTemplate
template = """你是一个问答机器人助手,请使用以下检索到的上下文来回答问题,如果你不知道答案,就说你不知道。问题是:{question},上下文: {context},答案是:
"""
prompt = ChatPromptTemplate.from_template(template)

3.「第三步:答案生成」

  • 利用 RAG 管道构建一条链,将检索器、提示模板和 LLM 链接在一起。定义了 RAG 链,就可以调用它了。
from langchain.chat_models import ChatOpenAI
from langchain.schema.runnable import RunnablePassthrough
from langchain.schema.output_parser import StrOutputParser
llm = ChatOpenAI(model_name="gpt-3.5-turbo",openai_api_key="openai的key",openai_api_base = "中转api", temperature=0)

rag_chain = (
    {"context": retriever,  "question": RunnablePassthrough()} 
    | prompt 
    | llm
    | StrOutputParser() 
)

query = "萧薰儿是谁?"
res=rag_chain.invoke(query)
print(f'答案:{res}')

总的来说,RAG的生成过程如下图所示:

RAG代码实操之斗气强者萧炎_第1张图片

文章末尾

在这里插入图片描述

你可能感兴趣的:(RAG,python,大模型,openai)