尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

LangChain 入门指南:用 Python 搭建大模型应用

LangChain 入门指南:用 Python 搭建大模型应用 LangChain 入门指南用 Python 搭建大模型应用一、开头痛点调通一个大模型 demo 容易做成一个应用很难很多同学第一次调 OpenAI 接口几行requests就跑起来了很有成就感。但真要把大模型塞进一个产品事情就不一样了用户问一个问题你要把历史对话拼进 prompt还得控制长度不然超 token想让模型「先检索资料再回答」RAG你得自己下载网页、切文本、算向量、存数据库、再拼回 prompt同一个功能要在测试、生产里换不同的模型代码到处是if流程一长代码就变成一团乱麻的字符串拼接改一处崩一片。LangChain 就是为了解决这些「胶水工作」而生的框架。它把「模型、提示词、记忆、检索、工具调用」都抽象成可组合的组件chain让你像搭积木一样把大模型应用串起来而不用重复造轮子。本文带你用 Python 从零跑通一个能检索网页并回答的问答机器人。二、环境准备三行命令装好LangChain 从 0.1 版本起把各厂家的集成拆分成了独立子包OpenAI 相关的要单独装。建议先建虚拟环境# 创建并激活虚拟环境可选但推荐python-mvenv .venvsource.venv/bin/activate# Windows 用 .venv\Scripts\activate# 安装核心包与 OpenAI 集成pipinstalllangchain langchain-openai langchain-community装好之后还需要一个 OpenAI API Key或兼容的本地/第三方 endpoint。把它放进环境变量避免硬编码exportOPENAI_API_KEYsk-你的密钥# Windows 用 set OPENAI_API_KEY...下面所有示例都基于这套环境模型用通用的gpt-3.5-turbo。文末会告诉你换成国产模型或本地 Ollama 的方法。三、最小可运行示例一句话调用大模型先写一个「能跑起来」的最小例子建立整体直觉——LangChain 里最核心的对象就是ChatOpenAI它对标 OpenAI 的聊天接口# hello_langchain.pyfromlangchain_openaiimportChatOpenAI# 实例化一个聊天模型temperature 控制随机性0 最稳1 最发散llmChatOpenAI(modelgpt-3.5-turbo,temperature0.7)# invoke 是最通用的同步调用方式传入字符串即可responsellm.invoke(用一句话解释什么是 LangChain)print(response.content)# .content 才是真正的文本回复运行python hello_langchain.py你会看到一段中文解释。response是一个AIMessage对象里面除了content还有usage_metadatatoken 用量等信息。这就是 LangChain 统一消息格式的好处换模型、换接口调用方式不变。四、核心概念模型、提示词、链、解析器1) 提示词模板PromptTemplate把可变部分抽成占位符避免手写字符串拼接fromlangchain_core.promptsimportChatPromptTemplate# from_messages 支持 system/user 多角色{topic} 是占位符promptChatPromptTemplate.from_messages([(system,你是乐于助人的技术博主用简洁的中文回答。),(user,请讲讲 {topic} 的核心价值。),])2) 链LCEL与输出解析器LangChain 0.2 推荐使用 LCEL 的管道语法|把组件串起来最后一个StrOutputParser()把消息对象转成纯文本fromlangchain_core.output_parsersimportStrOutputParser# prompt - llm - 解析成字符串构成一条可复用的链chainprompt|llm|StrOutputParser()print(chain.invoke({topic:向量数据库}))3) 记忆Memory / 历史多轮对话需要把历史传入。最简做法是用MessagesPlaceholderfromlangchain_core.promptsimportMessagesPlaceholder chat_promptChatPromptTemplate.from_messages([(system,你是中文助手。),MessagesPlaceholder(history),# 运行时注入历史消息(user,{input}),])理解这三块你就掌握了 LangChain 的骨架模板负责组 prompt链负责把数据流过模型解析器负责把结果变干净。五、进阶用法用管道拼出检索增强RAG雏形真正有用的应用往往要让模型「先查资料再答」。下面演示一个最小 RAG 链路加载网页 → 切分 → 向量化 → 检索 → 拼接回答。注意这里每个环节都是独立组件可以任意替换。fromlangchain_community.document_loadersimportWebBaseLoaderfromlangchain_text_splittersimportRecursiveCharacterTextSplitterfromlangchain_openaiimportOpenAIEmbeddingsfromlangchain_community.vectorstoresimportFAISS# 1) 加载一篇网页文档loaderWebBaseLoader(https://python.langchain.com/docs/get_started/)docsloader.load()# 2) 按 500 字切块留 50 字重叠保证语义连续splitterRecursiveCharacterTextSplitter(chunk_size500,chunk_overlap50)chunkssplitter.split_documents(docs)# 3) 用 OpenAI 嵌入模型向量化建一个内存里的 FAISS 索引vectorstoreFAISS.from_documents(chunks,OpenAIEmbeddings())retrievervectorstore.as_retriever(search_kwargs{k:3})# 每次取最相关的 3 段这一步跑完retriever就能根据问题返回最相关的文本片段了。进阶点上你可以把FAISS换成Chroma/Milvus把OpenAIEmbeddings换成OllamaEmbeddings实现完全离线。六、实战场景一个能「读网页再回答」的问答机器人完整代码把前面所有概念串起来做一个真正能用的小工具给它一个网址和一个问题它先检索网页内容再基于检索结果作答而不是瞎编。# qa_bot.pyfromlangchain_openaiimportChatOpenAI,OpenAIEmbeddingsfromlangchain_community.document_loadersimportWebBaseLoaderfromlangchain_text_splittersimportRecursiveCharacterTextSplitterfromlangchain_community.vectorstoresimportFAISSfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParserfromlangchain_core.runnablesimportRunnablePassthrough# 1. 准备模型llmChatOpenAI(modelgpt-3.5-turbo,temperature0)# 2. 构建检索器loaderWebBaseLoader(https://python.langchain.com/docs/get_started/)docsloader.load()chunksRecursiveCharacterTextSplitter(chunk_size500,chunk_overlap50).split_documents(docs)retrieverFAISS.from_documents(chunks,OpenAIEmbeddings()).as_retriever()# 3. 提示词明确要求「只根据上下文回答」promptChatPromptTemplate.from_template(你是一个严谨的助手只根据下面的上下文回答问题如果上下文没有答案就回答「资料里没提到」。\n\n上下文\n{context}\n\n问题{question})# 4. 把检索到的片段拼成一段文本defformat_docs(docs):return\n\n.join(d.page_contentfordindocs)# 5. 用 LCEL 管道组装完整链路qa_chain({context:retriever|format_docs,question:RunnablePassthrough()}|prompt|llm|StrOutputParser())# 6. 提问answerqa_chain.invoke(LangChain 里的 chain 是什么)print(answer)运行python qa_bot.py它会自动抓网页、建索引、检索、生成答案。这里RunnablePassthrough()把用户问题原样传下去retriever | format_docs把「问题→相关段落」的检索过程封装成一步。整条链路可读性很强要加记忆、加工具调用都是往管道里再接一段而已。七、常见坑与报错附解决办法坑 1ImportError: cannot import name ChatOpenAI from langchain现象照着老教程写from langchain.chat_models import ChatOpenAI报错。原因LangChain 0.1 把所有厂家集成拆到了独立包ChatOpenAI现已归属langchain-openai。解决先pip install langchain-openai再改成from langchain_openai import ChatOpenAI类似地OpenAIEmbeddings也来自这个包。坑 2AuthenticationError: Incorrect API key provided/ 返回空现象代码没错但调用直接抛鉴权错误或报OPENAI_API_KEY未设置。原因没配置密钥或配置到了错误的 shell 会话 / 虚拟环境。解决在运行脚本的同一环境里export OPENAI_API_KEY...更稳妥的是在项目根目录放一个.env文件并用python-dotenv的load_dotenv()加载避免密钥进入代码仓库。坑 3DeprecationWarning: class LLMChain is deprecated或模型已退役现象老代码跑出来一堆警告甚至调用text-davinci-003时报 404。原因LLMChain/ConversationChain等旧式链已被 LCEL 管道取代text-davinci-*系列模型也早已下线。解决用本文第四节的prompt | llm | StrOutputParser()管道写法替代LLMChain模型统一改用gpt-3.5-turbo/gpt-4o等聊天模型别再碰已退役的 completion 模型。八、总结与下一步LangChain 的核心价值就一句话把大模型应用里那些重复的「胶水代码」标准化成可组合的组件。本文覆盖了安装、最小调用、提示词模板、LCEL 管道、输出解析以及一条完整的「读网页再回答」RAG 问答链路并点出了三个最容易踩的真实坑。下一步建议你把OpenAIEmbeddings换成OllamaEmbeddings模型换成qwen2之类的本地模型跑通离线 RAG引入langchain_core.messages的AIMessage/HumanMessage自己管理多轮对话历史学习tools与bind_tools让模型能调用你自定义的函数比如查天气、算账进阶到 Agent。动手把今天这个qa_bot.py换成你自己的博客 URL你就拥有了人生第一个检索增强的大模型应用。
返回列表