LangChain开发智能问答(RAG)系统实战教程:从零构建知识驱动型AI助手

LangChain开发智能问答(RAG)系统实战教程:从零构建知识驱动型AI助手

一、RAG技术解析与LangChain简介

1.1 RAG架构核心原理

Retrieval-Augmented Generation(检索增强生成)通过结合信息检索与文本生成的优势:

复制代码
[用户问题] → [向量检索] → [相关文档] → [上下文增强] → [LLM生成] → [精准回答]

与传统问答系统相比,RAG具有:

  • 知识可更新:只需更新文档库,无需重新训练模型
  • 来源可追溯:每个回答都能关联参考文档
  • 成本更低:相比微调大模型,资源消耗大幅降低

1.2 LangChain核心组件

python 复制代码
from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains import RetrievalQA

二、环境配置与数据准备

2.1 快速安装指南

bash 复制代码
# 创建conda环境
conda create -n rag python=3.10
conda activate rag

# 安装核心依赖
pip install langchain langchain-community langchain-openai faiss-cpu tiktoken

2.2 知识库构建实战

python 复制代码
# 从网页加载数据
loader = WebBaseLoader(["https://example.com/doc1", "https://example.com/doc2"])
documents = loader.load()

# 文档分块处理
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50,
    length_function=len
)
docs = text_splitter.split_documents(documents)

三、向量检索系统搭建

3.1 向量库构建与持久化

python 复制代码
from langchain_openai import OpenAIEmbeddings

# 使用OpenAI嵌入模型
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

# 创建FAISS向量库
vectorstore = FAISS.from_documents(docs, embeddings)
vectorstore.save_local("faiss_index")  # 保存到本地

# 加载已有索引
loaded_vectorstore = FAISS.load_local("faiss_index", embeddings)

3.2 检索优化技巧

python 复制代码
# 混合检索策略
retriever = vectorstore.as_retriever(
    search_type="mmr",  # 最大边际相关性
    search_kwargs={"k": 5, "lambda_mult": 0.25}
)

# 分数阈值过滤
retriever = vectorstore.as_retriever(
    search_kwargs={"score_threshold": 0.7}
)

四、问答链集成与优化

4.1 基础问答链实现

python 复制代码
from langchain_openai import ChatOpenAI

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

qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=retriever,
    chain_type="stuff"  # 简单文档拼接
)

response = qa_chain.invoke({"query": "如何申请休假?"})
print(response["result"])

4.2 高级Prompt工程

python 复制代码
from langchain_core.prompts import PromptTemplate

custom_prompt = PromptTemplate(
    input_variables=["context", "question"],
    template="""
    你是一个专业客服助手,请根据以下上下文回答问题:
    {context}
    
    问题:{question}
    回答要求:
    1. 如果信息不完整,明确告知用户
    2. 引用文档中的具体条款
    3. 使用中文简洁回答
    """
)

qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=retriever,
    chain_type_kwargs={"prompt": custom_prompt}
)

五、生产级优化方案

5.1 性能提升技巧

python 复制代码
# 异步处理提升吞吐量
async def async_query(question):
    return await qa_chain.ainvoke({"query": question})

# 缓存机制
from langchain.cache import SQLiteCache
import langchain
langchain.llm_cache = SQLiteCache(database_path=".langchain.db")

5.2 监控与评估

python 复制代码
# 记录问答历史
from langchain.callbacks import FileCallbackHandler
handler = FileCallbackHandler('logs.json')

qa_chain.invoke(
    {"query": "年度奖金如何计算?"}, 
    config={"callbacks": [handler]}
)

# 评估检索质量
from langchain.evaluation import load_evaluator
evaluator = load_evaluator("context_qa")
eval_result = evaluator.evaluate(
    examples=[...],
    predictions=[...]
)

六、完整项目示例:企业知识问答系统

6.1 项目结构

复制代码
/project
  /data
    policies.pdf
    handbook.docx
  /vector_store
    faiss_index
  app.py
  config.py

6.2 可部署的FastAPI服务

python 复制代码
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Query(BaseModel):
    question: str

@app.post("/ask")
async def ask_question(query: Query):
    result = qa_chain.invoke({"query": query.question})
    return {
        "answer": result["result"],
        "sources": [doc.metadata["source"] for doc in result["source_documents"]]
    }

七、常见问题解决方案

7.1 高频问题排查

  1. 检索结果不相关

    • 调整chunk_size(300-1000之间)
    • 尝试不同的embedding模型
    • 添加元数据过滤
  2. 回答质量差

    • 优化prompt模板
    • 限制回答长度 max_tokens=500
    • 添加few-shot示例
  3. 处理长文档

    • 使用chain_type="map_reduce"
    • 实现分级检索(先检索章节,再检索内容)

7.2 扩展方向

  • 多模态RAG:支持图片/表格检索
  • 实时知识更新:自动同步最新文档
  • 多轮对话:结合对话历史优化检索
  • 权限控制:基于用户角色的知识过滤

最佳实践建议

  1. 从少量高质量文档开始验证流程
  2. 构建评估集量化系统表现
  3. 实现自动化知识库更新机制
  4. 添加用户反馈收集环节

完整代码示例可参考:[GitHub仓库链接](此处替换为实际仓库地址)

相关推荐
失散139 分钟前
自然语言处理——02 文本预处理(下)
人工智能·自然语言处理
mit6.82433 分钟前
[1Prompt1Story] 滑动窗口机制 | 图像生成管线 | VAE变分自编码器 | UNet去噪神经网络
人工智能·python
sinat_2869451937 分钟前
AI应用安全 - Prompt注入攻击
人工智能·安全·prompt
迈火2 小时前
ComfyUI-3D-Pack:3D创作的AI神器
人工智能·gpt·3d·ai·stable diffusion·aigc·midjourney
Moshow郑锴3 小时前
机器学习的特征工程(特征构造、特征选择、特征转换和特征提取)详解
人工智能·机器学习
CareyWYR3 小时前
每周AI论文速递(250811-250815)
人工智能
AI精钢3 小时前
H20芯片与中国的科技自立:一场隐形的博弈
人工智能·科技·stm32·单片机·物联网
whaosoft-1434 小时前
51c自动驾驶~合集14
人工智能
Jinkxs4 小时前
自动化测试的下一站:AI缺陷检测工具如何实现“bug提前预警”?
人工智能·自动化
小幽余生不加糖4 小时前
电路方案分析(二十二)适用于音频应用的25-50W反激电源方案
人工智能·笔记·学习·音视频