【LangChain】-- 定义聊天模型

1. 方式一:直接API调用--DeepSeek

这种方式相当于是三方集成包提供的。

聊天模型的API KEY,可以在定义的时候可以直接写在里面,也可以配置在环境变量中(推荐配置在环境变量中)。

!\[Pasted image 20260605131142.png]

python 复制代码
from langchain_core.messages import HumanMessage, SystemMessage  
from langchain_deepseek import ChatDeepSeek
  
# 1. 定义 DeepSeek 模型  
model = ChatDeepSeek(  
    model="deepseek-chat",  
    # api_key="sk-34a424135c6d499e91ab32951a4ec0bf"  
)  
  
# 2. 定义消息(保持不变)  
messages = [  
    SystemMessage(content="请帮我进行翻译,由英文翻译成中文!"),  
    HumanMessage(content="my name is xiaobu")  
]  
  
# 3. 调用大模型  
result = model.invoke(messages)  
print(result)  # 输出翻译结果  

ChatDeepSeek继承了BaseChatOpenAI,BaseChatOpenAI实现了标准的Runnable接口。

chat DeepSeek常用初始化参数说明

python 复制代码
from langchain_deepseek import ChatDeepSeek  
  
model = ChatDeepSeek(  
    model="...",      # 要使用的 OpenAI 模型的名称
    temperature=0,    # 采样温度,温度值越高,AI 回答越天马行空;温度越低,回答越保守靠谱。有些模型的温度范围是0~1,有的是0~2.
    max_tokens=None,  # 输出文本的最大token数(英文:一个token约等于4个字符或者0.75个单词;中文:一个汉字约等于1.5-2个token)
    timeout=None,     # 请求超时时间
    max_retries=2,    # 最大重试次数
    # api_key="...",  # API密钥
    # other params...
)  

2. 方式二:init_chat_model

相当于是langchain包提供的。Langchain封装了更上层的方法,让我们初始化模型。这种方法可以定义所有的大模型,这就体现出来了LangChain的封装性,所有的大模型都只需要实现一种标准。

2.1 基本用法

python 复制代码
from langchain.chat_models import init_chat_model 
 
# 第二种定义聊天模型的方式 
# 指定厂商 和 模型名称
# 返回的是Runnable实例
deepseek_model = init_chat_model(model="deepseek-chat", model_provider="deepseek")  
  
print(f"deepseek-chat:{deepseek_model.invoke("你是谁?").content}")

可以看到它就是创建了一个ChatDeepSeek。

!\[Pasted image 20260605140236.png]

上面API调用可以设置的初始化参数,这种方式也同样支持。

2.2 可配置模型(模型模拟器)

python 复制代码
from langchain.chat_models import init_chat_model

# 定义可配置模型(模型模拟器)  
config_model = init_chat_model()  
print(f"deepseek-chat:{config_model.invoke("你是谁?").content}")

直接这样调用是会报错的。

!\[Pasted image 20260605142146.png\|479]

在调试中可以看到,这是一个可配置模型,不是一个真正的模型,只是初始化了一下,并没有实际的定义出来model.

!\[Pasted image 20260605142446.png]

这个模型模拟器在运行的时候才能被定义出来,在进行invoke的时候,invoke方法中有一个配置字段,可以对其进行配置:

python 复制代码
@abstractmethod  
# 这是一个抽象方法
def invoke(  
    self,  
    input: Input,  # 输入一个Runnable实例,可以Message, 聊天模型也可以直接传入一个字符串
    config: RunnableConfig | None = None,  # 是配置runnable实例的选项(input选项传入了一个Runnable,config选项就对这个Runnable进行配置),config就相当于是input的一个辅助工具。
    **kwargs: Any,  
) -> Output:
python 复制代码
from langchain.chat_models import init_chat_model  
from langchain_core.messages import SystemMessage, HumanMessage  
  
# 定义可配置模型(模型模拟器)  
config_model = init_chat_model()  
  
# 定义消息
messages = [  
    SystemMessage(content="请帮我进行翻译,由英文翻译成中文!"),  
    HumanMessage(content="my name is xiaobu")  
]  

print(f"deepseek-chat:{config_model.invoke(input=messages, config={"configurable": {"model": "deepseek-chat"}}).content}")

2.3 可配置模型(带默认配置值)

python 复制代码
from langchain.chat_models import init_chat_model  
from langchain_core.messages import SystemMessage, HumanMessage  
  
  
deepseek_model = init_chat_model(  
    model="deepseek-chat",  
    model_provider="deepseek",  
    temperature=0.3,  
    max_tokens=1024,  # 无法直接修改已经存在的属性  
    configurable_fields=["max_tokens"], # 配置可修改的字段,当然其他字段都可以配置进去,都可以在后续进行修改,包括模型  
    config_prefix="first" # 指定可修改字段的前缀  
)  
messages=[  
    SystemMessage(content="请补全一段故事,100个字以内"),  
    HumanMessage(content="一只猫正在  "),  
]  
  
# 我们想一次完成两个版本的的输出(1. 原本的版本;2. 精简之后的版本)  
result = deepseek_model.invoke(  
    input = messages,  
    config = {  
        "configurable" : {  
            "first_max_tokens" : 10, #修改带有默认配置的字段(要加上前缀)  
        }  
    }  
)  
  
# 输出结果:一只猫正在窗台上打盹,忽然  
print(result.content)

3. 与原生大模型调用的区别

!\[Pasted image 20260605131825.png]

  • 消息封装 :LangChain 使用 SystemMessage、HumanMessage、AIMessage 等标准化消息类型,自动管理角色 ,原生调用需要手动构造 "role": "user" 字典。

  • 统一调用接口 :无论底层是 OpenAI、DeepSeek 还是本地模型,都通过 model.invoke() 调用,更换模型无需修改调用逻辑。

  • 返回对象 :invoke 返回 AIMessage,可以直接获取 .content,还附带 response_metadata 等额外信息;原生调用只返回纯 JSON。

  • 与链/Agent 集成 :LangChain 封装的模型可以直接传入 PromptTemplate、Chain、Agent 中,构成可组合的工作流;原生调用需要手动处理每一步的输入输出拼接。

  • 对话历史管理:LangChain 会自动将消息列表传递并处理多轮对话,原生调用需要自行维护并拼接历史消息。

  • 流式输出 :通过 model.stream() 一句代码实现流式响应,原生需要处理 SSE 或分块解析。

    通俗理解:原生调用是"裸调",你得自己拼请求、解响应、管状态;LangChain 封装像一个"适配器",把异构的模型服务统一成标准件,方便你拼装复杂应用。

相关推荐
破烂三角裤17 小时前
AI 没有记忆?我给儿童故事 Agent 搭了一套“长期记忆”系统
langchain
云和数据.ChenGuang18 小时前
光哥说Python 异常深度解析:从异常模型到工程化实践
java·前端·人工智能·python·langchain
Maiko Star1 天前
【HM-LC】LangChain RAG查询优化详解:查询重写、混合检索与重排序实战
langchain·rag
2501_913061341 天前
MCP核心能力
langchain
小林ixn1 天前
从线性 RAG 到 Agentic RAG:用 LangGraph 搭一个会判断、会纠错、会兜底的检索闭环
langchain·llm·agent
kyrie_sakura1 天前
大模型学习19 大模型学习 - LangChain2_Retrieval(RAG-文档处理-向量处理检索-Milvus)
学习·langchain·milvus
承渊政道1 天前
【大模型应用开发:基于GPT-4和ChatGPT】(使用LangChain框架和插件增强LLM的功能)
chatgpt·langchain·llm·框架·大模型应用开发
日日大王学编程1 天前
LangGraph 基本用法详解:从入门到实战
python·语言模型·langchain
奔跑的熊猫1 天前
VSCode + FastAPI +AI Agent+langchain第一个程序
langchain·fastapi
Maiko Star1 天前
*【HM-LC】Milvus向量库详解:Collection、索引、混合检索与LangChain实战
langchain·milvus