LangChain 1.0 学习笔记:基础配置与对话模型实战
文章目录
- [LangChain 1.0 学习笔记:基础配置与对话模型实战](#LangChain 1.0 学习笔记:基础配置与对话模型实战)
🔗 查看完整专栏(LangChain 1.0 与 LangGraph 学习笔记)
特别说明:
本文为个人学习笔记,内容仅供学习与交流使用,禁止转载或用于商业用途。笔记为个人理解与总结,可能存在疏漏或偏差,欢迎读者参考并自行甄别。

本文为 LangChain 1.0 框架的学习笔记,主要涵盖基础环境验证、单轮与多轮对话的实现,以及流式与非流式输出的对比分析。最后通过构建一个翻译器类,对上述基础核心知识点进行综合应用与代码实践。
1. 环境检查
LangChain 1.0 版本引入了较多底层架构变更,在正式开发前需进行版本验证,以确保运行环境的兼容性并避免潜在的报错。
py
import langchain
if langchain.__version__ >= "1.0.0":
print(f"LangChain 版本验证通过, 当前版本: {langchain.__version__}")
else:
print(f"LangChain 版本过低, 当前版本: {langchain.__version__},请执行升级操作。")
2. 单轮对话基础
LangChain 1.0 简化了模型实例化的流程,开发者无需显式调用各个 AI 供应商的特定类,可通过统一的 init_chat_model 方法进行模型的创建与初始化。
环境依赖要求 :使用特定 AI 提供商的模型时,需确保已安装对应的集成包。例如,调用 OpenAI 或兼容 OpenAI 格式的 API 时,需预先安装
langchain-openai。
2.1 模型初始化
py
from langchain.chat_models import init_chat_model
# 通过环境变量或配置文件加载 BASE_URL 和 API_KEY
model = init_chat_model(
"model-name",
model_provider="openai",
base_url=BASE_URL,
api_key=API_KEY,
)
配置提示 :若使用兼容 OpenAI 接口的第三方模型服务,可将 model_provider 设为 "openai",并相应替换 base_url、api_key 与 model-name 参数,即可实现平滑接入。
2.2 模型输出解析
invoke() 方法的返回值并非单纯的文本字符串,而是包含丰富请求元数据的对象(通常为 AIMessage 类型)。
py
response = model.invoke("Hello, how are you?")
print(response)
AIMessage 结构示例(包含 Token 消耗、停止原因等元数据):
py
content="Hello! I'm doing well, thank you for asking. I'm ready to assist you.\n\nHow can I help you today?"
additional_kwargs={'refusal': None}
response_metadata={'token_usage': {'completion_tokens': 53, 'prompt_tokens': 6, 'total_tokens': 59...}, 'model_provider': 'openai', 'model_name': 'gemini-2.5-flash', 'finish_reason': 'stop'...}
id='lc_run--019c2...-0'
usage_metadata={'input_tokens': 6, 'output_tokens': 53, 'total_tokens': 59}
若仅需提取模型生成的文本内容,可直接调用 .content 属性:
py
response = model.invoke("Hello, how are you?")
print(response.content)
2.3 流式输出 vs 非流式输出
大语言模型的推理输出支持 流式(Streaming) 与 非流式(Non-streaming) 两种模式。两者的技术特性与适用场景对比如下:
| 特性 | 非流式输出 (Non-streaming) | 流式输出 (Streaming) |
|---|---|---|
| 调用方法 | response = model.invoke(prompt) |
for chunk in model.stream(prompt): ... |
| 输出机制 | 推理完成后一次性返回完整对象(如 AIMessage) | 推理过程中分片返回,每次返回一个 Token 或片段(chunk) |
| 控制台打印 | print(response.content) |
print(chunk.content, end="", flush=True) |
| 前端交互 | 存在 I/O 阻塞感,需等待模型全量生成完毕 | 实时响应,呈现打字机效果,降低用户等待焦虑 |
| 适用场景 | 快速验证、后台批处理、日志记录、非交互式任务 | 聊天机器人前端展示、长文本生成、推理过程可视化 |
| 技术优劣 | 优点 :逻辑控制简单,状态稳定 缺点:长文本生成时响应延迟高 | 优点 :首字响应时间(TTFT)极短,体验佳 缺点:需引入循环或异步流处理,逻辑复杂度增加 |
代码实现对比:
-
非流式输出:
pyresponse = model.invoke("Hello, how are you?") print(response.content) -
流式输出:
pyfor chunk in model.stream("Hello, how are you?"): print(chunk.content, end="", flush=True)
技术细节补充 (flush=True):
Python 标准输出(stdout)默认采用行缓冲机制。在流式输出中指定 print(..., flush=True) 可强制绕过缓冲机制,确保每次接收到的模型片段(chunk)被立即刷新至控制台,从而实现平滑的流式视觉效果。
3. 多轮对话实现
LLM API 原生为无状态(Stateless)设计。为实现多轮对话,需在客户端或服务端维护消息历史列表(messages),并将其作为完整的上下文传递给模型。LangChain 提供了标准的消息类集合用于角色管理。
py
from langchain_core.messages import HumanMessage, AIMessage, SystemMessage
# 1. SystemMessage: 定义系统角色、行为规范与全局约束
messages = [
SystemMessage(content="你是一位熟悉各种概念和原理的人工智能专家,一句话回答问题,不要解释。")
]
# 2. HumanMessage: 承载用户的输入指令
user_input = "什么是智能体?"
messages.append(HumanMessage(content=user_input))
# 发起推理请求
response = model.invoke(messages)
# 3. AIMessage: 将模型的输出追加至消息列表,形成上下文闭环
messages.append(AIMessage(content=response.content))
print(response.content)
运行示例

4. 综合实践:构建翻译器模块
本节通过构建 Translator 翻译器类,对模型初始化、消息管理及参数配置进行综合应用示范。
核心设计原则回顾:
- 统一模型实例化 :基于
init_chat_model。 - 结构化消息管理 :通过
SystemMessage与HumanMessage隔离系统指令与用户数据。 - 推理参数控制 :通过
temperature参数控制输出的随机性。对于翻译等确定性要求较高的任务,建议将temperature阈值设定在 0.3 到 0.5 之间。
代码实现
py
from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage, SystemMessage
class Translator:
def __init__(self, base_url: str, api_key: str):
"""
初始化翻译器,配置低 temperature 以保障翻译准确性。
"""
self.model = init_chat_model(
"model-name",
model_provider="model-provider",
base_url=base_url,
api_key=api_key,
temperature=0.3,
)
def translate(self, text: str, target_languages: str="zh-cn", style: str="formal") -> str:
"""
执行翻译任务。
Args:
text: 待翻译文本
target_languages: 目标语言代码
style: 翻译风格 (如 formal, casual)
"""
system_prompt = f"""
You are a helpful assistant that translates text from English to {target_languages}.
The translation should be in the following style: {style}.
"""
messages = [
SystemMessage(content=system_prompt),
HumanMessage(content=text),
]
response = self.model.invoke(messages)
return response.content
# 测试用例
if __name__ == "__main__":
# 配置 API 凭证
BASE_URL = "YOUR_BASE_URL"
API_KEY = "YOUR_API_KEY"
translator = Translator(base_url=BASE_URL, api_key=API_KEY)
source_text = "Hello, how are you?"
target_lang = "zh-cn"
target_style = "formal"
result = translator.translate(source_text, target_lang, target_style)
print(f"[Source]: {source_text}")
print(f"[Translation]: {result}")
模块特性总结
- 职责分离 :
SystemMessage严格控制翻译角色与输出风格(Prompt Engineering)。 - 动态参数化:对外暴露目标语言与文风参数,提升模块通用性。
- 高内聚封装:底层模型调用逻辑对业务层透明,便于集成至更复杂的 LangChain Pipeline 中。