flutter 如何在提示符中添加“system”消息?

pxiryf3j  于 2023-06-24  发布在  Flutter
关注(0)|答案(3)|浏览(187)

我一直在尝试将gpt-3.5-turbo集成到我的Flutter应用程序中,同时维护聊天记录。我使用FlutterFlow生成样板代码,然后下载代码进行进一步编辑。我已经成功地集成了模型,同时维护了聊天记录,但我无法弄清楚如何将"system"消息添加到prompt中。
下面是API调用代码:

class OpenAIChatGPTGroup {
  static String baseUrl = 'https://api.openai.com/v1';
  static Map<String, String> headers = {
    'Content-Type': 'application/json',
  };
  static SendFullPromptCall sendFullPromptCall = SendFullPromptCall();
}

class SendFullPromptCall {
  Future<ApiCallResponse> call({
    String? apiKey = 'sk-xxxxxxxxxx',
    dynamic? promptJson,
  }) {
    final prompt = _serializeJson(promptJson);
    final body = '''
{
  "messages": ${prompt},
  "temperature": 0.8,
  "model": "gpt-3.5-turbo"
}''';
    return ApiManager.instance.makeApiCall(
      callName: 'Send Full Prompt',
      apiUrl: '${OpenAIChatGPTGroup.baseUrl}/chat/completions',
      callType: ApiCallType.POST,
      headers: {
        ...OpenAIChatGPTGroup.headers,
        'Authorization':
            'Bearer sk-xxxxxxxxxx',
      },
      params: {},
      body: body,
      bodyType: BodyType.JSON,
      returnBody: true,
      encodeBodyUtf8: true,
      decodeUtf8: true,
      cache: false,
    );
  }

  dynamic createdTimestamp(dynamic response) => getJsonField(
        response,
        r'''$.created''',
      );
  dynamic role(dynamic response) => getJsonField(
        response,
        r'''$.choices[:].message.role''',
      );
  dynamic content(dynamic response) => getJsonField(
        response,
        r'''$.choices[:].message.content''',
      );
}

下面是_serializeJson()函数:

String _serializeJson(dynamic jsonVar, [bool isList = false]) {
  jsonVar ??= (isList ? [] : {});
  try {
    return json.encode(jsonVar);
  } catch (_) {
    return isList ? '[]' : '{}';
  }
}

下面是提交按钮的onPressed()函数中的代码:

setState(() {
                                    _model.chatHistory =
                                        functions.saveChatHistory(
                                            _model.chatHistory,
                                            functions.convertToJSON(
                                                _model.textController.text));
                                  });
                                  _model.chatGPTResponse =
                                      await OpenAIChatGPTGroup
                                          .sendFullPromptCall
                                          .call(
                                    apiKey:
                                        'sk-xxxxxxxxxx',
                                    promptJson: _model.chatHistory,
                                  );

下面是saveChatHistory()函数:

dynamic saveChatHistory(
  dynamic chatHistory,
  dynamic newChat,
) {
  // If chatHistory isn't a list, make it a list and then add newChat
  if (chatHistory is List) {
    chatHistory.add(newChat);
    return chatHistory;
  } else {
    return [newChat];
  }
}

下面是convertToJSON()函数:

dynamic convertToJSON(String prompt) {
  // take the prompt and return a JSON with form [{"role": "user", "content": prompt}]
  return json.decode('{"role": "user", "content": "$prompt"}');
}

我尝试在convertToJSON()函数中添加"system"消息,如下所示:

dynamic convertToJSON(String prompt) {
  // take the prompt and return a JSON with form [{"role": "user", "content": prompt}]
  return json.decode('[{"role": "system", "content": "system message"}, {"role": "user", "content": "$prompt"}]');
}

但是这返回了一个400错误代码,表示bad request

kfgdxczn

kfgdxczn1#

我认为当你试图序列化_serializeJson方法上的提示符时,你做错了。
即使您的chatPrompt只有一条消息,您也需要将消息内容定义为List。我会尝试设置你的身体消息硬编码模拟用户和系统之间的对话,以检查你的HTTP请求是否有任何错误。
如果请求处理硬编码体,请确保问题出在序列化方法中。

zxlwwiss

zxlwwiss2#

OpenAI docs have many examples关于如何使用他们的API。对于messages参数的情况,您将拥有一个对象列表。这些对象是组成会话的消息实体。
您可以向系统添加一条初始消息,该消息提供有关系统应如何运行的方向。例如:

{
      "model": "gpt-3.5-turbo",
      "messages": [
        {"role": "system", "content": "You are a helpful assistant."}, 
        {"role": "user", "content": "Hello!"},
        ...
      ]
    }
nxagd54h

nxagd54h3#

您的聊天记录已经是列表,即使它不是列表,保存它也会转换为列表。所以convertToJSON函数应该如下所示。

dynamic convertToJSONForSystem(String prompt) {
  return json.decode('{"role": "system", "content": "$prompt"}');
}

否则,你的body的messages属性就像"messages": "[[{role: system, content: system message}, {role: user, content: Hello}]]",但这是错误的,我们需要像"messages": "[{role: system, content: system message}, {role: user, content: Hello}]"

相关问题