What is Langchain ?
概念

LangChain是一个用于构建由 LLM 提供支持的代理和应用程序的框架。LangChain 是⼀个开源框架,它允许开发⼈员将像通义千问、DeepSeek这样的⼤语⾔模型与外部的系统和数据源结合起来去完成更多更复杂的和操作⾏为。
类比一下,LangChain于AI就像Spring Boot与Apache Camel的结合体于Java生态的角色。它旨在在定义下⼀代软件的开发范式,通过标准化⼯具链和⽣态整合能⼒,将⼤语⾔模型(LLM)的原始能⼒转化为可落地的⾏业解决⽅案
时间线
- 2023年9月 v0.3.0发布
- 2025年10月22日 v1.0发布
-
- 是一次面向生产级工程化的重大升级,不仅在 API 设计上大幅简化,还在架构、可维护性、稳定性与扩展能力方面实现了质的飞跃
-
- 统一 Agent 创建接口------create_agent( )
-
- 中间件系统(Middleware)------细粒度流程控制
-
- 标准化输出:.content_blocks ------无论使用哪家模型,输出统一为结构化内容块
-
- 结构化输出原生支持------ 将结构化输出直接集成到主循环中
-
- 基于 LangGraph 的底层架构------ Agent 实际是 LangGraph 编排的状态图(StateGraph)
-
- 包结构精简与迁移路径------移除冗余模块,核心包更轻量。旧版功能(如 LLMChain, ConversationBufferMemory)迁移到 langchain-classic
-
核心组件

LangChain中组件其实相当多的,大致上可以分为6大部分:
- 模型包装器(模型输入/输出(Model I/O)):与语言模型交互的接口
- 语言模型 Language Models、提示模板 Prompt Templates、 输出解析器 Output Parsers等等

-
数据连接(Data connection):与特定应用程序的数据进行交互的接口
- 文档加载器 、文档切分、文本嵌入、矢量、检索器等等
-
链(Chains):将组件组合实现端到端应用。
- 链允许我们将多个组件组合在一起,以创建一个单一的、连贯的应用程序。
-
记忆(Memory):用于链的多次运行之间持久化应用程序状态。
-
代理(Agents)与工具:扩展模型的推理能力,用于复杂的应用的调用序列。
-
中间件(Middleware):控制和自定义每个步骤的代理执行
helloLangchain
废话少说上代码
先简单看一个使用LangChain框架访问AI大模型的🌰,我们这里依然以通义千问为例。
python
from langchain.chat_models import init_chat_model
from langchain_community.chat_models import ChatTongyi
from langchain_openai import ChatOpenAI
model = ChatTongyi()
#2.构建提示词,访问模型
prompt = "你是谁?"
result = model.invoke(prompt)
#3.获取打印结果
print(result.content)
model = ChatTongyi()一句是获取大模型对象。LangChain提供了三种接口来获取大模型:
- 针对某个平台模型创建
ini
model = ChatTongyi()
- 基于openai规范的一类模型
- api_key
- model
- base_url
ini
model = ChatOpenAI(api_key=os.getenv("DASHSCOPE_API_KEY"),model="qwen-max",base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")
- 不是openAI兼容的
- model
- model_provider 模型提供方 ,注意在init_chat_model函数内列出了基本的模型model_provider字符串,不能写错
ini
model = init_chat_model(model="deepseek-chat" ,model_provider="deepseek" )
是不是简洁明了?三行代码就解决了。我们再回顾下之前 站在AI风口的第一个AI程序:helloAI 里实现同样功能需要多少代码?
ini
import os
# 如果这里报错,需要手动在控制台安装 openai SDK:pip install openai
from openai import OpenAI
# 1. 准备工作:初始化客户端
client = OpenAI(
# 建议通过环境变量配置API Key,避免硬编码。
api_key=os.environ["DASHSCOPE_API_KEY"],
# API Key与地域强绑定,请确保base_url与API Key的地域一致。
# AI大模型发生改变时,切记也一定要相应修改这里。比如阿里千问切到deepseek,需要切到deepseek域名
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
# 2. 发起流式请求
completion = client.chat.completions.create(
# 模型名字,不可乱填!!!可参考各模型官网
# model="qwen-plus", # 阿里千问
model="deepseek-v3.2", # deepseek
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "iOS开发转型AI大模型应用开发该怎么学习?"}
],
# 通过 extra_body 设置 enable_thinking 开启思考模式
# extra_body={"enable_thinking": True},
stream=True,
stream_options={"include_usage": True}
)
# 3. 处理流式响应
# 用列表暂存响应片段,最后 join 比逐次 += 字符串更高效
content_parts = []
print("AI: ", end="", flush=True)
for chunk in completion:
if chunk.choices:
content = chunk.choices[0].delta.content or ""
print(content, end="", flush=True)
content_parts.append(content)
elif chunk.usage:
print("\n--- 请求用量 ---")
print(f"输入 Tokens: {chunk.usage.prompt_tokens}")
print(f"输出 Tokens: {chunk.usage.completion_tokens}")
print(f"总计 Tokens: {chunk.usage.total_tokens}")
full_response = "".join(content_parts)
print(f"\n--- 完整回复 ---\n{full_response}")
至少需要十几行代码,这时候就显现出框架的作用了。Coding效率立马提高了5倍(至少这里是,哈哈哈)。
prompt template
问题?
从上接过码run起来后,我们不难发现有两个问题:
-
提示词是固定,无法根据实际情况灵活变动
- prompt = "你是谁?"固定不变
-
大模型原始答复比较复杂,包含了很多额外的信息。没有做格式化
- result.content才为回答内容。有时候日期需要转换为格式化、有时候需要转换为csv格式等。
解决!
今天我们只看第一个问题。Langchain中的prompt template正是解决这个问题的。顾名思义,它是一个提示词模板,可以让提示词更加灵活。我们可以将变量插入到模板中,从而创建出不同的提示。
他的特点和优势主要有:
-
清晰易懂的提⽰: 提⾼提⽰⽂本的可读性,使其更易于理解,尤其是在处理复杂或涉及多个变量的情况下。
-
增强可重⽤性: 使⽤模板,可以在多个地⽅重复使⽤,简化代码,⽆需重复构建提⽰字符串。
-
简化维护: 使⽤模板后,如果需要更改提⽰内容,只需修改模板,⽆需逐个查找所有⽤到该提⽰的地⽅。
-
智能处理变量: 模板可以⾃动处理变量的插⼊,⽆需⼿动拼接字符串。
-
参数化⽣成: 模板可以根据不同的参数⽣成不同的提⽰,有助于个性化⽂本⽣成。
常见模板
常见提示词模板
- LLM提示模板 PromptTemplate:常用的String提示模板
ini
from langchain_community.chat_models import ChatTongyi
from langchain_core.prompts import PromptTemplate
# 1.创建模型客户端
model = ChatTongyi()
#2.构建提示词,访问模型
# prompt = "你是谁?"
# 字符串提示词模板 {text} 占位符,通过text变量动态设置提示词内容
prompt = PromptTemplate(template="你是一个翻译助手,请讲以下内容翻译成{language}:{text}")
# 输入参数内容,构建真正的提示词
fact_prompt = prompt.format(language="中文", text="I am a programmer")
print(fact_prompt)
result = model.invoke(fact_prompt)
#3.获取打印结果
print(result.content)
- 聊天提示模板 ChatPromptTemplate: 常用的Chat提示模板,用于组合各种角色的消息模板,传入聊天模型。
python
from langchain_community.chat_models import ChatTongyi
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate, SystemMessagePromptTemplate, \
HumanMessagePromptTemplate, AIMessagePromptTemplate
# 设置对话提示词模板,设置角色
# prompt = ChatPromptTemplate.from_messages([
# ("system", "你是一个翻译助手,请将以下内容翻译成{language}"),
# ("human", "{text}")
# ])
# Langchain为了防止system、human拼写错误,定义了SystemMessagePromptTemplate等
prompt = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template("你是一个翻译助手,请将以下内容翻译成{language}"),
HumanMessagePromptTemplate.from_template("{text}")
# AIMessagePromptTemplate ai的角色消息,用来记录维持对话
])
# 输入参数内容,构建真正的提示词
fact_prompt = prompt.format(language="中文", text="I am a programmer")
print(fact_prompt)
result = model.invoke(fact_prompt)
#3.获取打印结果
print(result.content)
- 少样本提示模板 FewShotPromptTemplate、提示模板部分格式化、管道提示模板 PipelinePrompt等等。
ini
# 创建示例,模型学习用户给的参照样本,安装样本进行回答
examples = [
{"input": "如何重置密码?", "output": "密码重置可以通过绑定邮箱重置密码,也可以通过手机号重置密码"},
{"input": "我的设备无法开机怎么办?", "output": "故障排除步骤:1.可能是遥控器电池没电,2.确认电源状态,3.确认设备是否被锁屏"},
{"input": "这款产品是否有夜间模式?", "output": "这款不提供夜间模式,请选择xx款式的产品"},
]
# 配置一个提示模板,用来一个示例格式化
examples_prompt_tmplt_txt = "用户问题: {input} 对应回答: {output}"
# 这是一个提示模板的实例,用于设置每个示例的格式
prompt_sample = PromptTemplate.from_template(examples_prompt_tmplt_txt)
# 创建少样本示例的对象
prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=prompt_sample,
prefix="你是一个智能客服, 能够根据用户问题给出答案,",
suffix="现在给你用户提问: {input} ,请告诉我对应的结果:",
input_variables=["input"]
)
print(prompt.format(input="这款产品有防水模式?"))
print('-' * 50)
result = client.invoke(prompt.format(input="这款产品有防水模式?"))
print(result.content)
- PartialPromptTemplate(部分提示词模板) 核心作用是 "预设"与"延迟执行" 。它允许你将一个完整提示模板的一部分变量预先固定下来,生成一个"欠完备"的新模板,剩余变量留待后续填充。从架构角度看这样实现了关注点分离 和逻辑复用。
ini
from langchain.prompts import PromptTemplate
template = PromptTemplate.from_template("请用{style}的风格,总结以下内容:{content}")
# 创建一个固定了 style='专业' 的新模板
professional_template = template.partial(style="专业")
# 后续只需关心 content
prompt1 = professional_template.format(content=my_content)