【OpenAI】ChatGPT関数呼び出しの実践 | JD Cloudテクニカルチーム

6 月 13 日、OpenAI は、開発者が API を介して ChatGPT プラグインと同様のデータ対話機能を実装できるように、新しい関数呼び出し (Function Calling) 機能を Chat Completions API に追加しました。

著者の以前の記事「プライベート フレームワーク コード生成の実践」に基づいて、この記事でも引き続き自然言語ローコード構築シナリオをケースとして使用し、ベクトル検索 (Embedding) を埋め込んでプライベート ナレッジ ベースを取得する方法を関数呼び出しに置き換えます。知識ベース管理のための構造化データ構造とリレーショナル データベースに精通しています。同時に、関数呼び出し機能の柔軟性と拡張性は、ユーザーが自然言語を使用してより複雑なページ コンテンツを構築し、より豊富な対話型操作を実行するのにも役立ちます。

1. 関数呼び出しとは

Function Calling は、6 月 13 日に OpenAI によってリリースされた新機能です。公式ブログの説明によると、関数呼び出し機能により、呼び出される関数情報と関数呼び出し時に渡されるパラメーター情報を含む関数呼び出しを要求するメッセージをモデルが出力できるようになります。これは、GPT 機能を外部ツール/API に接続する新しい方法です。

関数呼び出しをサポートした新モデルでは、ユーザーの入力に応じていつどの関数を呼び出す必要があるかを判断し、対象関数の記述に応じて要件を満たすリクエストパラメータを生成することができます。

開発者は、関数呼び出し機能を使用して、GPT を通じて実装できます。

  • 自然言語でコミュニケーションする場合は、外部ツール (ChatGPT プラグインと同様) を呼び出して質問に答えます。
  • 自然言語を、API を呼び出すときに使用されるパラメーター、またはデータベースにクエリを実行するときに使用される条件に変換します。
  • テキストから構造化データを抽出します。待って

2. 関数呼び出しの使い方

関数呼び出し機能は、チャット API (チャットコンプリーション) を通じて使用できます。関数呼び出し機能を実現するために、OpenAI はチャット API を変更し、新しいリクエスト パラメーター、応答タイプ、メッセージ ロールを追加しました。アプリケーション開発者は次のことを行う必要があります。

  1. アプリケーションが提供する呼び出し可能な関数の情報を記述した情報をリクエストパラメータでチャット API に渡します。
  2. チャット API 応答のメッセージ タイプを分析し、関数を呼び出す必要があるとモデルが判断した場合は、モデルから返された関数情報と関数パラメーターに従って関数を呼び出し、返された結果を取得します。
  3. 関数から返された結果をメッセージ リストに追加し、チャット API を再度呼び出します。

1. サポート機能情報を記述するリクエストパラメータを追加

2 つの新しいリクエスト本文パラメータがチャット API に追加されました。

functions

現在のアプリケーションが呼び出すことができる関数のリスト。関数情報には、関数の名前、自然言語記述、関数がサポートするパラメータ情報が含まれます。

functionsパラメータの形式は次のとおりです。

openai.createChatCompletion({
  model: "gpt-3.5-turbo-0613",
  messages: [
    // ...
  ],
  functions: [
    {
      name: 'function_name',
      description: '该函数所具备能力的自然语言描述',
      parameters: {
        type: 'object',
        properties: {
          argument_name: {
            type: 'string',
            description: '该参数的自然语言描述'
          },
          // ...
        },
        required: ['argument_name']
      }
    },
    // ...
  ]
})




functionsこのパラメーターは、次のような関数情報の複数のグループを配列形式で入力することをサポートします。

  • name:関数名。後続のモデルは、関数を呼び出す必要があるときにこの名前を返します。

  • description: 機能の説明。モデルはこの記述により関数の能力を理解し、その関数を呼び出す必要があるかどうかを判断します。

  • parameters.properties: 関数に必要なパラメータ。関数に必要なパラメータをオブジェクトの形式で記述します。オブジェクトのキーはパラメータ名です。

    • type:パラメータのタイプ。JSON スキーマプロトコルをサポートします
    • description:パラメータの説明。
  • required: 必須パラメータのパラメータ名のリスト。

function_call

モデルが関数の転置にどのように応答するかを制御します。いくつかの入力がサポートされています。

  1. "none": モデルは関数を呼び出しませんが、コンテンツを直接返します。呼び出し可能関数が提供されていない場合のデフォルト値。
  2. "auto": モデルは、関数を呼び出すかどうか、およびユーザー入力に基づいてどの関数を呼び出すかについて独自に決定します。呼び出し可能オブジェクトが提供される場合のデフォルト値。
  3. {"name": "function_name"}: モデルに指定された関数を強制的に呼び出します。

2. 応答パラメータを特定し、呼び出す必要がある関数情報を記述します。

チャット API は、応答コンテンツのオプション ()choicesで 2 つの応答パラメータを提供します。

finish_reason

応答コンテンツの終了理由。

考えられる原因は次のとおりです。

  • stop: 完全なメッセージが返されました。
  • length:パラメータでmax_tokens設定されたトークン制限または上限に達しました。
  • function_call: モデルは、関数を呼び出す必要があると判断します。
  • content_filter: コンテンツによってブロック ポリシーがトリガーされ、返されたコンテンツは無視されます。
  • null: API 応答はまだ実行中です。

このうち、 を返す場合はfunction_call、モデルが関数を呼び出す必要があることを意味します。このとき、messageパラメータは関数情報と関数パラメータ情報を追加で返します。

message.function_call

応答内容の終了の理由がモデルが関数を呼び出す必要がある場合、message関数情報を記述するパラメーターがパラメーターに追加されfunction_call、その形式は次のとおりです。

  • name:関数名。
  • arguments: 関数のパラメータ情報。JSON 文字列形式。

3. ダイアログの役割を追加、関数の戻り値をメッセージリストに追加

関数の実行後、関数から返された内容をメッセージ リストに追加し、完全なメッセージ リストを保持してチャット API を再度要求し、GPT のその後の応答を取得できます。

メッセージ リストでは、元のシステム( system)、ユーザー( user)、およびアシスタント( )に加えてassistant、ロールのオプションの値は新しいタイプの関数( function) であり、関数呼び出しの戻り内容を識別するために使用されます。メッセージが発行されたとき。

注: 関数呼び出し応答メッセージをメッセージ リストに追加する前に、前の手順でモデルによって返されたメッセージをメッセージ リストに追加して、メッセージ リスト内のコンテキストの整合性を確保する必要があります。

完全な使用コード

const { Configuration, OpenAIApi } = require("openai");
const openai = new OpenAIApi(new Configuration({ /** OpenAI 配置 */ }));

/** 系统角色信息 **/
const systemPrompt: string = "系统角色prompt";

/** 支持函数信息 **/
const functionsPrompt: unknow[] = [
  {
    name: 'function_name',
    description: '函数功能的自然语言描述',
    parameters: {
      type: 'object',
      properties: {
        argument_name: {
          type: 'string',
          description: '该参数的自然语言描述'
        },
        // ...
      }
    }
  },
  // ...
];

/** 支持函数逻辑 **/
const functionsCalls: { [name: string]: Function } = {
  function_name: (args: { argument_name: string }) => {
    const { argument_name } = args;
    // ...
    return '函数调用结果'
  },
  // ...
}

/** 开始聊天 **/
const chat = async (userPrompt: string) => {
  const messages: unknow[] = [
    { role: 'system', content: systemPrompt },
    { role: 'user', content: userPrompt }
  ];
  
  let maxCall = 6;
  while (maxCall--) {
    const responseData = await openai.createChatCompletion({
      model: "gpt-3.5-turbo-0613",
      messages,
      functions,
      function_call: maxCall === 0 ? 'none' : 'auto'
    }).then((response) => response.data.choices[0]);
  
    const message = responseData.message
    messages.push(message)

    const finishReason = responseData.finish_reason
    if (finishReason === 'function_call') {
      const functionName = message.function_call.name
      const functionCall = functionCalls[functionName]
      const functionArguments = JSON.parse(message.function_call.arguments)
      const functionResponse = await functionCall(functionArguments)
      messages.push({
        role: 'function',
        name: functionName,
        content: functionResponse
      })
    } else {
      return message.content
    }
  }
}




3. ローコード自然言語構築の事例

著者の以前の記事では、埋め込みベクトル検索によって提供される「検索質問ソリューション」がローコード プライベート プロトコル アクセスに使用されました。この記事では、代わりに関数呼び出しを使用します。

同時に、関数を呼び出す機能に基づいて、より複雑なページ構築機能とローコード プラットフォーム関数も検討されています。

1. プライベートプロトコルアクセス

ローコードプラットフォームのプライベートプロトコルに基づいて、CMSタイプのページを構築する際にプロトコルの知識をいくつかのレベルに分け、プライベートプロトコルへのアクセスを実現するためにGPTがオンデマンドで呼び出す機能を提供します。

システム説明情報

const systemPropmpt = `使用CCMS协议编写页面的配置信息。

                       CCMS协议所支持的页面类型包括:
                       - *form*:表单页
                       - *table*:表格页
                       - *detail*:详情页`;




機能情報の説明

const functionsPrompt = [
  {
    name: 'get_elements',
    description: '获取CCMS协议在指定页面类型下,所支持的元素类型。',
    parameters: {
      type: 'object',
      properties: {
        page: {
          type: 'array',
          description: '页面类型',
          items: { type: 'string' }
        }
      }
    },
    required: ['page']
  },
  {
    name: 'get_features',
    description: '获取CCMS协议在指定元素类型下,所支持的配置化特性。',
    parameters: {
      type: 'object',
      properties: {
        element: {
          type: 'array',
          description: '元素类型',
          items: { type: 'string' }
        }
      }
    },
    required: ['element']
  },
  {
    name: 'get_descriptions',
    description: '获取CCMS协议下,指定页面类型、元素类型以及配置化特性的详细信息。',
    parameters: {
      type: 'object',
      properties: {
        page: {
          type: 'array',
          description: '页面类型',
          items: { type: 'string' }
        },
        element: {
          type: 'array',
          description: '元素类型',
          items: { type: 'string' }
        },
        feature: {
          type: 'array',
          description: '配置化特性',
          items: { type: 'string' }
        }
      }
    }
  }
]




備考: GPT モデルは関数の循環呼び出しをサポートしていますが、API 呼び出しの頻度を減らし、トークンの消費を節約するために、プライベート プロトコル情報をクエリする関数では、キーワード配列の形式でバッチ クエリを実行することをお勧めします。

機能内容

const functionsCalls = {
  get_elements: (args: { page: string[] }) => {
    const { page } = args;
    // 请自行实现信息查询,下列返回内容仅为示例。
    return page.map((pageType) => {
      switch (pageType) {
        case 'form':
          return `# **form**表单页所支持的元素类型包括:

                  - *form_text*:文本输入框
                  - *form_number*: 数值输入框`;
        default:
          return `# **${pageType}**没有支持的元素。`
      }
    }).join("\n\n");
  },
  get_features: (args: { element: string[] }) => {
    const { element } = args
    // 请自行实现信息查询,下列返回内容仅为示例。
    return element.map((elementKey) => {
      const [ pageType, elementType ] = elementKey.split('_');
      switch (pageType) {
        case 'form':
          switch (elementType) {
            case 'text':
              return `# **form_text**(文本输入框)所支持的配置化特性包括:

                      - *form_text_maxLength*: 文本最大长度限制
                      - *form_text_minLength*: 文本最小长度限制
                      - *form_text_regExp*: 文本正则表达式校验`
            default:
              return `# **${elementKey}**没有支持的配置化特性。`
          }
        default:
          return `# **${elementKey}**没有支持的配置化特性。`
      }
    }).join("\n\n");
  },
  get_descriptions: (args: { page: string[], element: string[], feature: string[] }) => {
    const {
      page = [],
      element = [],
      feature = []
    } = args
    // 请自行实现信息查询,下列返回内容仅为示例。
    return [
      ...page.map((pageType) => `# **${pageType}**的详细描述如下:...`),
      ...element.map((elementType) => `# **${elementType}**的详细描述如下:...`),
      ...feature.map((featureType) => `# **${featureType}**的详细描述如下:...`)
    ].join("\n\n")
  }
}




電話の例

完全な通話のメッセージのリスト:

読みやすくするために、メッセージ リスト内のメッセージ コンテンツのインデントが調整され、関数呼び出しのパラメーターを表す JSON 文字列がオブジェクト形式に解析されました。

[
  // 第一次请求聊天API
  { role: 'system', 
    content: `使用CCMS协议编写页面的配置信息。
              
              CCMS协议所支持的页面类型包括:
              - *form*: 表单页
              - *table*: 表格页
              - *detail*: 详情页` },
  { role: 'user',
    content: '创建一个课程报名页面' },
  { role: 'assistant',
    content: null,
    function_call: { name: 'get_elements',
                     arguments: { page: ["form"] } } },

  // 第二次请求聊天API
  { role: 'function',
    name: 'get_elements',
    content: `# **form**表单页所支持的元素类型包括:

              - *form_text*:文本输入框
              - *form_number*: 数值输入框` },
  { role: 'assistant',
    content: null,
    function_call: { name: 'get_features',
                     arguments: { element: ["form_text", "form_number"] } } },

  // 第三次请求聊天API
  { role: 'function',
    name: 'get_features',
    content: `# **form_text**(文本输入框)所支持的配置化特性包括:

              - *form_text_maxLength*: 文本最大长度限制
              - *form_text_minLength*: 文本最小长度限制
              - *form_text_regExp*: 文本正则表达式校验
              
              # **form_number**没有支持的配置化特性。` },
  { role: 'assistant',
    content: null,
    function_call: { name: 'get_descriptions',
                     arguments: { page: ["form"],
                                  element: ["form_text", "form_number"],
                                  feature: ["form_text_maxLength", "form_text_minLength", "form_text_regExp"] } } },

  // 第四次请求聊天API
  { role: 'function',
    name: 'get_descriptions',
    content: `# **form**的详细描述如下:...
              
              # **form_text**的详细描述如下:...
              
              # **form_number**的详细描述如下:...
              
              # **form_text_maxLength**的详细描述如下:...
              
              # **form_text_minLength**的详细描述如下:...
              
              # **form_text_regExp**的详细描述如下:...` },
  { role: 'assistant',
    content: '课程报名页面的配置信息如下:\n\n...' }
]




2. ページ構築機能の拡張: ページコンテキストジャンプシーン

ローコード ページを構築する場合、ページ構成にコンテキスト情報を追加することが必要になる場合があります。

たとえば、ページにボタンを追加する必要があり、ユーザーがボタンをクリックすると別のページにジャンプします。この時点で、モデルが関連ページのリストを取得できるようにする関数を渡すことができます。

ボタンやジャンプ操作などのプロトコル コンテンツは、前の章の方法で取得できます。

## button
 
按钮。

支持的配置项包括:

- *label*:按钮标签
- *action*:操作类型,支持:
  - *none*:无操作
  - *redirect*:页面重定向
- *redirectTo*:页面标识




機能情報の説明

const functionsPrompt = [
  // ...
  {
    name: 'get_page_id',
    description: '查询页面标识列表。其中包含页面标识(`id`)、页面名称(`name`)',
    parameters: {
      type: 'object',
      properties: {
        page: {
          type: 'string',
          description: '页面'
        }
      }
    }
  }
]




機能内容

const functionsCalls = {
  // ...
  get_page_id: (args: {}) => {
    // 请自行实现信息查询,下列返回内容仅为示例。
    return JSON.stringify([
      {
        id: 'page_list',
        name: '列表页'
      },
      {
        id: 'page_create',
        name: '新增页',
        description: '用于新增内容'
      },
      {
        id: 'page_preview',
        name: '预览页'
      }
    ])
  }
}




電話の例

完全な通話のメッセージのリスト:

読みやすくするために、メッセージ リスト内のメッセージ コンテンツのインデントが調整され、GPT によって返された構成情報と関数呼び出しパラメーターを表す JSON 文字列がオブジェクト形式に解析されました。

[
  // 已省略系统角色信息以及私有协议访问信息。
  // ...
  { role: 'user',
    content: '添加一个预览按钮,点击后跳转至预览页。'
  },
  // ...
  { role: 'assistant',
    content: { type: "button",
               label: "预览",
               action: "redirect",
               redirectTo: "preview" },
    function_call: { name: 'get_page_id',
                     arguments: { page: "preview" } } },
  { role: 'function',
    name: 'get_page_id',
    content: [ { id: "page_list", name: "列表页" },
               { id: "page_create", name: "新增页" },
               { id: "page_preview", name: "预览页"} ] },
  { role: 'assistant',
    content: { type: "button",
               label: "预览",
               action: "redirect",
               redirectTo: "page_preview" }
]




3.ローコードプラットフォームの機能拡張:建物のウィンドウの表示領域を調整

自然言語ローコードを構築する場合、構築ウィンドウの表示領域が変更された領域まで自動的にスクロールするようにしたいとき、システム ロール要件を通じてページ構成が変更されたときにページ スクロール メソッドを呼び出すことができます。構成変更要素の位置まで自動的にスクロールします。

システム説明情報

システム説明情報に関連する説明を追加します。

const systemPropmpt = `//...

                       每次对页面内容进行调整时,需要滚动页面至目标元素位置。
                       
                       CCMS页面配置信息为一个数组,每个页面元素为数组中的一项,如:

                       ```json
                       [
                         {
                           "id": "input",
                           "type": "text",
                           "label": "文本输入框"
                         }
                       ]
                       ```
                       
                       // ...
                       `;




機能情報の説明

const functionsPrompt = [
  // ...
  {
    name: 'scroll_to',
    description: '滚动页面至指定元素位置',
    parameters: {
      type: 'object',
      properties: {
        element_id: {
          type: 'string',
          description: '指定元素ID'
        }
      }
    }
  }
]




機能内容

const functionsCalls = {
  // ...
  scroll_id: (args: { element_id: string }) => {
    const { element_id } = args
    // 自行实现页面滚动逻辑
    return '滚动完成'
  }
}




4. まとめ

OpenAI が提供する関数呼び出し機能は、GPT 機能を使用するアプリケーションに、より豊かな可能性を提供します。アプリケーション開発者は関数を通じて関数を呼び出すことができ、ユーザーが自然言語を操作したり、リアルタイム データや構造化データを取得したり、アプリケーションとのさまざまな対話を実行したりできるようになります。この記事で説明されているいくつかのケース シナリオは単なる入門用です。さらに議論したり、他のアプリケーション シナリオを試したりすることは歓迎です。

著者: JD Retail 牛暁光

出典: JD Cloud 開発者コミュニティ

人民大学の卒業生らが全学生の情報を盗んで美人採点サイトを構築、刑事拘束された NTアーキテクチャをベースにしたWindows版QQが正式リリース 米国は中国の利用を制限トレーニング AI モデルを提供する Amazon、Microsoft などのクラウド サービスの オープンソース プロジェクトが機能開発を停止すると発表 2023 年に最も高給の技術職であるLeaferJS がリリース: オープンソースの強力な 2D グラフィックス ライブラリである Visual Studio Code 1.80 が サポート端末画像機能 . スレッド登録数3,000万突破 「変化」 deepin、7月のApple M1データベースランキングに合わせてAsahi Linux採用 :Oracle急上昇、再びスコア拡大
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/4090830/blog/10086510