LangChain 是一个专为大型语言模型(LLM)设计的开发框架,其核心目标是将 LLM 的能力封装为可组合、可复用的模块,从而降低构建 AI 应用的复杂性。与传统编程框架不同,LangChain 强调 数据感知 和 自主性,即系统能够根据输入数据动态调整行为,并通过链式调用(Chaining)实现复杂的业务逻辑。
LangChain 的定位是 LLM 应用开发的瑞士军刀,它通过以下技术栈实现这一目标:
对比传统框架:传统框架(如 Django、Flask)依赖固定路由和业务逻辑,而 LangChain 通过动态链式调用和上下文感知,实现更灵活的 AI 应用构建。
LangChain 的技术栈可分为三层(如图 1 所示):
图 1: LangChain 技术栈分层
|-------------------------|
| LLM 编程框架 (Chain, Agent)
|-------------------------|
| 向量存储 (Qdrant, Neo4j)
|-------------------------|
| 数据预处理 (PDF 解析, OCR)
|-------------------------|
PyPDF2
、pdfplumber
等库提取非结构化文本,或通过 OCR 模型(如 PaddleOCR)处理图像文本。TongYiEmbeddings
),并存储在 Qdrant 中,实现高效的语义检索。Chain 是 LangChain 的核心组件,其本质是 责任链模式(Chain of Responsibility Pattern) 的实现。传统责任链模式中,每个节点处理特定任务并传递上下文,而 LangChain 的 Chain 允许动态组合多个 LLM 调用步骤,并支持条件分支。
例如,一个电商客服系统的 Chain 可能包含以下步骤:
LLMChain 是 Chain 的基础实现,其内部结构如下:
from langchain import LLMChain
from langchain.prompts import PromptTemplate
from langchain.llms import TongYi
llm = TongYi(model="qwen-max")
prompt = PromptTemplate(input_variables=["question"], template="请回答:{question}")
chain = LLMChain(llm=llm, prompt=prompt)
result = chain.run({"question": "如何退货?"})
LangChain 1.0 引入了 LCEL(LangChain Expression Language),允许通过 |
符号串联多个步骤:
from langchain import RunnableSequence
chain = (PromptTemplate(...) | llm)
这种表达式语言的优势在于:
LangChain 的 Chain 支持 热插拔式模块替换。例如,可以将 TongYi
替换为 DeepSeek
,或更换不同的 Prompt 模板,而无需重构整个流程。
Prompt 模板通过 {}
实现变量注入。例如:
template = "用户的问题是:{question}\n请用{language}回答。"
prompt = PromptTemplate(input_variables=["question", "language"], template=template)
当调用 prompt.format(question="如何退货?", language="中文")
时,生成的 Prompt 为:
用户的问题是:如何退货?
请用中文回答。
LangChain 提供多种输出解析器:
示例:使用 JSON 解析器提取问答结果:
from langchain.output_parsers import JsonOutputParser
parser = JsonOutputParser()
prompt = PromptTemplate(...)
chain = LLMChain(llm=llm, prompt=prompt, output_parser=parser)
result = chain.run({"question": "退货政策是什么?"})
# result 是 JSON 格式,如 {"policy": "7天无理由退货"}
需求:根据用户输入的商品名称和价格,生成促销文案。
实现步骤:
template = "商品名称:{name}\n价格:{price}\n请生成一条促销文案。"
chain = LLMChain(llm=llm, prompt=prompt)
result = chain.run({"name": "iPhone 15", "price": "6999元"})
# 输出示例:"iPhone 15 限时特价6999元!立即抢购,享受超值优惠!"
LangChain 提供 ConversationBufferMemory
实现短期记忆:
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
memory.save_context({"input": "你好"}, {"output": "您好!"})
print(memory.load_memory_variables({}))
# 输出:{"history": "Human: 你好\nAI: 您好!"}
RedisChatMessageHistory
实现持久化。示例:使用 Redis 存储会话历史:
from langchain.memory import RedisChatMessageHistory
history = RedisChatMessageHistory(url="redis://localhost:6379/0", session_id="user123")
memory = ConversationBufferMemory(chat_memory=history)
场景:用户咨询淘宝开放平台的 API 文档,需要实时检索并回答。
挑战:
TongYiEmbeddings
生成向量。from langchain.vectorstores import Qdrant
from langchain.embeddings import TongYiEmbeddings
embeddings = TongYiEmbeddings(model="text-embedding")
docs = ["API 调用频率限制为 1000 次/分钟", ...]
db = Qdrant.from_documents(docs, embeddings, url="http://localhost:6333")
query = "API 调用频率限制是多少?"
results = db.similarity_search(query, k=3)
prompt = PromptTemplate(template="根据以下内容回答:{context}\n问题:{query}")
chain = LLMChain(llm=llm, prompt=prompt)
answer = chain.run({"context": results, "query": query})
ThreadPoolExecutor
并发调用多个 Chain。性能指标:
优化策略:
stream=True
参数实现实时返回。参考资料:
版权声明:本文为 CSDN 博客原创内容,转载请注明出处。