开启AI大模型应用开发新篇:LangChain打造RAG增强检索生成

开启AI大模型应用开发的新篇章:LangChain助力RAG增强检索生成

检索增强生成(RAG)是一种将“向量检索”和“大语言模型”相结合的技术途径,能在问答、摘要、文档分析等场景中极大提升准确性与上下文的利用率。

本文将基于 LangChain 构建完整的 RAG 流程,结合 PGVector 作为向量数据库,并用 LangGraph 构建状态图来控制流程。

大语言模型初始化(llm_env.py)

我们首先运用 LangChain 提供的模型初始化器来加载 gpt-4o-mini 模型,供后续的问答使用。

# llm_env.py
from langchain.chat_models import init_chat_model

llm = init_chat_model("gpt-4o-mini", model_provider="openai")

RAG主体流程(rag.py)

以下是整个 RAG 系统的主流程代码,主要包含:文档的加载与切分、向量的存储、状态图的建模(analyze→retrieve→generate)、交互式问答。

# rag.py
import os
import sys
import time

sys.path.append(os.getcwd())

from llm_set import llm_env
from langchain_openai import OpenAIEmbeddings
from langchain_postgres import PGVector
from langchain_community.document_loaders import WebBaseLoader
from langchain_core.documents import Document
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langgraph.graph import START, StateGraph
from typing_extensions import List, TypedDict, Annotated
from typing import Literal
from langgraph.checkpoint.postgres import PostgresSaver
from langgraph.graph.message import add_messages
from langchain_core.messages import HumanMessage, BaseMessage
from langchain_core.prompts import ChatPromptTemplate

# 初始化 LLM
llm = llm_env.llm

# 嵌入模型
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")

# 向量数据库初始化
vector_store = PGVector(
    embeddings=embeddings,
    collection_name="my_rag_docs",
    connection="postgresql+psycopg2://postgres:123456@localhost:5433/langchainvector",
)

# 加载网页内容
url = "https://python.langchain.com/docs/tutorials/qa_chat_history/"
loader = WebBaseLoader(web_paths=(url,))
docs = loader.load()
for doc in docs:
    doc.metadata["source"] = url

# 文本分割
text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=50)
all_splits = text_splitter.split_documents(docs)

# 添加 section 元数据
total_documents = len(all_splits)
third = total_documents // 3
for i, document in enumerate(all_splits):
    if i < third:
        document.metadata["section"] = "beginning"
    elif i < 2 * third:
        document.metadata["section"] = "middle"
    else:
        document.metadata["section"] = "end"

# 检查是否已存在向量
existing = vector_store.similarity_search(url, k=1, filter={"source": url})
if not existing:
    _ = vector_store.add_documents(documents=all_splits)
    print("文档向量化完成")

分析、检索与生成模块

接下来,定义三个函数来构成 LangGraph 的流程:analyze → retrieve → generate。

class Search(TypedDict):
    query: Annotated[str, "The question to be answered"]
    section: Annotated[
        Literal["beginning", "middle", "end"],
        ...,
        "Section to query.",
    ]

class State(TypedDict):
    messages: Annotated[list[BaseMessage], add_messages]
    query: Search
    context: List[Document]
    answer: set

# 分析意图 → 获取 query 与 section
def analyze(state: State):
    structtured_llm = llm.with_structured_output(Search)
    query = structtured_llm.invoke(state["messages"])
    return {"query": query}

# 相似度检索
def retrieve(state: State):
    query = state["query"]
    if hasattr(query, 'section'):
        filter = {"section": query["section"]}
    else:
        filter = None
    retrieved_docs = vector_store.similarity_search(query["query"], filter=filter)
    return {"context": retrieved_docs}

生成模块基于 ChatPromptTemplate 和当前上下文生成回答:

prompt_template = ChatPromptTemplate.from_messages(
    [
        ("system", "尽你所能按照上下文:{context},回答问题:{question}。"),
    ]
)

def generate(state: State):
    docs_content = "\n\n".join(doc.page_content for doc in state["context"])
    messages = prompt_template.invoke({
        "question": state["query"]["query"],
        "context": docs_content,
    })
    response = llm.invoke(messages)
    return {"answer": response.content, "messages": [response]}

构建 LangGraph 流程图

定义好状态结构后,构建 LangGraph

graph_builder = StateGraph(State).add_sequence([analyze, retrieve, generate])
graph_builder.add_edge(START, "analyze")

PG 数据库中保存中间状态(Checkpoint)

通过 PostgresSaver 记录每次对话的中间状态:

DB_URI = "postgresql://postgres:123456@localhost:5433/langchaindemo?sslmode=disable"

with PostgresSaver.from_conn_string(DB_URI) as checkpointer:
    checkpointer.setup()
    graph = graph_builder.compile(checkpointer=checkpointer)
    input_thread_id = input("输入thread_id:")
    time_str = time.strftime("%Y%m%d", time.localtime())
    config = {"configurable": {"thread_id": f"rag-{time_str}-demo-{input_thread_id}"}}

    print("输入问题,输入 exit 退出。")
    while True:
        query = input("你: ")
        if query.strip().lower() == "exit":
            break
        input_messages = [HumanMessage(query)]
        response = graph.invoke({"messages": input_messages}, config=config)
        print(response["answer"])

效果

https://img2024.cnblogs.com/blog/1033233/202506/1033233-20250614200640651-1807995002.png

总结

本文借助 LangChain 的模块能力,结合 PGVector 向量库与 LangGraph 有状态控制系统,搭建起一个可交互、可持久化且支持多文档结构的 RAG 系统。其优势包括:

  • 支持结构化提问理解(分区查询)

  • 自动化分段与元数据标记

  • 状态流追踪与恢复

  • 可拓展支持文档上传、缓存优化、多用户配置

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/12615.html

(0)
LomuLomu
上一篇 2025 年 6 月 23 日
下一篇 2025 年 6 月 23 日

相关推荐

  • 无需邀请码申领clion激活码,超详细clion破解教程

    申明:本教程Clion破解补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 ! 废话不多说,先上 Clion2025.2.1 版本破解成功的截图,如下图,可以看到已经成功破解到 2099 年辣,舒服的很! 接下来就给大家通过图文的方式分享一下如何破解最新的Clion。 准备工作 注意:如果你之前用过…

    2025 年 12 月 17 日
    3200
  • 永久pycharm激活码免费领取与最新pycharm破解说明

    申明:本教程 PyCharm破解补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 ! PyCharm是 JetBrains 推出的开发编辑器,功能强大,适用于 Windows、Mac 和 Linux 系统。本文将详细介绍如何通过破解补丁实现永久激活,解锁所有高级功能。 不管你是什么版本、什么操作系统…

    PyCharm激活码 4天前
    2100
  • 实测有效官方pycharm激活码和全流程破解教程

    本教程适用于IDEA、PyCharm、DataGrip、Goland等,支持Jetbrains全家桶! 先放一张最新版 PyCharm 成功激活到 2099 年的截图镇楼,爽到飞起! 下面用图文详解,手把手带你把 PyCharm 一口气激活到 2099 年。老版本同样适用,Win / macOS / Linux 全平台通杀,成功率 100%! 嫌折腾?直接买…

    PyCharm激活码 2025 年 10 月 23 日
    25200
  • IDEA激活工具详细使用教程,支持全平台激活!

    声明:以下激活补丁与序列号均搜集自互联网,仅供个人学习研究,禁止商业用途。若条件允许,请支持正版 JetBrains! 废话少说,先放一张 2025.2.1 版本激活成功的截图,有效期直接拉到 2099 年,爽翻! 接下来用图文方式手把手教你把最新版 IDEA 解锁到 2099。 嫌折腾?官方正版全家桶账号低至 32 元/年,一键登录即用:https://p…

    IDEA破解教程 2025 年 9 月 19 日
    16800
  • 2024 DataGrip最新激活码,DataGrip永久免费激活码2025-02-05 更新

    DataGrip 2024最新激活码 以下是最新的DataGrip激活码,更新时间:2025-02-05 🔑 激活码使用说明 1️⃣ 复制下方激活码 2️⃣ 打开 DataGrip 软件 3️⃣ 在菜单栏中选择 Help -> Register 4️⃣ 选择 Activation Code 5️⃣ 粘贴激活码,点击 Activate ⚠️ 必看!必看! 🔥 …

    2025 年 2 月 5 日
    45100

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信