如何将整段文本转换为标准 Chat 消息格式?
在对接大模型 API 或者做二次开发的时候,我们经常遇到这样一个尴尬的情况:上游系统发送过来的数据格式和我们熟悉的 OpenAI 标准格式不一样。
比如,你接到的是一大段纯文本内容,但目标 API 需要的是一个标准的 Messages 数组,里面包含 system、user 等角色字段。这中间的“格式鸿沟”该怎么填平呢?今天咱们就来聊聊这个具体的实现思路。
痛点分析
假设上游发过来的请求体非常简单,就是一整段 content,可能像这样:
{
"content": "你好,請自我介紹一下。"
}
然而,你需要转成这样:
{
"model": "gpt",
"messages": [
{
"role": "system",
"content": "你是一個得力的助手。"
},
{
"role": "user",
"content": "你好,請自我介紹一下。"
}
]
}
如果不在中间层做处理,直接把上游的数据丢给下游,肯定会报错。这就需要一个“中间人”做数据清洗和组装。
解决方案架构
要实现这个转换,核心逻辑并不复杂,大致可以分为以下几个步骤:
- 构建基础 Shell:新建一个符合目标 API 要求的 JSON 对象,预填好固定的字段(比如
model)。 - 注入 System Prompt:由于上游数据里通常没有系统提示词,我们需要在代码里预设或配置一个默认的
system消息,将其加入messages数组。 - 封装 User Input:将上游发来的原始
content提取出来,包装成一个新的user对象。 - 组装输出:将上述两部分合并,生成最终的请求 Body。
代码实现思路
这里我用一个通用的逻辑来演示(JavaScript/Node.js 版本最为常见,Python 思路也类似):
// 1. 模拟上游接收到的原始数据
const rawData = {
content: "你好,請自我介紹一下。"
};
// 2. 定义目标格式与转换逻辑
function transformToStandardFormat(input) {
// 预设 System Prompt (也可以从配置文件读取)
const systemPrompt = "你是一個得力的助手。";
// 构建标准的 messages 数组
const messages = [
{
role: "system",
content: systemPrompt
},
{
role: "user",
content: input.content // 这里就是上游传过来的纯文本
}
];
// 组装最终返回的对象
return {
model: "gpt", // 假设默认使用 gpt 模型
messages: messages
};
}
// 3. 执行转换
const result = transformToStandardFormat(rawData);
console.log(JSON.stringify(result, null, 2));
进阶思考:更灵活的配置
上面的代码是硬编码了 System Prompt,但在实际生产环境中,你可能希望这个 Prompt 是可配置的,或者根据不同的业务场景动态变化。
- 配置化:将 System Prompt 提取到环境变量或配置中心。
- 多模态支持:如果上游不仅仅发文本,还有图片,你需要在
user消息里调整content的结构(比如变成数组形式包含type: "text"和type: "image_url")。
总结
所谓的“格式转换”,本质上就是数据的重组与封装。理解了目标 API 需要什么结构,再通过代码逻辑把零散的原始数据“塞”进去就行了。这个小技巧在做反代、中转服务或者是系统集成时非常实用。
评论已关闭