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를 사용하면 한 번에 한 청크씩 출력을 읽을 수 있으므로 콘텐츠가 생성되는 대로 실시간으로 표시할 수 있습니다.
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
참조하세요.