跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI

基于 LangChain 快速搭建 RAG 知识库实战

基于 LangChain 和 FastAPI 搭建 RAG(检索增强生成)知识库的完整流程。内容涵盖 RAG 技术原理、文档加载与切片、向量数据库构建、Prompt 设计及代码实现。通过具体示例展示了如何快速构建一个支持自然语言问答的服务端,并提供了环境依赖、QA 组织方式及测试方法。文章最后总结了知识库动态更新、混合检索、系统扩展性等优化方向,旨在帮助开发者高效利用大模型能力解决垂直领域的知识问答问题。

宁静发布于 2025/2/7更新于 2026/7/2346 浏览
基于 LangChain 快速搭建 RAG 知识库实战

背景

在日常工作中,对接第三方合作方时往往面临文档繁多、沟通不及时、问题排查繁琐以及工作重复性高等挑战。传统的工单处理模式(门户网站->产品部门->开发人员->回复)流程较长,效率较低。

如何利用前期积累的问题日志、对接规范、指导手册和接口文档,让开发、产品及合作方有效获取知识?大模型具备强大的自然语言理解和文档整理能力,但缺乏垂类领域知识。RAG(检索增强生成技术)恰好能在大模型与私有知识库之间建立桥梁,实现精准问答。

1. RAG 技术介绍

RAG (Retrieval-Augmented Generation) 是一种结合了检索和生成的混合式深度学习模型,常用于处理复杂的自然语言处理任务。RAG 模型通过将外部知识库中的信息与生成模型结合在一起,可以提供更准确和上下文相关的答案。具体来说,RAG 由两个部分组成:

  1. 检索模块:负责从预先建立的知识库中检索与输入问题最相关的文档或信息片段。这通常通过向量检索技术实现,支持语义匹配,提高了检索的准确性。
  2. 生成模块:接收检索到的内容并生成最终的自然语言响应。该模块通常基于大型生成模型(如 GPT-4),能够理解和生成复杂的自然语言。

这种技术的优势在于利用海量外部数据进行知识补充,提升回答质量和准确性,特别适用于动态性强、知识库更新频繁的场景。

2. RAG 搭建常见流程

在实际应用中,搭建一个基于 RAG 的知识库通常包括以下几个步骤:

  1. 文档加载,并按一定条件切割成片段;
  2. 将切割的文本片段灌入向量数据库;
  3. 封装检索接口;
  4. 构建调用流程:Query -> 检索 -> Prompt -> LLM -> 回复。

3. 编码实现

下面使用极少的代码快速搭建一个 RAG 系统,包括服务端和 Web 界面,仅用于 Demo 展示。生产级的 RAG 系统会更加复杂。

项目结构

项目结构

核心代码

如果纯自己编码实现 RAG,可能需要上千行代码。这里借助成熟的大模型开发框架来简化开发过程,把重心放到流程上。本例使用了 LangChain,关键代码已添加注释。

LangChain:一套在大模型能力上封装的工具框架(SDK),为开发者提供了一系列工具和组件,以简化语言模型在复杂任务中的集成和应用。

import uvicorn
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from dotenv import load_dotenv, find_dotenv
 langchain_community.document_loaders  TextLoader
 langchain_text_splitters  RecursiveCharacterTextSplitter
 langchain.prompts  ChatPromptTemplate
 starlette.middleware.cors  CORSMiddleware


_ = load_dotenv(find_dotenv())


llm = ChatOpenAI(model=, temperature=)


loader = TextLoader(, encoding=)
documents = loader.load()


text_splitter = RecursiveCharacterTextSplitter.from_language(language=, chunk_size=, chunk_overlap=)
texts = text_splitter.create_documents(
    [documents[].page_content]
)


db = FAISS.from_documents(texts, OpenAIEmbeddings(model=))

retriever = db.as_retriever(search_kwargs={: })


prompt_template = ChatPromptTemplate.from_messages([
    (, ),
    (, )
])


chain_type_kwargs = {
    : prompt_template,
}


qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type=,  
    chain_type_kwargs=chain_type_kwargs,
    retriever=retriever
)


app = FastAPI()


app.add_middleware(
    CORSMiddleware,
    allow_origins=[],
    allow_credentials=,
    allow_methods=[],
    allow_headers=[],
)


 ():
    question: 


 ():
    answer: 



  ():
    :
        user_question = request.question
        (user_question)

        
        answer = qa_chain.run(user_question)

        
         AnswerResponse(answer=answer)
     Exception  e:
         HTTPException(status_code=, detail=(e))

 __name__ == :
    uvicorn.run(app, host=, port=)
from
import
from
import
from
import
from
import
# 加载环境变量,读取本地 .env 文件,里面定义了 OPENAI_API_KEY
# 初始化 LLM
"gpt-4o-mini"
0
# 加载文档,可换成 PDF、txt、doc 等其他格式文档
'../docs/解答手册.md'
'utf-8'
# 文本分割
"markdown"
200
0
0
# 选择向量模型,并灌库
"text-embedding-ada-002"
# 获取检索器,选择 top-2 相关的检索结果
"k"
2
# 创建带有 system 消息的模板
"system"
"""你是一个对接问题排查机器人。 你的任务是根据下述给定的已知信息回答用户问题。 确保你的回复完全依据下述已知信息。不要编造答案。 请用中文回答用户问题。 已知信息: {context} """
"user"
"{question}"
# 自定义的提示词参数
"prompt"
# 定义 RetrievalQA 链
"stuff"
# 使用 stuff 模式将上下文拼接到提示词中
# 构建 FastAPI 应用,提供服务
# 可选,前端报 CORS 时
'*'
True
'*'
'*'
# 定义请求模型
class
QuestionRequest
BaseModel
str
# 定义响应模型
class
AnswerResponse
BaseModel
str
# 提供查询接口 http://127.0.0.1:8000/ask
@app.post("/ask", response_model=AnswerResponse)
async
def
ask_question
request: QuestionRequest
try
print
# 通过 RAG 链生成回答
# 返回答案
return
except
as
raise
500
str
if
"__main__"
"0.0.0.0"
8000
运行环境

代码采用 Python 3.11 版本运行,依赖如下:

fastapi==0.112.1
langchain==0.2.14
langchain_community==0.2.12
langchain_openai==0.1.22
langchain_text_splitters==0.2.2
pydantic==2.8.2
python-dotenv==1.0.1
Requests==2.32.3
starlette==0.38.2
uvicorn==0.30.6
QA 准备

按照熟悉的文档组织方式组织 QA,并按照业务需求选择是将 Q 向量化,还是将 QA 一起向量化。本例采用如下格式组织 QA,并且 QA 一起向量化。

### xx 接口不通怎么办
请首先确认接口地址以及鉴权参数,可找相关负责人进行排查
效果展示

简陋的客户端界面示例:

效果展示

咨询知识库存在的知识:

存在知识

咨询知识库不存在的知识:

不存在知识

4. 总结与优化点

以上只是搭建基于 RAG 知识库的最基本步骤,实际应用时有几点优化建议:

  1. 知识库的动态更新:设计自动化的知识更新机制,以保证系统回答的准确性和时效性。
  2. 模型微调:在不同的应用场景中,可能需要对调用的模型进行选择,或者对提示词进行优化,引导模型生成更符合预期的输出。
  3. 混合检索策略:结合向量检索与传统的关键词检索策略,在保证检索精度的同时,提高召回率。
  4. 系统可扩展性:确保系统能够随着数据量和请求量的增加而扩展,避免性能瓶颈。使用分布式检索和生成技术是实现这一目标的关键。
  5. 用户反馈循环:引入用户反馈机制,定期分析用户的查询和系统的响应,持续改进模型和知识库。

5. 测试与部署

完成代码编写后,可以通过以下方式测试服务:

  1. 启动服务:python main.py 或 uvicorn main:app --reload
  2. 使用 curl 命令测试:
    curl -X POST http://127.0.0.1:8000/ask \
      -H "Content-Type: application/json" \
      -d '{"question": "接口不通怎么办?"}'
    
  3. 前端接入:通过 Fetch API 或 Axios 调用 /ask 接口,将用户输入传递给后端,并渲染返回的 answer 字段。

在生产环境中,建议将 .env 文件加入 .gitignore,配置 Nginx 反向代理,并启用 HTTPS 加密传输,确保数据安全。

目录

  1. 背景
  2. 1. RAG 技术介绍
  3. 2. RAG 搭建常见流程
  4. 3. 编码实现
  5. 项目结构
  6. 核心代码
  7. 加载环境变量,读取本地 .env 文件,里面定义了 OPENAIAPIKEY
  8. 初始化 LLM
  9. 加载文档,可换成 PDF、txt、doc 等其他格式文档
  10. 文本分割
  11. 选择向量模型,并灌库
  12. 获取检索器,选择 top-2 相关的检索结果
  13. 创建带有 system 消息的模板
  14. 自定义的提示词参数
  15. 定义 RetrievalQA 链
  16. 构建 FastAPI 应用,提供服务
  17. 可选,前端报 CORS 时
  18. 定义请求模型
  19. 定义响应模型
  20. 提供查询接口 http://127.0.0.1:8000/ask
  21. 运行环境
  22. QA 准备
  23. xx 接口不通怎么办
  24. 效果展示
  25. 4. 总结与优化点
  26. 5. 测试与部署
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 数据结构详解:选择排序原理与 Java 实现
  • 基于 ChatGPT 构建电商客服问答系统
  • 智慧企业为何选择大模型重塑客服体系
  • 基于 Coze 平台从零搭建企业级 AI 客服机器人实战指南
  • 13 篇大模型前沿论文精选:推理、视频与医疗应用
  • Qt Creator 配置 GitHub Copilot 插件实战指南
  • 智能桌面机器人快速搭建指南:ElectronBot 项目实践
  • RAFT 光流估计算法深度解析与实践指南
  • Python 爬虫抓取企业年报与财务报告技术实现
  • 昇腾 910B 部署 Llama-2-7b 大模型深度测评与方案
  • C++ 备忘录模式:一个可撤销状态的实现与权衡
  • Webmin CVE-2019-15107 漏洞深度解析:从后门到修复
  • 网络安全基础教程:概念、加密与攻击防护
  • Linux 进程间通信进阶:管道与共享内存详解
  • 基于 Kaggle 免费环境体验 Stable Diffusion AI 绘画入门
  • 前后端分离与不分离架构对比分析
  • RunningHub:基于开源生态的图形音视频 AIGC 平台解析
  • Spring 嵌入式内存数据库选型:H2、Derby 与 HSQL 对比
  • WebGIS + 无人机 + AI:下一代智能巡检系统
  • Linux 下 Tomcat 通过内网穿透实现 Web 应用公网访问

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online