
《我把LangChain接進項目后先推翻了幾個想當然》看起來是個大話題但真落到項目里常常就是幾個具體選擇。下面我盡量按實際開發時會遇到的問題來講。摘要之前我帶團隊做了一個內部知識庫助手用 LangChain 搭起來本地跑一切正常。結果上線后權限問題、日志缺失、工具調用失敗一個接一個。最后回滾了三輪才發現我們當時寫的代碼根本撐不起團隊協作的場景。這件事讓我意識到LangChain 從 Demo 到生產中間差的不是調 API 的能力而是工程化的細節。今天就把這個復盤過程寫出來希望能幫你少走點彎路。---目錄LangChain 能解決什么問題核心組件Prompt 與 Chain工具調用項目實戰總結LangChain 能解決什么問題很多人第一反應是LangChain 就是個調模型的框架嘛直接調 API 不就行了確實如果你只是想發一條消息拿到回復OpenAI 的 SDK 夠用了。但真正做應用的時候你會發現需求開始變復雜需要把用戶的提問拆成多個步驟需要調用外部工具比如查數據庫、搜索文檔需要管理對話上下文讓模型記住之前的內容需要處理工具調用的錯誤和重試這些場景LangChain 提供了一套標準化的抽象。它不是必須用的但用了之后代碼結構會更清晰后續維護成本會低很多。我們團隊一開始也是自己寫代碼后來發現代碼越來越亂才決定用 LangChain 重構。重構后工具調用的邏輯和模型調用的邏輯分開了加新工具也變得簡單。---核心組件LangChain 的核心組件不多但理解它們的關系很重要。Language Model封裝了各種模型的調用接口包括 OpenAI、Anthropic、國產模型等。統一接口的好處是切換模型時不用改太多代碼。Prompt管理提示詞模板。用ChatPromptTemplate可以把多個消息模板組合在一起支持動態填充變量。Chain把多個組件串聯起來形成一個完整的流程。比如接收用戶輸入 → 查詢知識庫 → 調用模型 → 返回結果。Memory管理對話歷史。LangChain 提供了多種內存實現比如ConversationBufferMemory、VectorStoreRetrieverMemory。Tools讓模型能夠調用外部工具。定義一個工具模型就能在需要時主動調用它。這幾個組件之間的關系可以用一張圖來理解用戶輸入經過 Prompt 處理后交給模型模型可能調用工具結果經過 Chain 組裝后返回給用戶Memory 負責保存對話歷史。---Prompt 與 ChainPrompt 是 AI 應用的靈魂好的 Prompt 能讓模型表現更好。LangChain 的ChatPromptTemplate支持多消息模板的組合。比如一個客服場景可以這樣寫from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder prompt ChatPromptTemplate.from_messages([ (system, 你是一個專業的客服助手請用簡潔的語言回答問題。), MessagesPlaceholder(chat_history), (human, {question}), ])這里MessagesPlaceholder用來插入歷史對話{question}是動態變量。Chain 則是把多個步驟串起來。LangChain 提供了LCELLangChain Expression Language可以用管道符號|把組件連接起來from langchain.chat_models import ChatOpenAI from langchain.prompts import ChatPromptTemplate from langchain.chains import LLMChain llm ChatOpenAI(modelgpt-3.5-turbo) chain prompt | llm這種鏈式寫法很直觀也容易調試。每一步的輸出都能看到方便定位問題。---工具調用工具調用是 LangChain 里最實用的功能之一。模型可以根據用戶的問題自動選擇調用哪個工具。定義工具的方式很簡單from langchain.tools import tool tool def get_weather(city: str) - str: 查詢指定城市的天氣 # 這里調用天氣 API return f{city}今天晴氣溫25度然后把這個工具傳給模型from langchain.agents import create_openai_functions_agent, AgentExecutor from langchain import OpenAI agent create_openai_functions_agent(llm, [get_weather], prompt) executor AgentExecutor(agentagent, tools[get_weather]) result executor.invoke({input: 北京今天天氣怎么樣}) print(result[output])模型會自動識別天氣這個意圖調用get_weather工具把結果返回給用戶。踩坑點工具返回的格式要規范否則模型可能解析失敗。另外工具調用的錯誤處理也很重要比如 API 超時、權限不足等情況需要捕獲并給出友好的提示。---項目實戰我之前做的知識庫助手基本結構是這樣的1. 用戶提問2. 用向量檢索查詢相關文檔3. 把檢索結果和問題一起傳給模型4. 模型生成回答代碼大致如下from langchain.vectorstores import Chroma from langchain.embeddings import OpenAIEmbeddings from langchain.chat_models import ChatOpenAI from langchain.prompts import ChatPromptTemplate from langchain.chains import RetrievalQA embeddings OpenAIEmbeddings() vectorstore Chroma(persist_directory./db, embedding_functionembeddings) prompt_template 基于以下已知信息簡潔準確地回答用戶問題。 如果無法從已知信息中找到答案請說抱歉我不知道。 已知信息 {context} 用戶問題{question} prompt ChatPromptTemplate.from_messages([ (system, prompt_template), (human, {question}), ]) llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) qa_chain RetrievalQA.from_chain_type( llmllm, retrievervectorstore.as_retriever(), chain_typestuff, chain_type_kwargs{prompt: prompt} ) result qa_chain.invoke({query: 公司請假流程是什么}) print(result[result])這個 Demo 在本地跑得很順。但上線后問題就來了權限問題不同部門的員工能看到的內容不同但我們沒有做權限控制日志缺失不知道誰在什么時候問了什么問題出了問題沒法排查超時處理向量檢索有時候很慢但沒有超時機制請求一直掛著這些問題解決起來比調 API 麻煩多了。后來我們加了權限過濾、日志記錄、超時設置才真正能用。簡歷建議如果你要在簡歷上寫 LangChain 項目不要只寫用了 LangChain 做了個知識庫。要寫清楚做了什么、用了哪些組件、解決了什么問題、有什么指標。比如 基于 LangChain Chroma 搭建內部知識庫助手支持多部門權限隔離日均查詢 500 次平均響應時間 2s。這樣的表達更有說服力。---總結LangChain 確實能幫我們快速搭起 AI 應用的原型但從 Demo 到生產中間還有很多工程化的細節要處理權限控制不同用戶看到的內容要隔離日志記錄每一次調用都要有跡可循錯誤處理工具調用、模型調用都要有兜底性能優化檢索、生成都要控制時間我們團隊踩了三輪坑才把這些補齊。希望我的經驗能幫你少走點彎路。如果你在寫 LangChain 項目時遇到問題歡迎評論區交流。資料展示下面是我整理的AI大模型學習資料和工具包預覽適合收藏后按主題逐步學習。如果你想看完整資料目錄可以在評論區留言「資料」也歡迎告訴我你更關注AI大模型里的哪類內容。