
LangChain 快速上手写一个问答机器人系列AI Agent 从入门到实战 | 第 4 篇上一篇我们用 Coze 零代码搭了一个 Agent体验了不写代码也能玩 Agent。从这篇开始我们进入代码世界——用 Python LangChain 搭建一个基于本地文档的问答机器人。你可以把 PDF、TXT 等文件丢给它它会读懂内容然后回答你的问题。一、LangChain 是什么一句话LangChain 是目前最流行的 AI Agent 开发框架。它帮你把 LLM、工具、记忆、文档等组件像搭积木一样组合起来快速构建 Agent 应用。为什么学 LangChain原因说明生态最大GitHub 90K Star社区活跃遇到问题容易找到答案组件丰富内置了大量工具、文档加载器、向量数据库的集成Agent 支持好原生支持 ReAct、Plan-and-Execute 等 Agent 范式中文资料多国内用的人多中文教程和博客很多LangChain 的核心概念在写代码之前先认识几个关键概念LangChain 核心组件 ├── Document Loader文档加载器 │ └── 把 PDF、TXT、网页等加载成文本 │ ├── ✂️ Text Splitter文本分割器 │ └── 把长文本切成小块chunk │ ├── Embedding向量化 │ └── 把文本转换成数字向量方便搜索 │ ├── Vector Store向量数据库 │ └── 存储向量支持相似度搜索 │ ├── Chain链 │ └── 把多个步骤串起来 │ └── LLM大语言模型 └── 核心大脑二、我们要做什么 本地文档问答机器人把一份 PDF 文档比如产品手册、技术文档丢给它它能读懂内容然后你问什么它答什么。工作原理你的问题这个产品的退款政策是什么 │ ▼ ┌──────────────────┐ │ 1. 把问题转成向量 │ └────────┬─────────┘ ▼ ┌──────────────────┐ │ 2. 去向量数据库里 │ │ 找最相关的片段 │ └────────┬─────────┘ ▼ ┌──────────────────┐ │ 3. 把问题相关片段 │ │ 一起交给 LLM │ └────────┬─────────┘ ▼ ┌──────────────────┐ │ 4. LLM 基于文档 │ │ 内容生成回答 │ └──────────────────┘ │ ▼ 回答根据文档退款政策是购买后 7 天内可无理由退款……这就是RAG检索增强生成的典型应用。三、环境准备第 1 步安装 Python需要 Python 3.9 以上版本。检查一下python--version如果没有 Python去官网下载https://www.python.org/downloads/第 2 步创建项目并安装依赖# 创建项目文件夹mkdirlangchain-qa-botcdlangchain-qa-bot# 创建虚拟环境推荐python-mvenv venv# 激活虚拟环境# Windows:venv\Scripts\activate# Mac/Linux:sourcevenv/bin/activate# 安装依赖pipinstalllangchain langchain-community langchain-openai pipinstallchromadb pypdf tiktoken第 3 步准备 API KeyLangChain 需要一个大模型的 API Key。这里以 OpenAI 为例去 https://platform.openai.com/api-keys 申请 API Key设置环境变量# Windows PowerShell:$env:OPENAI_API_KEYsk-你的key# Mac/Linux:exportOPENAI_API_KEYsk-你的key国内替代方案如果你用不了 OpenAI可以用通义千问、文心一言、智谱等国产模型LangChain 都支持。文末附有国产模型的配置方法。四、开始写代码完整代码创建文件qa_bot.py把下面的代码复制进去 本地文档问答机器人 基于 LangChain ChromaDB OpenAI fromlangchain_community.document_loadersimportPyPDFLoader,TextLoaderfromlangchain.text_splitterimportRecursiveCharacterTextSplitterfromlangchain_community.embeddingsimportOpenAIEmbeddingsfromlangchain_community.vectorstoresimportChromafromlangchain_openaiimportChatOpenAIfromlangchain.chainsimportRetrievalQAfromlangchain.promptsimportPromptTemplateimportos# 第 1 步加载文档 defload_documents(file_path:str):加载文档支持 PDF 和 TXTiffile_path.endswith(.pdf):loaderPyPDFLoader(file_path)eliffile_path.endswith(.txt):loaderTextLoader(file_path,encodingutf-8)else:raiseValueError(f不支持的文件格式:{file_path})documentsloader.load()print(f✅ 成功加载文档共{len(documents)}页)returndocuments# 第 2 步分割文本 defsplit_documents(documents):把长文档切成小块text_splitterRecursiveCharacterTextSplitter(chunk_size500,# 每块最多 500 个字符chunk_overlap50,# 相邻块重叠 50 个字符保证上下文连贯separators[\n\n,\n,。,,,., ,])chunkstext_splitter.split_documents(documents)print(f✅ 文档已分割为{len(chunks)}个片段)returnchunks# 第 3 步创建向量数据库 defcreate_vector_store(chunks):把文本片段转成向量存入 ChromaDBembeddingsOpenAIEmbeddings()# 创建向量数据库vector_storeChroma.from_documents(documentschunks,embeddingembeddings,persist_directory./chroma_db# 持久化存储到本地)print(✅ 向量数据库创建完成)returnvector_store# 第 4 步创建问答链 defcreate_qa_chain(vector_store):创建问答链# 定义提示词模板prompt_template你是一个专业的文档问答助手。请根据以下文档内容回答用户的问题。 要求 1. 只根据提供的文档内容回答不要编造信息 2. 如果文档中没有相关内容请明确告知用户 3. 回答要简洁清晰使用中文 文档内容 {context} 用户问题{question} 回答promptPromptTemplate(templateprompt_template,input_variables[context,question])# 创建 LLMllmChatOpenAI(modelgpt-3.5-turbo,# 也可以换成 gpt-4temperature0# 设为 0回答更稳定)# 创建检索器retrievervector_store.as_retriever(search_typesimilarity,# 相似度搜索search_kwargs{k:3}# 返回最相关的 3 个片段)# 创建问答链qa_chainRetrievalQA.from_chain_type(llmllm,chain_typestuff,# 把检索到的片段拼接后一起传给 LLMretrieverretriever,chain_type_kwargs{prompt:prompt},return_source_documentsTrue# 返回来源文档方便溯源)print(✅ 问答链创建完成)returnqa_chain# 第 5 步交互式问答 defchat(qa_chain):交互式问答循环print(\n*50)print( 文档问答机器人已就绪)print(输入你的问题输入 quit 退出)print(*50\n)whileTrue:questioninput( 你的问题).strip()ifquestion.lower()in[quit,exit,q,退出]:print( 再见)breakifnotquestion:continue# 调用问答链resultqa_chain.invoke({query:question})# 输出回答print(f\n 回答{result[result]})# 输出来源ifresult.get(source_documents):print(\n 参考来源)fori,docinenumerate(result[source_documents],1):sourcedoc.metadata.get(source,未知)pagedoc.metadata.get(page,未知)print(f [{i}]{source}- 第{page}页)print()# 主程序 if__name____main__:# 配置DOCUMENT_PATHyour_document.pdf# ← 替换成你的文档路径# 执行流程print( 启动文档问答机器人...\n)# 1. 加载文档documentsload_documents(DOCUMENT_PATH)# 2. 分割文本chunkssplit_documents(documents)# 3. 创建向量数据库vector_storecreate_vector_store(chunks)# 4. 创建问答链qa_chaincreate_qa_chain(vector_store)# 5. 开始问答chat(qa_chain)五、运行与测试第 1 步准备一个文档放一个 PDF 或 TXT 文件到项目目录下比如your_document.pdf。第 2 步修改文件路径把代码里的DOCUMENT_PATH改成你的文件名DOCUMENT_PATHyour_document.pdf# 改成你的文件名第 3 步运行python qa_bot.py第 4 步测试问答 启动文档问答机器人... ✅ 成功加载文档共 10 页 ✅ 文档已分割为 42 个片段 ✅ 向量数据库创建完成 ✅ 问答链创建完成 文档问答机器人已就绪 输入你的问题输入 quit 退出 你的问题这个产品的主要功能有哪些 回答根据文档该产品主要有以下功能 1. 实时数据监控 2. 自动报警通知 3. 历史数据查询 4. 报表生成与导出 参考来源 [1] your_document.pdf - 第 3 页 [2] your_document.pdf - 第 4 页 [3] your_document.pdf - 第 5 页 你的问题quit 再见六、代码逐行解析来回顾一下整个流程文档文件 │ ▼ PyPDFLoader / TextLoader ← 第 1 步加载文档 │ ▼ RecursiveCharacterTextSplitter ← 第 2 步分割成小块 │ ▼ OpenAI Embeddings ← 第 3 步文本向量化 │ ▼ ChromaDB ← 第 3 步存入向量数据库 │ ▼ Retriever 检索最相关片段 ← 第 4 步用户提问时检索 │ ▼ ChatOpenAI 生成回答 ← 第 4 步LLM 生成答案 │ ▼ 输出给用户 ← 第 5 步展示结果每一步都是独立的组件LangChain 帮你把它们链在一起。七、国产模型配置方法如果用不了 OpenAI可以用国产模型替代。方案一通义千问阿里pipinstalldashscopefromlangchain_community.llmsimportTongyi# 设置环境变量# export DASHSCOPE_API_KEYsk-你的keyllmTongyi(model_nameqwen-turbo,dashscope_api_keysk-你的key)方案二智谱 ChatGLMpipinstallzhipuaifromlangchain_community.chat_modelsimportChatZhipuAI llmChatZhipuAI(modelglm-4,zhipuai_api_key你的key)方案三文心一言百度pipinstallqianfanfromlangchain_community.llmsimportQianfanLLMEndpoint llmQianfanLLMEndpoint(modelERNIE-Bot-4,qianfan_ak你的AK,qianfan_sk你的SK)国产模型的 Embedding 也需要对应替换具体查 LangChain 官方文档的集成列表。八、常见问题问题原因解决方案ModuleNotFoundError缺少依赖检查pip install是否全部成功AuthenticationErrorAPI Key 错误检查环境变量是否设置正确回答质量差切片太小或太大调整chunk_size建议 300-1000回答我不知道相关片段没被检索到增加k值或调大chunk_overlap加载 PDF 报错缺少 PDF 解析库pip install pypdf中文乱码编码问题TextLoader 加encodingutf-8九、总结步骤用了什么做了什么1PyPDFLoader加载文档2TextSplitter分割成小块3Embeddings Chroma向量化并存储4Retriever LLM检索 生成回答5循环输入交互式问答核心思想就是RAG先检索再生成。让 LLM 基于你的文档内容回答而不是凭空编造。下一篇预告第 5 篇给 Agent 接上工具Tool Use 实战我们的问答机器人现在只能读文档下一篇我们给它接上搜索、计算、代码执行等工具让它从能读进化到能做真正变成一个 Agent。 关注我不迷路如果觉得有帮助点个赞 收藏 ⭐ 支持一下是我持续更新的动力