一、为什么要用 LangChain自从 OpenAI 推出 ChatGPT 之后大模型能力迅速普及。越来越多的开发者开始将 LLM 接入业务系统但很快会遇到三个现实问题1、模型接口不统一 —— 今天用 OpenAI明天换国内模型代码要大改2、Prompt 难管理 —— 提示词到处拼字符串无法版本控制3、业务流程复杂 —— RAG、Agent、多工具调用全是胶水代码这时候LangChain 就登场了。LangChain 本质是一套 “面向大模型应用开发的工程化框架”它把模型调用、Prompt 管理、知识检索、流程编排、Agent 调度全部抽象成可组合模块让你像搭积木一样构建 AI 应用。二、LangChain 架构全景LangChain 可以理解为五大核心能力层记住一句话LangChain LLM 调用标准化 RAG 工程化 Agent 自动化三、模型封装统一不同大模型接口LangChain 最大的优势之一是统一模型接口。你可以在不修改业务逻辑的前提下在不同模型之间切换1、OpenAI GPT 系列2、Anthropic Claude3、国内文心一言4、本地模型Ollama / Llama你只需要更换模型初始化方式其余调用方式一致。这在企业级项目里极其重要 —— 模型可替换性 风险可控性。四、Prompt 工程把提示词变成函数很多开发者刚开始接触 LLM 时喜欢直接写f给我讲一个关于{topic}的笑话问题是Prompt 无法版本管理逻辑和提示词耦合难以团队协作优化LangChain 提供 PromptTemplate 和 ChatPromptTemplate支持变量占位支持多角色system / user / assistant支持文件加载支持 Few-shot 示例最佳实践是Prompt 与代码彻底解耦单独维护。在中大型 AI 项目中Prompt 甚至应该像 SQL 一样被当作核心资产管理。五、RAG给大模型注入私有知识很多人说“模型不准”其实问题不在模型而在没有给模型知识。RAGRetrieval Augmented Generation就是解决方案。LangChain 的 RAG 流程通常包括1、文档加载PDF / Word / 网页 / 数据库2、文本切分3、向量化4、存入向量数据库如 FAISS5、检索 生成回答在这里LangChain 和 LlamaIndex 经常被拿来对比。简单总结LangChain 强在流程编排 AgentLlamaIndex 强在数据索引能力很多项目会用 LlamaIndex 做数据层用 LangChain 做应用层六、LCELLangChain 的灵魂如果说 LangChain 是一套大模型应用框架那么 LCELLangChain Expression Language 就是它的核心编排能力。很多人学 LangChain 只关注模型调用和 RAG但真正决定工程质量的是 LCEL。6.1 为什么需要 LCEL假设我们要做一个最简单的流程1、接收用户输入2、构造 Prompt3、调用 LLM4、解析输出传统写法是“按步骤调用函数”。而 LCEL 的思路是用“管道”把各个组件连接起来描述数据如何流动。6.2 LCEL 的核心写法在 LCEL 里Prompt 是一个可运行组件LLM 是一个可运行组件Parser 也是一个可运行组件它们都实现了统一接口所以可以用 | 连接chainprompt|llm|StrOutputParser()调用时chain.invoke({topic:程序员})这行代码的含义非常清晰输入 → Prompt → LLM → 解析输出比传统“手动 format invoke parse”逻辑更直观、结构更干净。6.3 LCEL 的优势在哪里1.自动支持流式输出同一条链可以直接流式执行forchunkinchain.stream(input): print(chunk)无需改内部逻辑。2.自动支持异步同步调用chain.invoke()异步调用await chain.ainvoke()流程不需要重写。3.自动并行执行在 RAG 场景中如果有多个 Retriever{context1:retriever1,context2:retriever2,question:RunnablePassthrough()}|prompt|llmretriever1 和 retriever2 会自动并行执行。不需要写 asyncio也不需要手动调度。6.4 一句话理解 LCEL普通写法是按顺序写函数调用LCEL 写法是声明一条数据流管道它把“步骤式代码”升级为“数据流架构”。这也是为什么说LCEL 是 LangChain 的灵魂。小结1、如果你只是调用模型你只是“在用 API”。2、如果你掌握 LCEL你是在“设计 AI 工作流”。3、建议所有做 RAG 或 Agent 的开发者都优先用 LCEL 组织流程。4、它会让你的代码更清晰、更可维护也更适合生产环境。七、对话历史管理控制 Token 成本真实业务中多轮对话会带来一个问题上下文越来越长 → Token 成本暴涨LangChain 提供历史裁剪保留最近消息类型过滤只保留 human持久化存储SQL / Redis在企业场景里这一点非常关键控制成本避免超过模型上下文长度保证系统稳定性八、Agent让模型自己思考与行动如果说 RAG 是“查资料回答问题”那么 Agent 是给一个目标让模型自己规划步骤。最经典的是 ReAct 模式思考 → 行动 → 观察 → 再思考 → 输出结果举个例子问2024年某明星演唱会是星期几模型会1、搜索日期2、解析日期3、调用“星期计算工具”4、输出答案整个过程自动完成。这就是 Agent 的价值 —— 让模型具备“任务执行能力”。九、LangServe快速部署 API当你构建好一个 LCEL 流程后LangChain 提供 LangServe可以一行代码生成 REST API。你不需要写路由、序列化、异常处理逻辑。直接部署成可调用服务。在微服务架构下这非常适合快速构建 AI 中台。十、文档功能模块https://python.langchain.com/docs/get_started/introductionAPI 文档https://api.python.langchain.com/en/latest/langchain_api_reference.html三方组件集成https://python.langchain.com/docs/integrations/platforms/官方应用案例https://python.langchain.com/docs/use_cases调试部署等指导https://python.langchain.com/docs/guides/debugging十一、LangChain 适合什么场景企业知识库问答系统AI 客服系统智能文档助手代码生成平台多工具自动执行系统内部数据分析 Agent不适合只做简单聊天直接调用 API 更轻量极端高性能推理系统需自定义架构十二、企业级最佳实践结合实际项目经验总结几点1.Prompt 必须独立管理不要写死在代码里。2.RAG 参数要反复调优chunk_size、overlap 直接影响效果。3.尽量使用 LCEL不要回到命令式“胶水代码”。4.严格做日志追踪生产环境一定接入 LangSmith。5.版本锁定LangChain 更新快升级前一定看 breaking change。十三、总结LangChain 并不是“又一个 AI 库”。它是一次面向大模型时代的软件工程抽象升级。它告诉我们三件事1、把 Prompt 当函数2、把流程当管道3、把模型当可调度执行器理解这三点比会写 API 更重要。如果你准备入门 AI 工程化开发建议路线1、先做一个 RAG 问答系统2、加入对话历史管理3、用 LCEL 重构流程4、最后引入 Agent 能力当你走完这条路径你对大模型应用开发的理解会完全不同。LangChain RAG 示例LangChain RAG 示例源码fromdotenvimportload_dotenvimportosimportrequests# Load environment variables from .env fileload_dotenv()fromqdrant_clientimportQdrantClientfromqdrant_client.modelsimportVectorParams,Distancefromlangchain_community.document_loadersimportPyMuPDFLoaderfromlangchain_text_splittersimportRecursiveCharacterTextSplitterfromlangchain_huggingfaceimportHuggingFaceEmbeddingsfromlangchain_qdrantimportQdrantVectorStorefromlangchain_core.documentsimportDocument EMBEDDING_DIM384# all-MiniLM-L6-v2 模型的维度COLLECTION_NAMElangchain_demoPATH./qdrant_db_langchain# 设置 Tarvos API key 和 URL从环境变量读取TARVOS_API_KEYos.getenv(TARVOS_API_KEY)TARVOS_API_URLos.getenv(TARVOS_API_URL)TARVOS_MODELos.getenv(TARVOS_MODEL,meta-llama/Llama-3.3-70B-Instruct)# 1. 加载本地 embedding 模型print(正在加载本地 embedding 模型...)embeddingsHuggingFaceEmbeddings(model_namesentence-transformers/all-MiniLM-L6-v2)# 2. 加载 ./data 目录下所有 PDF 文档print(正在加载文档...)importglob pdf_filesglob.glob(./data/*.pdf)ifnotpdf_files:raiseValueError(./data 目录下没有找到 PDF 文件请先添加 PDF 文件)all_documents[]forpdf_pathinpdf_files:loaderPyMuPDFLoader(pdf_path)docsloader.load()all_documents.extend(docs)print(f共加载{len(all_documents)}页文档)# 3. 文档切片chunk_size300, chunk_overlap100与 llamaIndex.py 一致print(正在切片文档...)text_splitterRecursiveCharacterTextSplitter(chunk_size300,chunk_overlap100)chunkstext_splitter.split_documents(all_documents)print(f共切分为{len(chunks)}个块)# 4. 创建 Qdrant Collectionprint(正在创建向量数据库...)qdrant_clientQdrantClient(pathPATH)ifqdrant_client.collection_exists(collection_nameCOLLECTION_NAME):qdrant_client.delete_collection(collection_nameCOLLECTION_NAME)qdrant_client.create_collection(collection_nameCOLLECTION_NAME,vectors_configVectorParams(sizeEMBEDDING_DIM,distanceDistance.COSINE))# 5. 将文档向量存入 Qdrantprint(正在创建索引...)vector_storeQdrantVectorStore(clientqdrant_client,collection_nameCOLLECTION_NAME,embeddingembeddings)vector_store.add_documents(chunks)# 6. 创建检索器retrievervector_store.as_retriever(search_kwargs{k:3})# 7. Tarvos API 问答函数与 llamaIndex.py 完全一致defask_tarvos(question,context):headers{Content-Type:application/json,Authorization:TARVOS_API_KEY,}body{model:TARVOS_MODEL,messages:[{role:system,content:你是一个专业的AI助手请根据提供的检索内容回答用户问题。如果检索内容与问题无关请说明无法回答。},{role:user,content:f参考内容\n{context}\n\n问题{question}}]}try:resprequests.post(TARVOS_API_URL,jsonbody,headersheaders,timeout60)returnresp.json()[choices][0][message][content]exceptExceptionase:returnf调用 Tarvos API 失败:{str(e)}# 8. 主对话循环print(\n✅ 系统就绪开始对话输入空行退出\n)whileTrue:questioninput(User: )ifquestion.strip():break# 检索 top-k 文档docsretriever.invoke(question)context\n\n.join([doc.page_contentfordocindocs])# 调用 Tarvos API 生成答案answerask_tarvos(question,context)print(fAI:{answer}\n)