示例代码如下:
import osfrom dotenv import load_dotenvfrom langchain_community.document_loaders import PyPDFLoaderfrom langchain_text_splitters import RecursiveCharacterTextSplitterfrom langchain_community.embeddings import DashScopeEmbeddingsfrom langchain_chroma import Chromafrom langchain_openai import ChatOpenAIfrom langchain.chains import create_retrieval_chainfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.runnables import RunnablePassthrough# ======================# 1. 加载环境变量# ======================load_dotenv()DASHSCOPE_API_KEY = os.getenv("DASHSCOPE_API_KEY")if not DASHSCOPE_API_KEY :raise ValueError("请在 .env 文件中设置 DASHSCOPE_API_KEY ")# ======================# 2. 加载 PDF,读者可以随便找一个PDF格式的英文论文# ======================file_path = "example_data/2401.03568v2.pdf"if not os.path.exists(file_path):raise FileNotFoundError(f"PDF 文件不存在: {file_path}")loader = PyPDFLoader(file_path)docs = loader.load()print("页数:", len(docs))# ======================# 3. 文本切分 + 向量化# ======================text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000,chunk_overlap=200)splits = text_splitter.split_documents(docs)embeddings = DashScopeEmbeddings(model="text-embedding-v2",dashscope_api_key=DASHSCOPE_API_KEY)vectorstore = Chroma.from_documents(documents=splits,embedding=embeddings,persist_directory="./chroma_db")retriever = vectorstore.as_retriever(search_kwargs={"k": 4})# ======================# 4. LLM(通义千问)# ======================llm = ChatOpenAI(model="qwen-plus",base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",api_key=os.getenv("DASHSCOPE_API_KEY"),temperature=0)# ======================# 5. RAG Prompt & Chain# ======================system_prompt = ("你是用于问答任务的助手。""请仅使用以下检索到的上下文回答问题。""如果你不知道答案,请直接说“我不知道”。""最多使用三句话,保持回答简洁。""\n\n{context}")prompt = ChatPromptTemplate.from_messages([("system", system_prompt),("human", "{input}")])question_answer_chain = (RunnablePassthrough.assign(context=lambda x: retriever.invoke(x["input"]))| prompt| llm| StrOutputParser())rag_chain = create_retrieval_chain(retriever, question_answer_chain)# ======================# 6. 执行问答# ======================query = "What is AGENT AI?"result = rag_chain.invoke({"input": query})print("\n=== 回答 ===")print(result["answer"])# ======================# 7. 翻译检索到的上下文# ======================def translate_to_chinese(text: str) -> str:translation_prompt = f"请将以下英文内容翻译成中文:\n{text}"return llm.invoke(translation_prompt).content.strip()if result.get("context"):first_doc = result["context"][0]print("\n=== 原文片段 ===")print(first_doc.page_content[:500])print("\n=== 中文翻译 ===")translated = translate_to_chinese(first_doc.page_content)print(translated)
示例运行结果:
C:\Users\xiayu\miniconda3\envs\langchain03\python.exe C:\Users\xiayu\PyCharmMiscProject\LangChain官方示例代码学习\RAG\构建一个PDF摄取和问答系统.py页数: 80=== 回答 ===AGENT AI is an emerging paradigm toward Artificial General Intelligence (AGI) that enables systems to perceive and act across different domains and applications. It emphasizes multimodal understanding—integrating text, vision, and other modalities—and supports embodied interaction in both physical and virtual worlds. AGENT AI leverages large foundation models trained on cross-reality data to enable capabilities like planning, problem-solving, and learning in complex environments.=== 原文片段 ===AGENT AI:SURVEYING THE HORIZONS OF MULTIMODAL INTERACTIONZane Durante1†*, Qiuyuan Huang2‡∗, Naoki Wake2∗,Ran Gong3†, Jae Sung Park4†, Bidipta Sarkar1†, Rohan Taori1†, Yusuke Noda5,Demetri Terzopoulos3, Yejin Choi4, Katsushi Ikeuchi2, Hoi Vo5, Li Fei-Fei1, Jianfeng Gao21Stanford University; 2Microsoft Research, Redmond;3University of California, Los Angeles; 4University of Washington; 5Microsoft GamingFigure 1: Overview of an Agent AI system that can perceive and act in different domains a=== 中文翻译 ===智能体人工智能(Agent AI):多模态交互前沿探索扎恩·杜兰特¹†*,黄秋媛²‡∗,直树·若江²∗,龚然³†,朴在成⁴†,比迪普塔·萨卡尔¹†,罗汉·塔奥里¹†,野田祐介⁵,德米特里·特尔佐普洛斯³,崔世英⁴,池内克之²,何浩⁵,李飞飞¹,高剑峰²¹斯坦福大学;²微软研究院(雷德蒙德);³加州大学洛杉矶分校;⁴华盛顿大学;⁵微软游戏部门图1:一种可感知并作用于不同领域与应用场景的智能体人工智能(Agent AI)系统概览。智能体AI正日益成为通向通用人工智能(AGI)的一条极具前景的路径。面向智能体的训练已展现出对物理世界进行多模态理解的能力。该范式通过融合生成式人工智能与多个独立的数据源,构建起一种“现实无关”(reality-agnostic)的训练框架。当大型基础模型在跨现实(cross-reality)数据上完成针对智能体行为与动作任务的训练后,即可同时适用于物理世界与虚拟世界。本文将阐述……Process finished with exit code 0
示例代码流程

环境与安全配置
from dotenv import load_dotenvload_dotenv()从 .env文件加载环境变量避免 API Key 硬编码:DASHSCOPE_API_KEY=sk-xxx、OPENAI_API_KEY=sk-xxx 虽然用的是 Qwen,但 LangChain 的 ChatOpenAI接口仍需要 api_key
PDF 文档加载
loader = PyPDFLoader("example_data/2401.03568v2.pdf")docs = loader.load()概念 | 说明 |
|---|---|
| 按页读取 PDF |
| List[Document] |
| 包含 |
文本切分(非常关键)
text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, chunk_overlap=200)splits = text_splitter.split_documents(docs)Embedding 模型有 token 长度限制 检索精度更高 减少幻觉
参数 | 含义 |
|---|---|
| 每个文本块最大字符数 |
| 相邻块重叠,防止切断语义 |
向量化(Embedding)
embeddings = DashScopeEmbeddings( model="text-embedding-v2", dashscope_api_key=DASHSCOPE_API_KEY)把文本 → 高维向量 用于 语义相似度搜索,等价于 OpenAI 的:text-embedding-ada-002、text-embedding-3-large
向量数据库(Chroma)
vectorstore = Chroma.from_documents( documents=splits, embedding=embeddings, persist_directory="./chroma_db")步骤 | 说明 |
|---|---|
对每个 chunk | 生成 embedding |
存入 Chroma | 本地向量数据库 |
持久化 | 下次不用重新建 |
Retriever(检索器)
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})用户输入问题 把问题转成向量 找 最相似的 4 个 chunk,k=4是经验值,可调整
LLM(通义千问)
llm = ChatOpenAI( model="qwen-plus", base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", api_key=OPENAI_API_KEY, temperature=0)使用temperature=0能做到RAG 场景 稳定、确定,避免“自由发挥”
Prompt 设计(RAG 的灵魂)
system_prompt = ( "你是用于问答任务的助手。" "请仅使用以下检索到的上下文回答问题。" "如果你不知道答案,请直接说“我不知道”。" "最多使用三句话,保持回答简洁。" "\n\n{context}")Prompt 的核心约束:限制知识来源、限制回答长度、抑制幻觉
RAG Chain(LCEL 写法)
question_answer_chain = ( RunnablePassthrough.assign( context=lambda x: retriever.invoke(x["input"]) ) | prompt | llm | StrOutputParser())执行流程拆解(这是 LangChain 官方推荐的 LCEL 写法)
输入 {"input": "..."} ↓RunnablePassthrough.assign ↓retriever.invoke → context ↓prompt.format(context=..., input=...) ↓llm.generate ↓StrOutputParser → 字符串create_retrieval_chain
rag_chain = create_retrieval_chain(retriever, question_answer_chain)这行代码完成:检索、拼接上下文、调用 QA Chain、返回结构化结果。返回结构如下:
{ "input": "...", "context": [Document, ...], "answer": "..."}执行问答
result = rag_chain.invoke({"input": "What is AGENT AI?"})print(result["answer"])回答来自 PDF 内容,不是 LLM 的“记忆”
翻译模块解析
def translate_to_chinese(text: str) -> str: translation_prompt = f"请将以下英文内容翻译成中文:\n{text}" return llm.invoke(translation_prompt).content.strip()为什么用 LLM 翻译?学术术语更准确、上下文感知、比传统翻译 API 更适合论文


夜雨聆风