LangChain 大模型應用開發框架:從 RAG 到 Agent 的完整指南
在AI大模型時代,Python以23.08%的市場份額連續五年穩居編程語言榜首,在AI、數據科學、深度學習等前沿技術中的應用尤為廣泛。而LangChain作為一個基于大語言模型(LLM)的應用程序開發框架,提供了一整套工具、組件和接口,簡化了創建大模型應用程序的過程,已經成為大模型應用開發的事實標準。本文將從零到一地介紹如何使用LangChain構建從檢索增強生成(RAG)到智能代理(Agent)的完整應用。

一、LangChain的核心價值
1. 為什么需要LangChain
直接調用LLM API只能實現基礎的文本生成功能。但在實際應用中,我們需要:
- 與外部數據交互:讓大模型能夠理解和處理特定領域的知識
- 集成多個LLM:在不同場景使用不同的模型
- 添加工具支持:讓大模型能夠調用計算器、搜索引擎等外部工具
- 管理上下文:維護對話歷史和狀態
- 處理復雜流程:組織多步驟的操作流程
LangChain正是為了解決這些問題而誕生的。LangChain可以將LLM模型、向量數據庫、交互層Prompt、外部知識、外部工具整合到一起,進而可以自由構建LLM應用。
2. LangChain的架構組成
# LangChain核心組件
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema.output_parser import StrOutputParser
from langchain.memory import ConversationBufferMemory
# Models:選擇大語言模型
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.7)
# Prompts:設計提示模板
prompt = ChatPromptTemplate.from_template(
"You are a helpful assistant. Answer the following question: {question}"
)
# Output Parser:解析輸出
output_parser = StrOutputParser()
# Memory:保存對話歷史
memory = ConversationBufferMemory()
# Chain:組織流程
chain = prompt | llm | output_parser二、從基礎到高級的完整應用
1. 基礎的LLM鏈式調用
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema.output_parser import StrOutputParser
# 創建LLM
llm = ChatOpenAI(model_name="gpt-4", temperature=0)
# 定義提示模板
template = """請根據以下信息回答問題:
信息:{context}
問題:{question}
回答:"""
prompt = ChatPromptTemplate.from_template(template)
# 組建鏈
chain = prompt | llm | StrOutputParser()
# 執行
result = chain.invoke({
"context": "Python是一門高級編程語言",
"question": "Python是什么?"
})2. 檢索增強生成(RAG)
RAG是當前最流行的大模型應用模式,允許大模型基于特定文檔進行回答:
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
# 1. 加載文檔
loader = PyPDFLoader("document.pdf")
documents = loader.load()
# 2. 分割文本
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
splits = text_splitter.split_documents(documents)
# 3. 創建向量存儲
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(splits, embeddings)
# 4. 創建檢索鏈
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
# 5. 執行查詢
result = qa_chain.run("文檔中講了什么內容?")3. 智能Agent(代理)
Agent是LangChain中最強大的功能,允許大模型根據任務自主決定調用哪些工具:
from langchain.agents import tool, initialize_agent, AgentType
from langchain.chat_models import ChatOpenAI
import asyncio
llm = ChatOpenAI(model_name="gpt-4", temperature=0)
# 定義工具
@tool
def get_weather(location: str) -> str:
"""獲取指定城市的天氣信息"""
returnf"{location}今天天氣晴朗,溫度25°C"
@tool
def calculate(expression: str) -> float:
"""執行數學計算"""
return eval(expression)
# 初始化Agent
tools = [get_weather, calculate]
agent = initialize_agent(
tools,
llm,
agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 執行任務
result = agent.run("北京今天天氣怎么樣?然后告訴我25乘以3等于多少?")4. 多鏈編排
對于復雜應用,需要多個鏈相互協作:
from langchain.chains import SequentialChain, LLMChain
from langchain.prompts import PromptTemplate
# 鏈1:總結
summary_template = "請用一句話總結以下內容:{text}"
summary_prompt = PromptTemplate(input_variables=["text"], template=summary_template)
summary_chain = LLMChain(llm=llm, prompt=summary_prompt)
# 鏈2:翻譯
translate_template = "請將以下內容翻譯成英文:{summary}"
translate_prompt = PromptTemplate(input_variables=["summary"], template=translate_template)
translate_chain = LLMChain(llm=llm, prompt=translate_prompt)
# 組織成順序鏈
sequential_chain = SequentialChain(
chains=[summary_chain, translate_chain],
input_variables=["text"],
output_variables=["summary", "output"]
)
# 執行
result = sequential_chain({"text": "很長的文本內容..."})三、LangChain的性能優化
1. 使用緩存減少API調用
from langchain.cache import SQLiteCache
from langchain.globals import set_llm_cache
import langchain
# 配置緩存
set_llm_cache(SQLiteCache(database_path=".langchain.db"))
# 之后的相同查詢會從緩存中獲取2. 流式處理大型文檔
# 使用流式處理而不是一次性加載
for chunk in chain.stream({"question": "問題"}):
print(chunk, end="", flush=True)3. 批量處理
# 批量執行多個查詢
questions = ["問題1", "問題2", "問題3"]
results = chain.batch([{"question": q} for q in questions])四、常見的應用場景
場景1:知識庫問答系統
# 構建企業知識庫問答系統
from langchain.chains import RetrievalQA
knowledge_qa = RetrievalQA.from_chain_type(
llm=llm,
retriever=knowledge_base_vectorstore.as_retriever(),
return_source_documents=True # 返回源文檔
)場景2:自動化數據分析
# 讓Agent自主分析數據
@tool
def analyze_data(file_path: str) -> str:
"""分析CSV文件"""
import pandas as pd
df = pd.read_csv(file_path)
return df.describe().to_string()
# Agent會自主決定何時調用此工具場景3:多步驟工作流自動化
# 自動完成復雜的業務流程
complex_agent = initialize_agent(
tools=[database_tool, email_tool, file_tool],
llm=llm,
agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
memory=ConversationBufferMemory()
)五、結尾
LangChain不僅降低了大模型應用開發的門檻,更重要的是它提供了一套完整的、可擴展的框架。從簡單的文本生成到復雜的多工具編排,LangChain都提供了相應的支持。LangChain的Agent概念是其精髓所在,通過讓大模型自主決定調用哪些工具,可以實現真正的"智能"應用。隨著大模型技術的不斷發展和成熟,LangChain這樣的框架將在產業應用中扮演越來越重要的角色。




































