在大语言模型(LLM)与智能体(Agent)开发生态中,开发者经常需要在不同的接口规范、底层 SDK、应用框架以及编程语言之间切换。要真正掌握大模型调用的精髓,不能只停留在"复制粘贴代码"的层面,而应建立一个从演进脉络 到多维度横向对比的清晰知识体系。
本文面向广大开发者,通过"演进脉络代码化 → API 规范对齐 → 语言生态对比 → 生产级实战代码(含单次、流式与 LangChain 完整实战)"的递进逻辑,带你彻底打通大模型调用的技术闭环。
第一部分:从 cURL 到 LangChain ------ 调用方式的代码演进脉络
大模型调用的发展,本质上是一个不断将网络协议、状态管理和业务逻辑进行抽象封装的过程。我们可以通过以下四个阶段的核心代码对比,看清其演变逻辑:
阶段一:cURL 命令行原语(底层网络调试)
-
特点:无运行时依赖,直接发起底层 HTTP 请求。
-
代码示例:
Bashcurl https://api.openai.com/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-your-api-key" \ -d '{"model": "gpt-4o", "messages": [{"role": "user", "content": "你好"}]}'
阶段二:原始 HTTP 请求库(将网络能力植入程序)
-
特点 :引入语言自带或第三方网络库(如 Python 的
requests),将请求参数化。 -
代码示例(Python) :
Pythonimport requests response = requests.post( "https://api.openai.com/v1/chat/completions", headers={"Authorization": "Bearer sk-your-api-key"}, json={"model": "gpt-4o", "messages": [{"role": "user", "content": "你好"}]} ) print(response.json()["choices"][0]["message"]["content"])
阶段三:厂商 SDK 封装(工业级客户端)
-
特点:屏蔽底层 URL、Headers 和 SSE 流式解析细节,提供面向对象的强类型接口。
-
代码示例(Python) :
Pythonfrom openai import OpenAI client = OpenAI( api_key="sk-your-api-key", base_url="https://api.openai.com/v1" ) response = client.chat.completions.create( model="gpt-4o", messages=[{"role": "user", "content": "你好"}] ) print(response.choices[0].message.content)
阶段四:LangChain 应用框架(业务编排与组件化)
-
特点:引入提示词模板(Prompt)、声明式管道(Pipe)与外部工具链,解决 RAG 和 Agent 编排问题。
-
代码示例(Python) :
Pythonfrom langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI prompt = ChatPromptTemplate.from_template("讲个关于{topic}的笑话") model = ChatOpenAI( model="gpt-4o", api_key="sk-your-api-key", base_url="https://api.openai.com/v1" ) chain = prompt | model # 声明式管道链式调用 result = chain.invoke({"topic": "开发者"}) print(result.content)
第二部分:API 规范的分化与兼容统一(OpenAI vs Anthropic)
虽然 SDK 简化了调用,但厂商之间的 API 格式分化 是开发者必须面对的痛点。目前主要存在两大规范:
| 对比维度 | OpenAI 规范 (兼容 DeepSeek、GLM、vLLM 等) | Anthropic 规范 (Claude) |
|---|---|---|
| 请求路径 (URL) | /v1/chat/completions |
/v1/messages |
| 认证 Header | Authorization: Bearer <Key> |
x-api-key: <Key> |
| 版本控制 Header | 无需显式指定 | 必须指定 anthropic-version: 2023-06-01 |
| System Prompt | 混在 messages 数组中(role: "system") |
独立为顶级参数(system: "...") |
| Max Tokens | 可选(默认为模型最大长度) | 强制必填 (max_tokens: 1024) |
| 返回值解析路径 | response.choices[0].message.content |
response.content[0].text |
注:在工程中,通常通过 LiteLLM 统一网关或 LangChain 抽象层,将 Anthropic 格式无缝转换为 OpenAI 风格进行统一处理。
第三部分:语言生态对决 ------ Python vs Node.js (TypeScript) 基础示例对比
对于开发者而言,Python 与 Node.js 是 AI 开发的两大主力。它们的 API 设计高度镜像,但在异步处理 和语法风格上有明显差异。
1. OpenAI SDK 基础调用对比
-
Python 版本(默认同步,需显式声明异步客户端) :
Pythonfrom openai import OpenAI client = OpenAI( api_key="sk-your-api-key", base_url="https://api.openai.com/v1" ) response = client.chat.completions.create( model="gpt-4o", messages=[{"role": "user", "content": "讲个笑话"}] ) print(response.choices[0].message.content) -
Node.js / TypeScript 版本(原生全异步,必须使用
await) :TypeScriptimport OpenAI from "openai"; const client = new OpenAI({ apiKey: "sk-your-api-key", baseURL: "https://api.openai.com/v1" }); const response = await client.chat.completions.create({ model: "gpt-4o", messages: [{ role: "user", content: "讲个笑话" }] }); console.log(response.choices[0].message.content);
2. LangChain 基础调用对比
-
Python 版本(使用管道符
|) :Pythonfrom langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI prompt = ChatPromptTemplate.from_template("讲个关于{topic}的笑话") model = ChatOpenAI( model="gpt-4o", api_key="sk-your-api-key", base_url="https://api.openai.com/v1" ) chain = prompt | model result = chain.invoke({"topic": "开发者"}) print(result.content) -
Node.js / TypeScript 版本(使用
.pipe()方法) :TypeScriptimport { ChatPromptTemplate } from "@langchain/core/prompts"; import { ChatOpenAI } from "@langchain/openai"; const prompt = ChatPromptTemplate.from_template("讲个关于{topic}的笑话"); const model = new ChatOpenAI({ model: "gpt-4o", apiKey: "sk-your-api-key", configuration: { baseURL: "https://api.openai.com/v1" } }); const chain = prompt.pipe(model); const result = await chain.invoke({ topic: "开发者" }); console.log(result.content);
第四部分:生产级核心实战代码(OpenAI SDK 与 LangChain 演练)
在日常业务开发中,掌握 OpenAI SDK 的单次与流式调用 以及 LangChain 的单次与流式调用 是核心基本功(所有示例均完整配置了 base_url,方便无缝对接 DeepSeek 等兼容网关)。
场景一:OpenAI SDK 实战
1. 单次同步调用(Standard Completion)
Python
from openai import OpenAI
# 完整传入 api_key 与 base_url(可替换为 DeepSeek 等兼容网关地址)
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.openai.com/v1"
)
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是一个严谨的代码审查助手。"},
{"role": "user", "content": "请用一句话解释什么是大模型 SDK。"}
],
temperature=0.2,
max_tokens=150
)
print("OpenAI SDK 单次调用回复:", response.choices[0].message.content)
2. 流式调用(Streaming ------ 打字机效果)
Python
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.openai.com/v1"
)
stream = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "写一篇 300 字的微型科幻小说。"}],
stream=True
)
print("OpenAI SDK 流式输出中:", end="", flush=True)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
print()
场景二:LangChain 框架实战
1. 单次调用(Invoke 模式)
利用 LangChain 的 ChatPromptTemplate 和管道符,轻松实现结构化的提示词封装与模型调用。
Python
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# 1. 定义带有变量的提示词模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个资深的{role}。"),
("user", "请针对以下需求给出设计方案:{requirement}")
])
# 2. 初始化模型(显式指定 base_url)
model = ChatOpenAI(
model="gpt-4o",
api_key="YOUR_API_KEY",
base_url="https://api.openai.com/v1",
temperature=0.3
)
# 3. 使用管道符组合成链
chain = prompt | model
# 4. 执行调用并传入变量
result = chain.invoke({
"role": "前端架构师",
"requirement": "设计一个高性能的微前端主应用加载方案"
})
print("LangChain 单次调用结果:\n", result.content)
2. 流式调用(Stream 模式)
LangChain 同样原生支持流式输出,配合 .stream() 方法可以无缝对接前端的实时打字机渲染。
Python
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
prompt = ChatPromptTemplate.from_template("讲个关于{topic}的幽默故事,字数在 200 字以内。")
model = ChatOpenAI(
model="gpt-4o",
api_key="YOUR_API_KEY",
base_url="https://api.openai.com/v1"
)
chain = prompt | model
print("LangChain 流式输出中:", end="", flush=True)
# 使用链的 stream 方法实时接收数据块
for chunk in chain.stream({"topic": "开发者加班"}):
if chunk.content:
print(chunk.content, end="", flush=True)
print()
结语
从底层的 cURL 到工业级底座 SDK ,再到上层的 LangChain 编排框架,大模型调用的工具链越来越厚。但对于开发者而言,核心关注点已经从早期的"网络协议解析、长连接 SSE 处理"解放到了"提示词工程、业务模板封装与智能体架构"上。掌握不同语言(Python / Node.js)的映射关系、标准 API 范式以及 LangChain 的链式操作,能让你在多变的技术栈选型中游刃有余。