在对接大模型 API 或者做二次开发的时候,我们经常遇到这样一个尴尬的情况:上游系统发送过来的数据格式和我们熟悉的 OpenAI 标准格式不一样。

比如,你接到的是一大段纯文本内容,但目标 API 需要的是一个标准的 Messages 数组,里面包含 systemuser 等角色字段。这中间的“格式鸿沟”该怎么填平呢?今天咱们就来聊聊这个具体的实现思路。

痛点分析

假设上游发过来的请求体非常简单,就是一整段 content,可能像这样:

{
  "content": "你好,請自我介紹一下。"
}

然而,你需要转成这样:

{
  "model": "gpt",
  "messages": [
    {
      "role": "system",
      "content": "你是一個得力的助手。"
    },
    {
      "role": "user",
      "content": "你好,請自我介紹一下。"
    }
  ]
}

如果不在中间层做处理,直接把上游的数据丢给下游,肯定会报错。这就需要一个“中间人”做数据清洗和组装。

解决方案架构

要实现这个转换,核心逻辑并不复杂,大致可以分为以下几个步骤:

  1. 构建基础 Shell:新建一个符合目标 API 要求的 JSON 对象,预填好固定的字段(比如 model)。
  2. 注入 System Prompt:由于上游数据里通常没有系统提示词,我们需要在代码里预设或配置一个默认的 system 消息,将其加入 messages 数组。
  3. 封装 User Input:将上游发来的原始 content 提取出来,包装成一个新的 user 对象。
  4. 组装输出:将上述两部分合并,生成最终的请求 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 需要什么结构,再通过代码逻辑把零散的原始数据“塞”进去就行了。这个小技巧在做反代、中转服务或者是系统集成时非常实用。

标签: none

评论已关闭