【带你 langchain 双排系列教程】9.LangChain基于RAG 实现文档问答:从入门到实战

news/2025/2/24 22:48:56

摘要:RAG(Retrieval-Augmented Generation)是当前大语言模型应用的重要创新方向。本文将深入解析RAG在LangChain框架下的实现原理,并通过丰富的实例代码,展示如何基于RAG构建强大的文档问答应用,助力开发者快速掌握相关技术。

一、什么是RAG

RAG是Retrieval-Augmented Generation 的缩写,指检索增强生成。其核心思想是在大语言模型的输入端引入外部知识库的检索结果,帮助模型更好地理解和生成基于上下文的回答。

二、基于LangChain的RAG实现原理

  1. 数据加载与预处理:通过 LangChain 的 document_loaders 模块加载文档,然后使用 text_splitter 将文档分割为适合处理的块。
  2. 向量嵌入与存储:对分割后的文本块进行嵌入计算,生成向量表示,并存储在向量数据库中。
  3. 检索与生成:在问答过程中,首先对用户问题进行嵌入计算,然后从向量数据库中检索最相关的文本块,将检索结果与用户问题一起输入到大语言模型中,生成最终回答。

三、环境搭建

确保已安装以下依赖:

bash复制

pip install langchain langchain-openai faiss-cpu tiktoken

四、快速开始:问答示例

  1. 加载数据:从指定路径加载文档
  2. 分割文本:将文档分割为文本块
  3. 创建向量存储:使用 Faiss 向量库进行存储
  4. 问答功能:实现基于 RAG 的问答

1. 加载数据

Python复制

python">from langchain.document_loaders import TextLoader
loader = TextLoader("path/to/your/document.txt")
documents = loader.load()

2. 分割文本

Python复制

python">from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

3. 创建向量存储

Python复制

python">from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS

embeddings = OpenAIEmbeddings()
db = FAISS.from_documents(docs, embeddings)

4. 问答功能

Python复制

python">from langchain.llms import OpenAI
from langchain.chains.question_answering import load_qa_chain

llm = OpenAI(model_name="text-davinci-003")
chain = load_qa_chain(llm, chain_type="stuff")

def get_answer(question):
    docs = db.similarity_search(question)
    return chain.run(input_documents=docs, question=question)

五、企业级项目:电商知识库问答

需求

通过RAG实现对电商知识库的问答,帮助客服人员快速获取产品信息。

1. 添加外部API检索

引入API调用功能,如天气查询、汇率换算等:

Python复制

python">from langchain.agents import initialize_agent, Tool
from langchain.chat_models import ChatOpenAI

llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo")

def weather_api(city):
    # 模拟天气API接口
    return f"{city}天气晴朗"

tools = [
    Tool(
        name = "Weather",
        func=weather_api,
        description="查询城市天气情况"
    )
]
agent = initialize_agent(tools, llm, agent="chat-zero-shot-react-description", verbose=True)

2. 结合知识库检索

Python复制

python">def product_info(product_id):
    # 模拟产品信息检索
    return f"产品 {product_id} 的详细信息"

tools.append(
    Tool(
        name = "ProductInfo",
        func=product_info,
        description="获取产品详细信息"
    )
)

3. 测试业务逻辑

Python复制

python">agent.run("客户询问产品1001的详细信息和当前北京的天气如何")

六、性能优化与监控

1. 并发处理

使用异步调用提高响应速度:

Python复制

python">import asyncio
from langchain.agents import AgentExecutor

async def async_query(agent):
    response = await agent.arun("查询产品1002的信息")
    print(response)

loop = asyncio.get_event_loop()
loop.run_until_complete(async_query(agent))

2. 数据可视化

通过Matplotlib展示RAG的性能指标:

Python复制

python">import matplotlib.pyplot as plt

# 示例数据
response_times = [0.1, 0.2, 0.15, 0.18, 0.12]

plt.plot(response_times)
plt.title("RAG Response Time Analysis")
plt.ylabel("Response Time (s)")
plt.show()

七、实践案例:多模型比较

比较不同模型在RAG问答中的表现:

Python复制

python">from langchain.chat_models import ChatOpenAI
from langchain.chains import ChatVectorDBChain
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.schema import Document

# 初始化OpenAI模型和嵌入
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")
llm2 = ChatOpenAI(temperature=0, model_name="gpt-4")
embeddings = OpenAIEmbeddings()

# 加载和处理文档
documents = [Document(page_content="用户1的问题:什么是人工智能?")]
texts = [doc.page_content for doc in documents]
db = Chroma.from_texts(texts, embeddings)

# 创建问答链
qa_chain = ChatVectorDBChain.from_llm(llm, db)
qa_chain2 = ChatVectorDBChain.from_llm(llm2, db)

# 测试模型
question = "什么是人工智能?"
result = qa_chain({"question": question})
result2 = qa_chain2({"question": question})

print("GPT-3.5-turbo的回答:", result["answer"])
print("GPT-4的回答:", result2["answer"])

八、总结

通过本文介绍的LangChain的RAG实现方法,可以快速构建支持文档问答的应用,极大地提升了问答系统的准确性和实用性。无论是用于企业知识库问答,还是复杂的问答场景,RAG结合LangChain都能提供强大的支持。


http://www.niftyadmin.cn/n/5864848.html

相关文章

软件工程和系统分析与设计

软件工程 1、软件危机 2、软件过程模型 2.1 瀑布模型 2.2原型模型 2.3螺旋模型 2.4敏捷模型 2.5软件统一过程 3、软件能力成熟度模型 CMM 4、软件能力成熟度模型集成 CMMI 系统分析与设计 1、结构化方法SASD 1.1结构化分析 DFD 1.2结构化设计 SD-是一种面向数据流的设计…

第19篇:性能优化策略与实践

目标:掌握 Vue3 性能优化的核心方法与实战技巧 1. 性能分析工具 Chrome DevTools - Performance 录制运行时性能分析长任务(Long Tasks)和内存泄漏 Vue DevTools - Performance 组件渲染耗时分析时间线跟踪 Lighthouse 生成性能评分报告识别…

Python模块和包简单讲解

目录 模块(Module) 包(Package) 包和模块的区别 使用场景 模块(Module) 模块是一个包含Python代码的文件,通常以.py为扩展名。它用于组织相关的函数、类和变量等代码,方便复用和…

Milvus向量数据库可视化客户端Attu

概述 关于Milvus的介绍,可搜索网络资料。Milvus的使用还在摸索中;打算写一篇,时间待定。 关于Attu的资料: 官网GitHub文档 对于Milvus的数据可视化,有如下两个备选项: Milvus_cli:命令行工…

STM32-智能台灯项目

一、项目需求 1. 红外传感器检测是否有人,有人的话实时检测距离,过近则报警;同时计时,超过固定时间则报警; 2. 按键 1 切换工作模式:智能模式、按键模式、远程模式; 3. 智能模式下,根…

Deepin(Linux)安装MySQL指南

1.下载 地址:https://downloads.mysql.com/archives/community/ 2.将文件解压到 /usr/local 目录下 先cd到安装文件所在目录再解压,本机是cd /home/lu01/Downloads sudo tar -xvJf mysql-9.2.0-linux-glibc2.28-x86_64.tar.xz -C /usr/local3.创建软链…

时间转换(acwing)c/c++/java/python

读取一个整数值,它是工厂中某个事件的持续时间(以秒为单位),请你将其转换为小时:分钟:秒来表示。 输入格式 输入一个整数 NN。 输出格式 输出转换后的时间表示,格式为 hours:minutes:second…

PyTorch下三角矩阵生成函数torch.tril的深度解析

PyTorch下三角矩阵生成函数torch.tril的深度解析 一、下三角矩阵的数学意义与应用场景 下三角矩阵(Lower Triangular Matrix)是线性代数中的基础概念,指主对角线以上元素全为0的方阵。这种特殊矩阵结构在数值计算中具有重要价值&#xff1a…