【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 回答
执行流程简述
-
加载 PDF:
使用PyPDFLoader
加载 PDF 文档,并按页分割。 -
切割文本:
用RecursiveCharacterTextSplitter
把每页内容切成更小的段落,便于后续嵌入处理。 -
生成向量:
用OpenAIEmbeddings
将切片转为向量,存入Chroma
向量数据库中。 -
设置检索器:
配置Retriever
,通过相似度筛选出与用户问题相关的 3~5 个段落。 -
构造提示词 Prompt:
将检索结果拼成一段“已知信息”,插入到提示词模板中。 -
调用大模型回答:
使用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段:
①为什么要参加考级?学生的角度:机器人等级考试是一个见证孩子成
长的过程,是对孩子一段时间学习成果的检验,
也是给孩子们提供了一个展示自我的平台,通过
与同龄人之间的比较,开阔自己的视野;同时锻
炼同学们线上 / 线下考试的临场发挥能力,对于以
后参加考试或者比赛积累经验;通过考试还可以
增加同学们的信心,增强自信,获取成就感,为
长期学习机器人课程助力。
====================================================================
提示词为:你是一个问答机器人。
你的任务是根据下述给定的已知信息回答用户问题。
确保你的回复完全依据下述已知信息。不要编造答案。
如果下述已知信息不足以回答用户的问题,请直接回复"我无法回答您的问题"。已知信息:
①为什么要参加考级?学生的角度:机器人等级考试是一个见证孩子成
长的过程,是对孩子一段时间学习成果的检验,
也是给孩子们提供了一个展示自我的平台,通过
与同龄人之间的比较,开阔自己的视野;同时锻
炼同学们线上 / 线下考试的临场发挥能力,对于以
后参加考试或者比赛积累经验;通过考试还可以
增加同学们的信心,增强自信,获取成就感,为
长期学习机器人课程助力。用户问:
考级有什么用请用中文回答用户问题。====================================================================
语言大模型:
参加考级有助于见证孩子的成长过程,是对他们一段时间学习成果的检验,并提供展示自我的平台。通过与同龄人的比较,孩子们可以开阔视野,锻炼线上线下考试的临场发挥能力,为以后参加考试或比赛积累经验。此外,考级可以增加孩子们的信心,增强自信,获取成就感,为长期学习机器人课程助力。