当前位置: 首页 > news >正文

【Langchain】构建RAG基本流程

目录

一、总体流程 

二、LangChain PDF 问答执行流程

2.1 加载环境变量(如 API Key)

2.2  加载 PDF 文档并按页解析

2.3  文本切割(将每页切成小段用于向量化)

2.4  嵌入生成 + 向量存储(使用 OpenAIEmbeddings + Chroma)

2.5  设置向量检索器(基于相似度+限制最多返回K条)

 2.6 用户提问 → 检索相关内容

 2.8 调用大语言模型回答问题

三、完整代码流程



 这是一个基于 LangChain 的 PDF 问答系统,支持加载 PDF 文档,将内容切割后生成向量索引,用户提问时通过语义检索获取相关内容,并调用大语言模型(如 GPT-4o)在检索结果基础上准确回答问题。系统具备高效检索、智能问答和防止幻觉的能力。

一、总体流程 

PDF → 分页 → 切段 → 嵌入 → 向量存储
                                        ↓
                                  用户提问 → 相似片段检索 → 拼 prompt → GPT 回答 

执行流程简述

  1. 加载 PDF:
    使用 PyPDFLoader 加载 PDF 文档,并按页分割。

  2. 切割文本:
    RecursiveCharacterTextSplitter 把每页内容切成更小的段落,便于后续嵌入处理。

  3. 生成向量:
    OpenAIEmbeddings 将切片转为向量,存入 Chroma 向量数据库中。

  4. 设置检索器:
    配置 Retriever,通过相似度筛选出与用户问题相关的 3~5 个段落。

  5. 构造提示词 Prompt:
    将检索结果拼成一段“已知信息”,插入到提示词模板中。

  6. 调用大模型回答:
    使用 ChatOpenAI(如 GPT-4o)输入 Prompt,生成回答并输出。


二、LangChain PDF 问答执行流程

2.1 加载环境变量(如 API Key)

from dotenv import load_dotenv
load_dotenv()

2.2  加载 PDF 文档并按页解析

from langchain_community.document_loaders import PyPDFLoaderloader = PyPDFLoader("你的PDF路径.pdf")
pages = loader.load_and_split()

2.3  文本切割(将每页切成小段用于向量化)

from langchain.text_splitter import RecursiveCharacterTextSplittertext_splitter = RecursiveCharacterTextSplitter(chunk_size=200,chunk_overlap=100,add_start_index=True
)paragraphs = []
for page in pages:paragraphs.extend(text_splitter.create_documents([page.page_content]))

2.4  嵌入生成 + 向量存储(使用 OpenAIEmbeddings + Chroma)

from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chromaembedding = OpenAIEmbeddings()
db = Chroma.from_documents(paragraphs, embedding)

 


2.5  设置向量检索器(基于相似度+限制最多返回K条)

retriever = db.as_retriever(search_type="similarity_score_threshold",search_kwargs={"score_threshold": 0.3,"k": 4}
)

 2.6 用户提问 → 检索相关内容

query = "孩子考级有什么用?"
docs = retriever.invoke(query)info_text = "\n".join([doc.page_content for doc in docs])

2.7 构造提示词 Prompt

from langchain.prompts import PromptTemplateprompt_template = """
你是一个问答机器人。
你的任务是根据下述给定的已知信息回答用户问题。
确保你的回复完全依据下述已知信息。不要编造答案。
如果下述已知信息不足以回答用户的问题,请直接回复"我无法回答您的问题"。已知信息:
{info}用户问:
{question}请用中文回答用户问题。
"""prompt = PromptTemplate.from_template(prompt_template).format(info=info_text,question=query
)

 2.8 调用大语言模型回答问题

from langchain_openai import ChatOpenAIllm = ChatOpenAI(model_name="gpt-4o")
response = llm.invoke(prompt)print(response.content)

 

三、完整代码流程

from dotenv import load_dotenv
load_dotenv()
from langchain_community.document_loaders import PyPDFLoader#===========1、文档加载===========
loader=PyPDFLoader(r"D:\file\关于中国电子学会考级比较关注的问题!.pdf")
pages=loader.load_and_split()#===========2、文档切割===========
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter=RecursiveCharacterTextSplitter(chunk_size=200,chunk_overlap=100,length_function=len,add_start_index=True
)
paragraph=[]
for page in pages:paragraph.extend(text_splitter.create_documents([page.page_content]))#===========3、向量存储===========
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
embedding=OpenAIEmbeddings()
db=Chroma.from_documents(paragraph,embedding)#===========4、向量检索===========
retriever=db.as_retriever(search_type="similarity_score_threshold",search_kwargs={"score_threshold": 0.3,  # 保证相关性"k": 1                   # 最多返回 1 个相关片段}
)
docs=retriever.invoke("考级有什么用?")for i,doc in enumerate(docs):print("-"*68)print(f"第{i+1}段:")print(doc.page_content)# ===========5、组装提示词===========
from langchain.prompts import PromptTemplateprompt_template = """
你是一个问答机器人。
你的任务是根据下述给定的已知信息回答用户问题。
确保你的回复完全依据下述已知信息。不要编造答案。
如果下述已知信息不足以回答用户的问题,请直接回复"我无法回答您的问题"。已知信息:
{info}用户问:
{question}请用中文回答用户问题。
"""template = PromptTemplate.from_template(prompt_template)# 拼接 info 文本
info_text = "\n".join([doc.page_content for doc in docs])# 构造 prompt
prompt = template.format(info=info_text,question="考级有什么用"
)print("="*68)
print("提示词为:\n", prompt)# ============6、调用语言模型===========
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model_name="gpt-4o")try:res = llm.invoke(prompt)print("\n\n", "="*68)print(f"语言大模型:\n{res.content}")
except Exception as e:print(f"模型调用失败:{e}")

运行结果

--------------------------------------------------------------------
第1段:
①为什么要参加考级?学生的角度:机器人等级考试是一个见证孩子成
长的过程,是对孩子一段时间学习成果的检验,
也是给孩子们提供了一个展示自我的平台,通过
与同龄人之间的比较,开阔自己的视野;同时锻
炼同学们线上 / 线下考试的临场发挥能力,对于以
后参加考试或者比赛积累经验;通过考试还可以
增加同学们的信心,增强自信,获取成就感,为
长期学习机器人课程助力。
====================================================================
提示词为:你是一个问答机器人。
你的任务是根据下述给定的已知信息回答用户问题。
确保你的回复完全依据下述已知信息。不要编造答案。
如果下述已知信息不足以回答用户的问题,请直接回复"我无法回答您的问题"。已知信息:
①为什么要参加考级?学生的角度:机器人等级考试是一个见证孩子成
长的过程,是对孩子一段时间学习成果的检验,
也是给孩子们提供了一个展示自我的平台,通过
与同龄人之间的比较,开阔自己的视野;同时锻
炼同学们线上 / 线下考试的临场发挥能力,对于以
后参加考试或者比赛积累经验;通过考试还可以
增加同学们的信心,增强自信,获取成就感,为
长期学习机器人课程助力。用户问:
考级有什么用请用中文回答用户问题。====================================================================
语言大模型:
参加考级有助于见证孩子的成长过程,是对他们一段时间学习成果的检验,并提供展示自我的平台。通过与同龄人的比较,孩子们可以开阔视野,锻炼线上线下考试的临场发挥能力,为以后参加考试或比赛积累经验。此外,考级可以增加孩子们的信心,增强自信,获取成就感,为长期学习机器人课程助力。

相关文章:

  • QT使用AES加解密,openssl及QCA问题记录
  • 综合笔试知识点
  • 文字转语音
  • 关于汉语普通话元音音位最好归纳为几个的问题
  • 能上Nature封面的idea!强化学习+卡尔曼滤波
  • 【Electron】应用打包教程(包含 C++ 后端 + 前端)
  • Spring AI与Spring Modulith核心技术解析
  • springboot的test模块使用Autowired注入失败
  • 【Linux】Linux进程间通讯-共享内存
  • FSMC扩展外部SRAM
  • Linux Gnome壁纸
  • 言思集交流社区(SpringBoot)
  • Linux中su与sudo命令的区别:权限管理的关键差异解析
  • CMake基础:构建流程详解
  • fast-reid部署
  • Linux 系统、代码与服务器进阶知识深度解析
  • 使用 SAM + YOLO + ResNet 检测工业开关状态:从零到部署
  • CMake检测C编译器标志功能
  • Hash类型
  • html如何在一张图片上的某一个区域做到点击事件
  • 专业做网站方案ppt/网络营销渠道名词解释
  • 网站模板怎么改/长沙百度快速优化
  • 个人网站可以做淘宝客吗/海淀区seo搜索优化
  • 真人视频发牌网站开发/广州网络运营课程培训班
  • 外链代发免费/一键优化清理手机
  • 宜昌 网站建设 公司/优化步骤