🔖

OpenAI Chat Completion API に関するメモ

2025/01/08に公開

概要

LLMのAPIは、いわゆるOpenAI API互換であることが多い。その中でもChat Completion APIが典型的に使われる。
本記事はこのAPIについての個人的なメモである。

Chat Completion API (チャット補完API)

参考文献

これは文字通り、チャット (会話) の補完を行うテキスト生成APIである。
これまでのチャットの履歴から次の発言を予測する。
誰の発言かをrole属性で指定するようになっている。

  • (platform: 当該LLMの開発者。一般的な指針、例えば差別的な発言をしない、などが与えられていると考えられる。これは実際の会話履歴には現れない)
  • system: (developer): チャットシステムの開発者。Assistantがどう振る舞うかの指示を与える。履歴の先頭に現れることが想定されている。これまではsystem roleが使われていたが、developer roleに移行する予定。もうOpenAI のAPIでは移行されているかも。
  • assistant: LLM
  • user: LLMを利用する人間やクライアントコード
  • tool: 下の図にはない。後述

基本的にはuserassistantのチャットが想定されている。
APIとしてはrecipient属性を指定できるようになっているので、3者以上の間でのチャットに対応しているかもしれないが、確かめてはいない。

(出典:「秋の夜の会話」草野心平)

これに対応して、(たとえば LiteLLM を使用して) APIを呼ぶ時に渡すmessages引数はこのような感じ:

messages=[
    {
        "role": "system",
        "content": "あなたはカエルで、もう一匹のカエルと会話しています",
    },
    {
        "role": "user",
        "content": "さむいね"
    },
    {
        "role": "assistant",
        "content": "ああさむいね",
    },
    {
        "role": "user",
        "content": "虫がないてるね",
    },
],

なおモデルmeta-llama/Llama-3.1-70Bseed=21120903を指定した時に返ってくるテキストは:

そうね、虫が少ないと食事が苦しいね

正解は「ああ虫がないてるね」。ちょっと面白い

Contentの指定

単純なテキストを渡すのであれば "content":<text> でよい。
画像や音声など他の形式のデータを渡したい場合は、オブジェクトの配列を渡す。
この場合、各オブジェクトはtype属性で形式を指定し、それぞれの形式で要求される属性値を渡す (詳細略)。
あまり意味がないが、テキスト形式の場合は以下の通り:

"content": [{ "type": "text", "text": "Orange." }]

指示の優先順位

各roleから矛盾する指示が与えられた場合、先ほどのModel Specでは次の優先順位に従うこととされている:

Platform > Developer > User > Tool

Function Calling (詳細略)

参考文献

APIによっては Function calling (tool) に対応しているものがある。以下toolのほうで呼ぶ。
Pythonでコーディングしていると仮定すると、toolはローカルで呼べるPythonの関数のことである。
例えばCrewAIでtoolを使うにはこの機能が必要である。

この機能は、userが使用可能なtoolのリストを提供し、LLMの返答として必要であればtoolのinvocationを指示してもらうものである。

  • APIを呼ぶときに、userは使用可能なtoolの名称、機能の説明テキスト、引数の形式と説明テキストをtools引数として与える。プロンプトにも入れるとよい。
  • 必要に応じて、APIからの返り値のcompletion.choices[N].message.tool_callsに以下のような情報が返ってくる:
    • id
    • どの関数を呼ぶべきか
    • 引数は何か
  • これが適切だと判断したらuserは当該toolを呼ぶ
  • Toolを呼んだ結果はチャット履歴 (messages) にtoolroleとして加える

Structured Outputs

(略)

Discussion