langchain应用-RAG

发布于:2025-02-19 ⋅ 阅读:(21) ⋅ 点赞:(0)

简述

检索增强生成(Retrieval Augmented Generation),简称 RAG,已经成为当前最火热的LLM应用方案。

RAG(中文为检索增强生成) = 检索技术 + LLM 提示。例如,我们向 LLM 提问一个问题(answer),RAG 从各种数据源检索相关的信息,并将检索到的信息和问题(answer)注入到 LLM 提示中,LLM 最后给出答案。

完整的RAG应用流程主要包含两个阶段:

  • 数据准备阶段:数据提取——>文本分割——>向量化(embedding)——>数据入库
  • 应用阶段:用户提问——>数据检索(召回)——>注入Prompt——>LLM生成答案

下面我们详细介绍一下各环节的技术细节和注意事项:

数据准备阶段

数据准备一般是一个离线的过程,主要是将私域数据向量化后构建索引并存入数据库的过程。主要包括:数据提取、文本分割、向量化、数据入库等环节。

code

from langchain.text_splitter import RecursiveCharacterTextSplitter                                                                                                                      
from langchain_community.document_loaders import WebBaseLoader
from langchain_chroma import Chroma
from langchain_ollama import OllamaEmbeddings
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama import ChatOllama


# 数据提取
loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/")
data = loader.load()
 
# 文本分割
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
all_splits = text_splitter.split_documents(data)
#print(all_splits)
 
#向量化(embedding)
local_embeddings = OllamaEmbeddings(model="nomic-embed-text")
vectorstore = Chroma.from_documents(documents=all_splits, embedding=local_embeddings)

应用阶段

在应用阶段,我们根据用户的提问,通过高效的检索方法,召回与提问最相关的知识,并融入Prompt;大模型参考当前提问和相关知识,生成相应的答案。关键环节包括:数据检索、注入Prompt等。

code

prompt = ChatPromptTemplate.from_template(
    "Summarize the main themes in these retrieved docs: {docs}"
)
 
 
llm = ChatOllama(
            model="qwen2:7b",
            # model="llama3.1:8b",
            # model="ollama.com/wangshenzhi/llama3.1_8b_chinese_chat:latest",
            # model="EntropyYue/chatglm3:6b",
            # temperature=0.4,
            temperature=0.2,
            verbose=True
        )
 
def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)
 
 
chain = {"docs": format_docs} | prompt | llm | StrOutputParser()
 
question = "What are the approaches to Task Decomposition?"
 

# 数据检索
docs = vectorstore.similarity_search(question)
 
# 注入Prompt
response = chain.invoke(docs)
 
print(response)                   

参考文章

一文读懂:大模型RAG(检索增强生成)_rag大模型-CSDN博客


网站公告

今日签到

点亮在社区的每一天
去签到