使用langchain来调用AI大模型

32 阅读3分钟

使用langchain调用LLM

安装对应的依赖

  • langchain-openailangchain-deepseek二选一即可,取决于你需要调用的模型是什么
  • 如果使用deepseeklangchain支持的模型,安装对应的依赖包即可 langchain-xxx
  • 如果是langchain不支持的模型,可以伪装成 openai下载langchain-openai包即可
  uv add langchain langchain-openai langchain-deepseek

使用langchain支持的模型

import os
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model

# 加载环境变量
load_dotenv()

model = init_chat_model(model="deepseek-chat")

使用langchain不支持的模型,比如阿里云百炼

""" 
  创建langchain模型实例
  安装对应的依赖
  uv add langchain langchain-openai
"""

import os
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model

# 加载环境变量
load_dotenv()

"""
  一般来说只需要 model  就可以创建一个模型实例
  但是有时候遇到langchain不支持的模型 需要指定其他参数,比如 api_key, base_url, model_provider=openai 等
"""
model = init_chat_model(
  model="qwen3-max", # 不支持 阿里云百炼 所以才伪装成openai模型  如果支持的模型  直接指定 model 就可以
  api_key=os.getenv("DASHSCOPE_API_KEY"),
  base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
  model_provider='openai'
)

调用模型一般有两种方式 invokestream

  • invokestream两个方法的参数 可以是字符串 也可以是列表
  • 如果参数是字符串 则会被直接发送给模型
  • 如果参数是列表 则会被转换为json字符串 发送给给模型
[
  {"role": "system", "content": "你是一个ai助手,不说废话,回答用户的问题,保持回答的简洁"},
  {"role": "user", "content": "你好, 请介绍一下你自己"},
  {"role": "assistant", "content": "你好是一个ai助手,我会回答用户的问题"},
]

使用invoke调用模型,可以直接输出模型的结果

""" 直接输出结果 """
result =model.invoke("你好, 请介绍一下你自己")
print(result.content)

多轮对话可以传入列表

messages = [
    {"role": "system", "content": "你是一个ai助手,不说废话,回答用户的问题,保持回答的简洁"},
    {"role": "user", "content": "你好, 请介绍一下你自己"},
]
result =model.invoke(messages)
print(result.content)

使用stream调用模型,可以像打字机一样的效果输出模型的结果

""" 流式输出结果 """
response = model.stream("你好, 请介绍一下你自己")

for chunk in response:
  print(chunk.content, end="", flush=True)

最终模型会输出结果。

如果是多轮对话 model.stream() 期望接收的是 LangChain 的消息对象,而不是普通的 Python 字典。

# 字典格式 - 不行 ❌
messages = [
    {"role": "system", "content": "..."},
    {"role": "user", "content": "..."}
]

# 消息对象格式 - 可以 ✅
messages = [
    SystemMessage(content="..."),
    HumanMessage(content="...")
]

result =model.stream(messages)
print(result.content)

为什么消息对象可以?

SystemMessage 和 HumanMessage 是 LangChain 定义的消息类,它们:

  • 有预定义的类型属性
  • 实现了必需的方法接口
  • 能被 model.stream() 正确识别和处理

实际原理

当调用 model.stream(messages) 时,LangChain 内部会:

  1. 检查每个消息的类型
  2. 调用消息对象的方法获取内容
  3. 转换为模型 API 需要的格式

字典缺少这些方法,所以会抛出类似于 AttributeError: 'dict' object has no attribute 'type' 的错误。

简单记忆:LangChain 的方法只认 LangChain 的对象类型,不认 Python 原生字典。