Lua 用の OpenAI HTTP API へのバインディング。 LuaSocket の http リクエスト インターフェイスをサポートするあらゆる HTTP ライブラリと互換性があります。 lapis.nginx.http
を使用する OpenResty と互換性があります。
このライブラリは手作業で作成されましたが、ドキュメントの大部分、テスト スイート、および GitHub ワークフローは、ライブラリ全体のソース コードをプロンプトとして貼り付け、ドキュメントとテストの生成を要求することにより、GPT-4 によって完全に生成されました。最終出力は、明確さと構文のために編集されました (GPT4 が MoonScript を書くのに苦労した場合)
LuaRocks を使用してインストールします。
luarocks install lua-openai
local openai = require ( " openai " )
local client = openai . new ( os.getenv ( " OPENAI_API_KEY " ))
local status , response = client : chat ({
{ role = " system " , content = " You are a Lua programmer " },
{ role = " user " , content = " Write a 'Hello world' program in Lua " }
}, {
model = " gpt-3.5-turbo " , -- this is the default model
temperature = 0.5
})
if status == 200 then
-- the JSON response is automatically parsed into a Lua object
print ( response . choices [ 1 ]. message . content )
end
チャット セッション インスタンスを作成すると、ChatGPT API を使用した往復の会話の状態管理を簡素化できます。チャットの状態はメモリにローカルに保存され、新しいメッセージはそれぞれメッセージのリストに追加され、出力は次のリクエストのリストに自動的に追加されることに注意してください。
local openai = require ( " openai " )
local client = openai . new ( os.getenv ( " OPENAI_API_KEY " ))
local chat = client : new_chat_session ({
-- provide an initial set of messages
messages = {
{ role = " system " , content = " You are an artist who likes colors " }
}
})
-- returns the string response
print ( chat : send ( " List your top 5 favorite colors " ))
-- the chat history is sent on subsequent requests to continue the conversation
print ( chat : send ( " Excluding the colors you just listed, tell me your favorite color " ))
-- the entire chat history is stored in the messages field
for idx , message in ipairs ( chat . messages ) do
print ( message . role , message . content )
end
-- You can stream the output by providing a callback as the second argument
-- the full response concatenated is also returned by the function
local response = chat : send ( " What's the most boring color? " , function ( chunk )
io.stdout : write ( chunk . content )
io.stdout : flush ()
end )
OpenAI を使用すると、LLM がプロンプトに基づいて呼び出すことを決定できる関数宣言のリストを送信できます。関数呼び出しインターフェイスは、チャット補完およびgpt-4-0613
またはgpt-3.5-turbo-0613
モデル以降で使用する必要があります。
数値リストの標準偏差を計算する基本的な数学関数を実装する完全な例については、https://github.com/leafo/lua-openai/blob/main/examples/example5.lua を参照してください。
ここでは、チャット交換で関数を使用する方法の簡単な例を示します。まず、使用可能な関数の配列を含むfunctions
オプションを使用してチャット セッションを作成する必要があります。
関数はチャット オブジェクトの
functions
フィールドに保存されます。将来のメッセージに合わせて関数を調整する必要がある場合は、フィールドを変更できます。
local chat = openai : new_chat_session ({
model = " gpt-3.5-turbo-0613 " ,
functions = {
{
name = " add " ,
description = " Add two numbers together " ,
parameters = {
type = " object " ,
properties = {
a = { type = " number " },
b = { type = " number " }
}
}
}
}
})
送信するプロンプトはすべて、利用可能なすべての関数を認識しており、それらのいずれかの呼び出しを要求する場合があります。応答に関数呼び出しリクエストが含まれている場合、標準の文字列戻り値の代わりにオブジェクトが返されます。
local res = chat : send ( " Using the provided function, calculate the sum of 2923 + 20839 " )
if type ( res ) == " table " and res . function_call then
-- The function_call object has the following fields:
-- function_call.name --> name of function to be called
-- function_call.arguments --> A string in JSON format that should match the parameter specification
-- Note that res may also include a content field if the LLM produced a textual output as well
local cjson = require " cjson "
local name = res . function_call . name
local arguments = cjson . decode ( res . function_call . arguments )
-- ... compute the result and send it back ...
end
要求された関数と引数を評価し、その結果をクライアントに送り返すことで、 role=function
メッセージ オブジェクトで操作を再開できます。
LLM は関数呼び出しのあらゆる部分を幻覚させる可能性があるため、関数名と引数が期待どおりに一致することを確認するために、堅牢な型検証を行う必要があります。引数として不正な形式の JSON を受信するなど、すべてのステージが失敗する可能性があると想定します。
local name , arguments = ... -- the name and arguments extracted from above
if name == " add " then
local value = arguments . a + arguments . b
-- send the response back to the chat bot using a `role = function` message
local cjson = require " cjson "
local res = chat : send ({
role = " function " ,
name = name ,
content = cjson . encode ( value )
})
print ( res ) -- Print the final output
else
error ( " Unknown function: " .. name )
end
通常の状況では、API は応答全体が利用可能になるまで待機してから応答を返します。プロンプトによっては、時間がかかる場合があります。ストリーミング API を使用すると、出力を一度に 1 チャンクずつ読み取ることができるため、生成されたコンテンツをリアルタイムで表示できます。
local openai = require ( " openai " )
local client = openai . new ( os.getenv ( " OPENAI_API_KEY " ))
client : chat ({
{ role = " system " , content = " You work for Streak.Club, a website to track daily creative habits " },
{ role = " user " , content = " Who do you work for? " }
}, {
stream = true
}, function ( chunk )
io.stdout : write ( chunk . content )
io.stdout : flush ()
end )
print () -- print a newline
openai
モジュールは、次のフィールドを含むテーブルを返します。
OpenAI
: OpenAI API にリクエストを送信するためのクライアント。new
: OpenAI クライアントの新しいインスタンスを作成するためのOpenAI
のエイリアスChatSession
: OpenAI API を使用してチャット セッションと履歴を管理するためのクラス。VERSION = "1.1.0"
: ライブラリの現在のバージョンこのクラスは、新しい OpenAI API クライアントを初期化します。
new(api_key, config)
OpenAI クライアントのコンストラクター。
api_key
: OpenAI API キー。config
: 次の形式の構成オプションのオプションのテーブル。http_provider
: リクエストに使用される HTTP モジュール名を指定する文字列、またはnil
。指定しない場合、ライブラリは ngx 環境では「lapis.nginx.http」を、それ以外の場合は「ssl.https」を自動的に使用します。 local openai = require ( " openai " )
local api_key = " your-api-key "
local client = openai . new ( api_key )
client:new_chat_session(...)
新しい ChatSession インスタンスを作成します。チャット セッションは、チャット履歴を保存するチャット完了 API を抽象化したものです。新しいメッセージを履歴に追加し、そこから生成される完了をリクエストできます。デフォルトでは、完了は履歴に追加されます。
client:chat(messages, opts, chunk_callback)
リクエストを/chat/completions
エンドポイントに送信します。
messages
: メッセージ オブジェクトの配列。opts
: API に直接渡されるチャットの追加オプション (モデル、温度など) https://platform.openai.com/docs/api-reference/chatchunk_callback
: stream = true
がopts
に渡されたときに、解析されたストリーミング出力のために呼び出される関数。HTTP ステータス、応答オブジェクト、および出力ヘッダーを返します。応答オブジェクトは、可能であれば JSON からデコードされます。それ以外の場合は、生の文字列が返されます。
client:completion(prompt, opts)
リクエストを/completions
エンドポイントに送信します。
prompt
: 完了を求めるプロンプト。opts
: API に直接渡される補完用の追加オプション (例: モデル、温度など) https://platform.openai.com/docs/api-reference/completionsHTTP ステータス、応答オブジェクト、および出力ヘッダーを返します。応答オブジェクトは、可能であれば JSON からデコードされます。それ以外の場合は、生の文字列が返されます。
client:embedding(input, opts)
/embeddings
エンドポイントにリクエストを送信します。
input
: 単一の文字列または文字列の配列opts
: API (モデルなど) に直接渡される補完のための追加オプション https://platform.openai.com/docs/api-reference/embeddingsHTTP ステータス、応答オブジェクト、および出力ヘッダーを返します。応答オブジェクトは、可能であれば JSON からデコードされます。それ以外の場合は、生の文字列が返されます。
このクラスは、OpenAI API を使用してチャット セッションと履歴を管理します。通常はnew_chat_session
で作成されます
フィールドmessages
チャット履歴を表すチャット メッセージの配列が保存されます。各メッセージ オブジェクトは次の構造に準拠する必要があります。
role
: メッセージ送信者の役割を表す文字列。これは、「system」、「user」、「assistant」のいずれかの値である必要があります。content
: メッセージの内容を含む文字列。name
: メッセージ送信者の名前を表すオプションの文字列。指定しない場合は、 nil
にする必要があります。たとえば、有効なメッセージ オブジェクトは次のようになります。
{
role = " user " ,
content = " Tell me a joke " ,
name = " John Doe "
}
new(client, opts)
ChatSession のコンストラクター。
client
: OpenAI クライアントのインスタンス。opts
: オプションのオプションのテーブル。messages
: チャット メッセージの初期配列functions
: 関数宣言のリストtemperature
:設定温度model
: どのチャット完了モデルを使用するか。 gpt-4
、 gpt-3.5-turbo
chat:append_message(m, ...)
チャット履歴にメッセージを追加します。
m
: メッセージオブジェクト。 chat:last_message()
チャット履歴の最後のメッセージを返します。
chat:send(message, stream_callback=nil)
チャット履歴にメッセージを追加し、 generate_response
で完了をトリガーし、応答を文字列として返します。失敗した場合は、 nil
、エラーメッセージ、および生のリクエスト応答を返します。
応答にfunction_call
が含まれている場合、コンテンツの文字列ではなく、メッセージ オブジェクト全体が返されます。 role = "function"
オブジェクトをsend
メソッドに渡すことで、関数の結果を返すことができます。
message
: メッセージ オブジェクトまたは文字列。stream_callback
: (オプション) ストリーミング出力を有効にする関数。 stream_callback
指定すると、リクエストはストリーミング モードで実行されます。この関数は、応答から解析されたチャンクを受け取ります。
これらのチャンクの形式は次のとおりです。
content
: アシスタントが生成した応答のテキストを含む文字列。たとえば、チャンクは次のようになります。
{
content = " This is a part of the assistant's response. " ,
}
chat:generate_response(append_response, stream_callback=nil)
OpenAI API を呼び出して、保存されたチャット履歴に対する次の応答を生成します。応答を文字列として返します。失敗した場合は、 nil
、エラーメッセージ、および生のリクエスト応答を返します。
append_response
: 応答をチャット履歴に追加するかどうか (デフォルト: true)。stream_callback
: (オプション) ストリーミング出力を有効にする関数。 stream_callback
の詳細については、 chat:send
参照してください。