OpenAI Chat Completion API に関するメモ
概要
LLMのAPIは、いわゆるOpenAI API互換であることが多い。その中でもChat Completion APIが典型的に使われる。
本記事はこのAPIについての個人的なメモである。
Chat Completion API (チャット補完API)
参考文献
- https://cdn.openai.com/spec/model-spec-2024-05-08.html#follow-the-chain-of-command LLMの設計思想に関するドラフトで、現時点で実装されているかはわからない。
- https://platform.openai.com/docs/guides/text-generation
これは文字通り、チャット (会話) の補完を行うテキスト生成APIである。
これまでのチャットの履歴から次の発言を予測する。
誰の発言かをrole
属性で指定するようになっている。
- (
platform
: 当該LLMの開発者。一般的な指針、例えば差別的な発言をしない、などが与えられていると考えられる。これは実際の会話履歴には現れない) -
system
: (developer
): チャットシステムの開発者。Assistantがどう振る舞うかの指示を与える。履歴の先頭に現れることが想定されている。これまではsystem
roleが使われていたが、developer
roleに移行する予定。もうOpenAI のAPIでは移行されているかも。 -
assistant
: LLM -
user
: LLMを利用する人間やクライアントコード -
tool
: 下の図にはない。後述
基本的にはuser
とassistant
のチャットが想定されている。
APIとしてはrecipient
属性を指定できるようになっているので、3者以上の間でのチャットに対応しているかもしれないが、確かめてはいない。
(出典:「秋の夜の会話」草野心平)
これに対応して、(たとえば LiteLLM を使用して) APIを呼ぶ時に渡すmessages
引数はこのような感じ:
messages=[
{
"role": "system",
"content": "あなたはカエルで、もう一匹のカエルと会話しています",
},
{
"role": "user",
"content": "さむいね"
},
{
"role": "assistant",
"content": "ああさむいね",
},
{
"role": "user",
"content": "虫がないてるね",
},
],
なおモデルmeta-llama/Llama-3.1-70B
でseed=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
) にtool
roleとして加える
Structured Outputs
(略)
Discussion