Prompt NLP应用精选:HTTP请求实战指南
Prompt 在 NLP 中的应用——从一条 HTTP 请求说起
NLP这个词,乍一听确实有点唬人。不过,在大模型时代,我们其实可以把 NLP 相关的事情粗略地分成两大类:
- 文本理解类:情感推断、信息提取、文本分类……给模型一段文字,让它“读懂”并输出结论。
- 多模态生成类:文生图、文生视频、图片编辑……输入文字(甚至多张图片),让模型“生成”全新的内容。
这两类任务表面上看各不相同,但它们的内核却出奇地一致:你设计的 Prompt,决定了模型最终的输出结果。过去做 NLP,几乎每个任务都要单独训练一个专门的模型;现在呢?同一个基础大模型,换一组不同的 Prompt,就能在不同的 NLP 任务之间灵活切换。Prompt 这个存在,摇身一变成为了人与模型之间最通用的接口。
这篇文章打算拿图片生成来举个例子,先看看 Prompt 在多模态任务里到底长什么样,然后一路拆解到底层的 HTTP 请求,把一段 Prompt 究竟是如何送到模型手中的整个过程彻底搞清楚。
一张图片生成 Prompt 长什么样
假设我们要让模型参考三张图片,加上一句文字指令,生成一张全新的图片。大概就是下面这种模式:
图1:一个女生的照片图2:一件衣服的照片图3:一个坐姿的参考图指令:图1中的女生穿着图2中的衣服,按照图3中的姿势坐下
这就是所谓的多模态 Prompt——它的内容不只有文字,还可以包含图片。那么,这段 Prompt 在代码层面最终会变成什么样的数据结构?接着往下看。
先扒开 SDK 的“外壳”,看一次 LLM API 调用的本质
很多刚开始接触大模型开发的朋友,通常都会直接用官方提供的 SDK。几行代码,传个 prompt,结果就回来了,体验确实很爽。但用久了难免会好奇——SDK 在背后到底帮我们做了什么?如果不依赖 SDK,我们能不能自己实现同样的功能?
这次就拿阿里云百炼的多模态图片生成接口来当例子,从最上层的 SDK 写法开始,一路拆到最底层的 HTTP 请求,把 LLM API 调用的本质彻底摊开来看清楚。
先看 SDK 写法
假如我们用 DashScope 的 Node.js SDK 来生成一张图片:
import dashscope from 'dashscope';const res = await dashscope.multimodalGeneration.call({apiKey: process.env.OPENAI_API_KEY,model: 'qwen-image-2.0-pro',input: {message: [{role: 'user',content: [{ image: 'https://xxx/input1.png' },{ image: 'https://xxx/input2.png' },{ image: 'https://xxx/input3.png' },{ text: '图1中的女生穿着图2中的衣服,按照图3中的姿势坐下' }]}]}});
非常简洁对吧?你只需要关心两件事:用哪个模型,传什么内容。至于 URL 是什么、header 怎么拼、body 怎么序列化——SDK 全帮你搞定了,你根本不用操心。
这也是 SDK 最核心的价值所在:把 HTTP 的底层细节封装好,让开发者能专注于业务逻辑本身。
不用 SDK,用原生 fetch 写一次
现在我们不用任何 SDK,直接用 Node.js 原生的 fetch 来发送同样的请求:
import dotenv from 'dotenv';dotenv.config();async function generateImage() {const OPENAI_API_KEY = process.env.OPENAI_API_KEY;const res = await fetch('https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation',{method: 'POST',//请求头headers: { 'Content-Type': 'application/json','Authorization': `Bearer ${OPENAI_API_KEY}`},//请求体body: JSON.stringify({model: 'qwen-image-2.0-pro',input: {message: [{role: 'user',content: [{ image: 'https://xxx/input1.png' },{ image: 'https://xxx/input2.png' },{ image: 'https://xxx/input3.png' },{ text: '图1中的女生穿着图2中的衣服,按照图3中的姿势坐下' }]}]}})});}
代码确实多了一些,但结构非常清晰。你会发现,SDK 版本的 model 和 input.message 原封不动地出现在了 body(请求体)里,只是外面多套了一层 HTTP 请求的外壳。我们来逐块拆解一下。
一次 LLM API 请求的四个组成部分
不管是 OpenAI、Claude、通义千问,还是文生图、文生视频——只要调的是远程大模型服务,本质上都是一次 HTTP POST 请求。而这个请求,由以下四个核心部分组成:
1. URL 地址 —— 请求要发给谁
https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation
这是阿里云百炼的多模态生成接口地址。不同厂商的地址当然不同,比如:
- OpenAI:
https://api.openai.com/v1/chat/completions - 通义千问的文本对话又是另一个地址
但形式都一样——一个标准的 HTTPS 地址,指向某个具体的 API 端点。
2. method: POST —— 用什么方法发
method: 'POST'
为什么不用 GET,非得用 POST?因为要提交的数据(图片链接、文字指令)可能很长,POST 把数据放在 body 里传输,不会像 GET 那样拼在 URL 后面。这样做有两个显而易见的好处:
- 更安全:API Key 和请求数据都不会暴露在 URL 里。
- 容量更大:URL 有长度限制,body 几乎没有。
3. headers 请求头 —— 告诉服务端“我是谁、我发的是什么”
headers: {'Content-Type': 'application/json','Authorization': `Bearer ${OPENAI_API_KEY}`}
这里有两个关键字段:
- Content-Type:告诉服务端,我发送的是 JSON 格式的数据,服务端才知道该怎么解析。
- Authorization:身份鉴权。后面跟上 API Key,服务端会检查这个 Key 是否有效、是否有额度。这就是为什么调用 API 之前,需要先去平台申请一个 Key。
4. body 请求体 —— 真正的“指令”
body: JSON.stringify({model: 'qwen-image-2.0-pro',input: {message: [{role: 'user',content: [{ image: '...' },{ image: '...' },{ image: '...' },{ text: '图1中的模特穿着图2中的衣服,按照图3中的姿势坐下' }]}]}})
这是整个请求的核心,包含了你想让模型做的所有信息:
- model:指定用哪个模型。这里指定的是通义千问的图片 2.0 Pro 版本。
- input.message:对话消息数组。
role: 'user':表示这是用户发的消息。content:消息内容,这里是一个数组,可以同时包含图片(image)和文字(text)——这就是“多模态”的直观体现。
最后需要留意的是,必须使用 JSON.stringify() 把对象转成 JSON 字符串,因为 HTTP 协议传输的是文本,而不是 Ja vaScript 对象。
SDK 与原生 fetch 的关系
SDK 和原生 fetch 的关系,其实就像外卖 App 和自己买菜做饭的关系:
- SDK(外卖 App):打开、点餐、等送达。方便是方便,但你并不关心菜是怎么做的、骑手是怎么送的。
- 原生 fetch(自己做饭):先去买菜(准备 API Key)→ 看看菜谱(查 API 文档里的 URL)→ 下锅开炒(组装 method、headers、body)→ 出锅(等待响应)。
对初学者来说,先用 SDK 快速上手是个不错的选择。但理解底层的 HTTP 请求结构,有两个很实在的好处:
- 排错更快:报 401 错误,你立刻就想到是 API Key 的问题(headers),报 404 错误,你马上能意识到是 URL 写错了。
- 不再被特定 SDK 绑定:哪怕换了一个模型、换了一个厂商,也完全不需要重新学一套新 SDK。直接看 API 文档找到对应的 URL,拼一个请求就可以了。所有 LLM 服务说到底,都遵循着同一个模式。
总结:Prompt 是接口,HTTP 是通道
回到最开始的问题——Prompt 在 NLP 中的应用。
不管是情感推断(发一段文字,让模型判断情绪),还是图片生成(发三张图加一句话,让模型出图),其工作模式都是一样的:
你设计 Prompt → 拼成 HTTP 请求 → 发给模型 → 模型返回结果
- Prompt 是你和模型之间的“接口”:你设计什么样的 Prompt,模型就完成什么样的 NLP 任务。同一套模型,换一组 Prompt,就能从“情感分析”无缝切换到“图片生成”。
- HTTP 是 Prompt 的“传输通道”:无论用 SDK 还是原生 fetch,本质上都是把 Prompt 塞进 POST 请求的 body 里,带上 API Key,发到模型的 API 地址。
POST {API地址}Headers: Content-Type + AuthorizationBody: { model, messages }
万变不离其宗。
