LangChain--(1)
LangChain
1 基本概念
1.1 langchain是什么
langchain是一个用于开发由大型语言模型 (LLMs) 驱动的应用程序的框架,方便用户快速构建本地应用。
如图为langchain开发生态,其主要由以下部分组成:
langchain-core
: 基础抽象和LangChain表达式 (LCEL)。langchain-community
: 第三方集成。- 合作伙伴库(例如
langchain-openai
、langchain-anthropic
等):一些集成已进一步拆分为自己的轻量级库,仅依赖于langchain-core
。 langchain
: 组成应用程序认知架构的链、代理和检索策略。- LangGraph: 通过将步骤建模为图中的边和节点,构建强大且有状态的多参与者应用程序。与LangChain无缝集成,但也可以单独使用。
- LangServe: 将LangChain链部署为REST API。
- LangSmith: 一个开发者平台,让您调试、测试、评估和监控LLM应用程序。
1.2 langchain的开发环境
langchain 的核心是 langchain-core 和 langchain,如果用到一些社区功能,还要加上 langchain-community,搭建 Agent 用的是 langgraph,监控使用的是langsmith。
pip install langchain-core langchain langchain-community langgraph langsmith
2 基础知识
2.1 LLM的加载
langchain支持多种不同平台LLM的API调用,模型皆为会话模型,命名都以前缀且Chat-开始。支持模型详见:Chat models | ️ LangChain
2.1.1 显示加载
安装官方所支持的对应依赖包(如:langchain-openai,langchain-deepseek,langchain-qwq),提供显式的调用。具体如下:
from langchain_deepseek import ChatDeepSeek
# api-key已配置为环境变量,提供后默认的base_url
llm = ChatDeepSeek(model="deepseek-chat")
from langchain_qwq.chat_models import ChatQwen
# 此处我提供的api-key是阿里百炼平台,与源码的base_url不同,所以我进行了重新赋值
llm = ChatQwen(model="qwen-plus", base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")
支持openAI接口的都可以使用ChatOpenAI调用。
2.1.2 统一加载
langchain核心也提供了统一的加载方式,进行动态加载。
from langchain.chat_models import init_chat_model
llm = init_chat_model(model_provider="deepseek", model="deepseek-chat")# qwen的加载使用openai的接口,需提供新的访问地址base_url,否则默认为openai访问地址,model_provider不支持qwq,但百炼平台支持openai接口
llm = init_chat_model(model_provider='openai', model='qwen-plus', base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")
v0.3版本支持的model_provider如下所示:
2.1.3 加载方式对比
对比维度 | 方式1 | 方式2 |
---|---|---|
依赖来源 | langchain_{deepseek} 包 | langchain 核心模块 + langchain_{对应}包 |
扩展性 | 仅支持 DeepSeek | 支持多厂商(如 OpenAI、Anthropic) |
配置灵活性 | 参数硬编码,仅使用 DeepSeek,无法切换模型 | 参数可通过 model_provider 动态传递,支持加载配置字典切换模型 |
代码简洁性 | 需要显式导入类,代码直观,依赖简单。 | 一行代码完成初始化,代码可维护性强,符合 LangChain 最佳实践 |
错误处理 | 需手动实现 | 内置异常处理 |
默认参数 | 需手动指定 | 厂商级默认配置 |
2.2 流式输出
2.2.1 invoke 与 stream 的区别
invoke(同步调用)
**行为:**一次性等待模型生成完整响应后返回结果。
**特点:**阻塞式调用,需等待全部结果生成后才能处理。适用于非实时场景(如批量处理、离线任务)。
示例如下:
response = llm.invoke("请解释相对论") # 等待整个回答生成后返回print(response) # 一次性输出完整回答
stream(流式调用)
**行为:**逐步迭代模型生成的响应块(chunk),按需处理。
**特点:**非阻塞式调用,实时获取部分结果。适用于实时交互场景(如聊天机器人逐字输出、进度条)。
示例如下:
stream = llm.stream("请解释相对论")
for chunk in stream: # 逐步接收生成的内容print(chunk, end="", flush=True) # 逐字/逐句显示输出 end="":除"\n"外不换行 flush=True:不进行缓存,强制输出
2.3 提示词模板
langchain支持使用提示词模板来完成大模型的交互
llm = ChatQwen(model="qwen-plus", base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")from langchain_core.prompts import ChatPromptTemplate
# 提示词模板,支持模板填空
prompt_template = ChatPromptTemplate.from_messages([("system", "You are a helpful assistant that translates {input_language} to {output_language}."),("human", "{text}"),
])
# 模板的invoke用来填空
prompt = prompt_template.invoke({"input_language": "English", "output_language": "Chinese", "text": "I love programming."})
# 模板输入llm
reponse = llm.invoke(prompt)
print(reponse.content)
---------------------------------
我热爱编程。
2.4 定制参数
Langchain支持传入更多的定制参数,如temperate,top_k等。
llm = ChatQwen(model="qwen3-32b",temperature=0, # 控制生成文本的随机性,范围[0,2)之间的参数,越大越随机max_tokens=None, # 限制模型单次生成的最大 token 数量timeout=None, # 设置单次 API 请求的超时时间(单位:秒)max_retries=2, # 设置失败请求的自动重试次数。enable_thinking=True, # 启用模型的深度思考模式(推理优化)thinking_budget=100, # 设置深度思考模式下的预算(单位:token 或计算量)值越大,模型分配的推理资源越多,复杂任务成功率更高。# api_key="...",# other params...)