LangChain 入门指南:用模块化框架快速构建 LLM 应用
摘要
开发基于大型语言模型(LLM)的应用程序时,重复的提示、输出解析和数据整合往往会耗费大量时间。LangChain 是一个开源框架,通过提供模块化组件和预置的“链”与“代理”,极大地简化了 LLM 应用的开发流程。本文基于 DeepLearning.AI 的课程内容,系统介绍 LangChain 的四大核心组件——模型、提示、索引、链与代理,并辅以代码示例和实战思路。无论你是 AI 应用开发者还是 LLM 爱好者,都能快速掌握如何用 LangChain 将模型能力转化为实际产品。
适用人群 / 前置知识
适用人群:希望使用大语言模型构建应用的开发者、数据科学家、AI 产品经理
前置知识:基础的 Python 编程;了解什么是大语言模型(如 GPT、ChatGLM)以及提示工程的基本概念;对 OpenAI API 或类似服务有一定接触会更好理解示例
1. 引言:为什么需要 LangChain?
过去,调用一次大语言模型就能完成一个简单任务(如翻译一句话)。但在真实应用中,你需要:
- 多次调用模型,传递不同上下文
- 解析模型输出的非结构化文本
- 从外部数据源(数据库、PDF、网页)检索信息,再喂给模型
- 让模型决定下一步调用哪个工具
这些重复逻辑就是“胶水代码”。LangChain 将这些通用模式抽象为可复用的组件,让你像搭积木一样构建 LLM 应用。正如 Harrison Chase 所说,它“专注于组合性和模块化”,并且提供了大量开箱即用的端到端用例。
2. 核心组件概览
LangChain 的主要模块包括:
| 组件 | 作用 | 类比 |
|---|---|---|
| Models | 封装对不同 LLM 的调用(OpenAI、Hugging Face 等) | 各种不同的“大脑” |
| Prompts | 管理提示模板、动态格式化输入 | 给大脑的“指令模板” |
| Indexes | 加载、分割、嵌入和检索外部文档 | 长期记忆 + 搜索引擎 |
| Chains | 将多个组件按顺序组合成一个任务流程 | 预定义的流水线 |
| Agents | 让 LLM 自主决定调用哪些工具和顺序 | 具备决策能力的机器人 |
下面逐一展开。
3. 模型(Models):统一调用接口
LangChain 支持数十种 LLM 提供商和部署方式,包括 OpenAI、Anthropic、Cohere、Hugging Face Hub、本地运行的 Llama 等。模型分为两类:
- LLM:输入文本,输出文本(如 text-davinci-003)
- ChatModel:输入消息列表,输出消息(如 gpt-3.5-turbo)
示例(使用 OpenAI 的 ChatModel):
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage
chat = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
response = chat([HumanMessage(content="用一句话解释什么是 LangChain")])
print(response.content)
小提示:你需要设置 OPENAI_API_KEY 环境变量。
4. 提示(Prompts):结构化输入
直接拼接字符串容易出错且难以维护。LangChain 提供 PromptTemplate 和 ChatPromptTemplate 来动态生成提示。
from langchain.prompts import PromptTemplate
template = PromptTemplate(
input_variables=["product"],
template="为以下产品写一句吸引人的广告词:{product}"
)
print(template.format(product="智能保温杯"))
对于聊天模型,可以组合系统消息和用户消息:
from langchain.prompts import ChatPromptTemplate, SystemMessage, HumanMessage
chat_template = ChatPromptTemplate.from_messages([
SystemMessage(content="你是一个幽默的广告文案专家。"),
HumanMessage(content="产品:{product}")
])
messages = chat_template.format_messages(product="智能保温杯")
5. 索引(Indexes):让模型接触私有数据
大模型的知识截止到训练数据。要让模型回答你公司内部文档或最新新闻,就需要检索增强生成(RAG)。索引组件包括:
- 文档加载器(Document Loaders):从 PDF、网页、Notion 等读取
- 文本分割器(Text Splitters):将长文档切成适合模型上下文窗口的块
- 向量存储(Vector Stores):存储文本的嵌入向量(如 Chroma、FAISS、Pinecone)
- 检索器(Retrievers):根据查询返回最相关的文档块
快速示例:从网页加载内容,然后检索
from langchain.document_loaders import WebBaseLoader
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 1. 加载文档
loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/")
documents = loader.load()
# 2. 分割
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = splitter.split_documents(documents)
# 3. 嵌入 + 存储
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(docs, embeddings)
# 4. 检索
retriever = vectorstore.as_retriever()
relevant_docs = retriever.get_relevant_documents("什么是思维链?")
6. 链(Chains):端到端的任务流水线
链将一个或多个组件串联起来。最简单的 LLMChain 组合了提示模板和模型:
from langchain.chains import LLMChain
chain = LLMChain(llm=chat, prompt=template)
result = chain.run(product="智能保温杯")
print(result)
更强大的 SequentialChain 可以将上一个输出作为下一个输入。例如:先生成产品描述,再翻译成英文。
from langchain.chains import SimpleSequentialChain
# 第一个链:生成中文描述
desc_prompt = PromptTemplate(input_variables=["product"], template="描述{product}的三个卖点")
chain1 = LLMChain(llm=chat, prompt=desc_prompt)
# 第二个链:翻译成英文
trans_prompt = PromptTemplate(input_variables=["chinese"], template="把以下中文翻译成英文:{chinese}")
chain2 = LLMChain(llm=chat, prompt=trans_prompt)
# 组合
overall_chain = SimpleSequentialChain(chains=[chain1, chain2])
print(overall_chain.run("智能保温杯"))
7. 代理(Agents):让模型成为“推理引擎”
代理比链更灵活——它不固定执行顺序,而是让 LLM 决定下一步调用哪个“工具”(如搜索引擎、计算器、数据库查询),并可以反复迭代直到完成任务。
示例:创建一个能够进行数学计算和搜索的代理(需要安装 langchain_experimental 和 google-search-results)
from langchain.agents import load_tools, initialize_agent, AgentType
from langchain.llms import OpenAI
llm = OpenAI(temperature=0)
tools = load_tools(["serpapi", "llm-math"], llm=llm) # 搜索 + 计算器
agent = initialize_agent(
tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)
agent.run("目前特斯拉的股价是多少?如果我用10000美元买入,涨幅20%后卖出,能赚多少?")
代理会先搜索股价,然后计算收益——完全由模型自主规划步骤。
8. 输出解析器(Parsers):让模型输出结构化数据
模型输出通常是自由文本。为了可靠地提取信息,LangChain 提供了解析器,例如将输出解析为 Python 列表、JSON 或自定义 Pydantic 对象。
from langchain.output_parsers import CommaSeparatedListOutputParser
parser = CommaSeparatedListOutputParser()
format_instructions = parser.get_format_instructions()
prompt = PromptTemplate(
template="列出5种{category}。\n{format_instructions}",
input_variables=["category"],
partial_variables={"format_instructions": format_instructions}
)
chain = LLMChain(llm=chat, prompt=prompt)
output = chain.run(category="机器学习框架")
print(parser.parse(output)) # 得到 ['TensorFlow', 'PyTorch', ...]
9. 常见问题与注意事项
| 问题 | 建议 |
|---|---|
| API 调用成本高 | 使用本地模型(如 Ollama、llama-cpp-python)或设置 max_tokens 限制 |
| 上下文窗口溢出 | 合理设置文本分块大小,使用 MapReduceDocumentsChain 等策略 |
| 代理陷入循环 | 设置 max_iterations,或使用更可靠的 Plan-and-Execute 代理 |
| 输出格式不稳定 | 使用 PydanticOutputParser 并配合 format_instructions 强制模型遵循格式 |
| 调试困难 | 开启 verbose=True 打印中间步骤,或使用 LangSmith 可视化追踪 |
10. 总结与下一步
LangChain 将 LLM 应用开发从“手写大量胶水代码”提升到“声明式组件编排”的层次。通过本文介绍的模型、提示、索引、链和代理,你已经可以构建:
- 基于私有文档的问答机器人(RAG)
- 自动处理客户邮件的分析流水线
- 能调用外部 API 完成复杂任务的 AI 助手
实践建议:
- 从 LLMChain 开始,确保你熟悉提示和模型输出
- 然后尝试结合检索器,构建一个简单的文档问答
- 最后挑战代理:用一个查询让模型自动搜索、计算和总结
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)