查看: 55|回复: 1

Python通过LangChain调用LLM模型:ChatOpenAI配置与流式/非流式实践

[复制链接]
发表于 3 小时前 | 显示全部楼层 |阅读模式
在构建Agent应用时,最基础的一步就是通过LangChain调用大语言模型(LLM)。LangChain并非模型本身,而是一套AI应用开发框架,负责统一管理模型调用、消息组织、提示词模板、工具集成等。其中,模型入口层是核心,后续的Tool、RAG、Memory、LangGraph都围绕模型调用和消息流转展开。本文以ChatOpenAI为例,展示如何用Python通过LangChain完成一次完整的LLM调用,包括非流式与流式两种方式。

LangChain通过langchain-openai包提供对OpenAI接口格式的支持。这个包不仅支持OpenAI官方模型,也兼容DeepSeek、代理网关等第三方服务——只要它们实现了相同的请求格式。配置时只需修改base_url即可切换模型服务端。

安装依赖
推荐使用uv管理项目依赖,执行命令:
  1. uv add langchain-openai python-dotenv
复制代码
如果临时使用pip,也可以:
  1. pip install langchain-openai python-dotenv
复制代码
langchain-openai负责模型集成,python-dotenv用于从.env文件读取环境变量。

环境变量配置
以DeepSeek为例,在项目根目录创建.env文件,写入以下内容:
  1. LLM_MODEL=deepseek-v4-pro
  2. LLM_API_KEY=your_deepseek_api_key_here
  3. LLM_BASE_URL=https://api.deepseek.com
复制代码
说明:
- LLM_MODEL:模型名称,DeepSeek当前可用deepseek-v4-flash或deepseek-v4-pro。
- LLM_API_KEY:在DeepSeek平台申请的API Key。
- LLM_BASE_URL:接口地址,DeepSeek兼容OpenAI格式,因此填入https://api.deepseek.com。若使用OpenAI官方服务,可省略此变量或设为官方地址。

创建模型实例
编写两个辅助函数:required_env()用于校验必填环境变量,create_model()用于统一创建ChatOpenAI实例。这样能避免每个调用点重复配置,并在启动时暴露缺失的变量。
  1. import os
  2. from dotenv import load_dotenv
  3. from langchain_openai import ChatOpenAI
  4. load_dotenv()
  5. def required_env(name: str) -> str:
  6.     value = os.getenv(name)
  7.     if not value:
  8.         raise RuntimeError(f"Missing environment variable: {name}")
  9.     return value
  10. def create_model() -> ChatOpenAI:
  11.     base_url = os.getenv("LLM_BASE_URL")
  12.     model_kwargs = {
  13.         "model": required_env("LLM_MODEL"),
  14.         "api_key": required_env("LLM_API_KEY"),
  15.         "temperature": 0.2,
  16.         "timeout": 30,
  17.         "max_retries": 2,
  18.     }
  19.     if base_url:
  20.         model_kwargs["base_url"] = base_url
  21.     return ChatOpenAI(**model_kwargs)
复制代码

非流式调用 (invoke)
invoke会等待模型完整生成所有内容后一次性返回。返回对象是AIMessage,其content属性包含回复文本。
  1. def invoke_demo() -> None:
  2.     model = create_model()
  3.     response = model.invoke([
  4.         {"role": "user", "content": "用三句话解释 LangChain 是什么。"}
  5.     ])
  6.     print(response.content)
复制代码
注意:invoke返回的AIMessage中还有tool_calls字段,当模型需要调用工具时会存放调用意图,这在后续学习Tool时非常重要。

流式调用 (stream)
stream适合聊天界面或长文本生成的实时输出,它会将生成的内容分段(chunk)依次返回。
  1. import sys
  2. def stream_demo() -> None:
  3.     model = create_model()
  4.     stream = model.stream([
  5.         {"role": "user", "content": "介绍一下重庆火锅文化。"}
  6.     ])
  7.     for chunk in stream:
  8.         if isinstance(chunk.content, str):
  9.             sys.stdout.write(chunk.content)
  10.             sys.stdout.flush()
  11.     sys.stdout.write("\n")
复制代码
每个chunk是一个AIMessageChunk对象,文本内容存储在content属性中。

参数分类与说明
ChatOpenAI初始化时的参数可归为三类:
1. 连接参数:api_key(密钥,应从环境变量读取)、base_url(服务地址,可省略或自定义)、model(模型名称,建议放环境变量以便切换)。
2. 生成控制参数:temperature(控制随机性,代码/抽取类任务设低值,创意任务设高值)、max_tokens(限制输出长度)、top_p(一般先调temperature,避免同时调节两个)。
3. 请求控制参数:timeout(超时秒数,防止网络卡死)、max_retries(失败重试次数,应对临时波动)。

小结
本文核心要点:
- ChatOpenAI是LangChain的模型调用层,通过它可连接OpenAI或兼容接口的第三方服务。
- invoke用于一次性完整回复,stream用于实时流式输出。
- 参数按连接、模型选择、生成控制、请求控制四个维度理解,有助于灵活调优。

掌握这些基本操作,就打通了Agent应用开发中模型调用的入口,后续学习Tool、RAG、Memory等将更加顺畅。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python通过LangChain调用LLM模型:ChatOpenAI配置与流式/非流式实践

非常感谢楼主这么详细的分享!从环境变量配置到模型实例创建,再到流式和非流式调用的代码示例,步骤非常清晰,对新手很友好。特别是把参数分成连接、生成控制和请求控制三类来讲解,让人一目了然。我最近也在尝试用LangChain对接不同的模型服务,看到您用base_url切换第三方服务的方式很实用,后续我也准备试试DeepSeek。想请教一下,在实际项目中,您通常怎么处理流式输出的chunk合并?直接拼接content会不会丢失一些中间状态信息?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-15 13:07 , Processed in 0.031867 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部