Microsoft는이 라이브러리를 새로운 공식 C# OpenAI 라이브러리로 전환하는 것에 대해 저에게 연락을 취했습니다. 이제 준비가되었습니다! v2.0.0-beta.3을 시작으로 공식 도서관은 이제 전체 커버리지가 있으며 최신 상태를 유지합니다. 블로그 게시물의 자세한 내용은 https://devblogs.microsoft.com/dotnet/openai-dotnet-library
이 Github 리포는 버전 1.11을 통해 내 원래 버전의 라이브러리를 문서화하기 위해 여기에 남아 있습니다. ?
OpenAI의 API와 함께 사용할 간단한 C# .NET 래퍼 라이브러리. 내 블로그에서 더 많은 맥락. 이것은 OpenAI API 주변의 원래 비공식 래퍼 라이브러리입니다.
var api = new OpenAI_API . OpenAIAPI ( " YOUR_API_KEY " ) ;
var result = await api . Chat . CreateChatCompletionAsync ( " Hello! " ) ;
Console . WriteLine ( result ) ;
// should print something like "Hi! How can I help you?" v2.0.0-beta로 시작 하여이 라이브러리는 Microsoft가 채택했습니다. 도서관의 새로운 공식 버전은 전체 범위를 갖추고 있으며 최신 상태를 유지합니다. 블로그 게시물의 자세한 내용은 https://devblogs.microsoft.com/dotnet/openai-dotnet-library/이 Github Repo는 Nuget에서도 여전히 사용할 수있는 버전 1.11을 통해 내 원래 버전의 라이브러리를 문서화하기 위해 여기에 남아 있습니다.
이 라이브러리는 .NET 표준 2.0을 기반으로하므로 기존 .NET 프레임 워크> = 4.7.2에서 .NET (Core)> = 3.0에서 모든 버전의 .NET에서 작동해야합니다. 콘솔 앱, Winforms, WPF, ASP.Net, Unity, Xamarin 등에서 작동해야합니다. Windows, Linux 및 Mac 및 아마도 모바일에서 작동해야합니다. 최소 의존성이 있으며 공개 도메인에서 라이센스가 부여됩니다.
Nuget에서 패키지 OpenAI v1.11을 설치하십시오. U. CommandLine을 통해 다음은 다음과 같습니다.
Install-Package OpenAI - Version 1.11 . 0우선 순위로 API 키를 제공하는 3 가지 방법이 있습니다.
APIAuthentication(string key) 생성자로 직접 전달합니다.openai 라는 이름의 사용자 디렉토리에 구성 파일을 포함시키고 라인을 포함합니다. OPENAI_API_KEY=sk-aaaabbbbbccccddddd 그림과 같이 API를 초기화 할 때 다음과 같이 APIAuthentication 사용합니다.
// for example
OpenAIAPI api = new OpenAIAPI ( " YOUR_API_KEY " ) ; // shorthand
// or
OpenAIAPI api = new OpenAIAPI ( new APIAuthentication ( " YOUR_API_KEY " ) ) ; // create object manually
// or
OpenAIAPI api = new OpenAIAPI ( APIAuthentication LoadFromEnv ( ) ) ; // use env vars
// or
OpenAIAPI api = new OpenAIAPI ( APIAuthentication LoadFromPath ( ) ) ; // use config file (can optionally specify where to look)
// or
OpenAIAPI api = new OpenAIAPI ( ) ; // uses default, env, or config fileAPI 요청에 사용되는 조직을 지정하는 OpenAiorganization (ENV 또는 구성 파일의 OpenAi_organization)을 선택적으로 포함시킬 수 있습니다. 이 API 요청의 사용은 지정된 조직의 구독 할당량에 포함됩니다. 조직 ID는 조직 설정 페이지에서 찾을 수 있습니다.
// for example
OpenAIAPI api = new OpenAIAPI ( new APIAuthentication ( " YOUR_API_KEY " , " org-yourOrgHere " ) ) ; 채팅 API는 OpenAIAPI.Chat 을 통해 액세스합니다. 단순화 된 대화를 통해 또는 전체 요청/응답 방법을 통해 채팅 엔드 포인트를 사용하는 두 가지 방법이 있습니다.
대화 수업을 통해 Chat에 메시지를 추가하고 Chatgpt에게 답장을 요청하여 Chatgpt와 쉽게 상호 작용할 수 있습니다.
var chat = api . Chat . CreateConversation ( ) ;
chat . Model = Model . GPT4_Turbo ;
chat . RequestParameters . Temperature = 0 ;
/// give instruction as System
chat . AppendSystemMessage ( " You are a teacher who helps children understand if things are animals or not. If the user tells you an animal, you say " yes " . If the user tells you something that is not an animal, you say " no " . You only ever respond with " yes " or " no " . You do not say anything else. " ) ;
// give a few examples as user and assistant
chat . AppendUserInput ( " Is this an animal? Cat " ) ;
chat . AppendExampleChatbotOutput ( " Yes " ) ;
chat . AppendUserInput ( " Is this an animal? House " ) ;
chat . AppendExampleChatbotOutput ( " No " ) ;
// now let's ask it a question
chat . AppendUserInput ( " Is this an animal? Dog " ) ;
// and get the response
string response = await chat . GetResponseFromChatbotAsync ( ) ;
Console . WriteLine ( response ) ; // "Yes"
// and continue the conversation by asking another
chat . AppendUserInput ( " Is this an animal? Chair " ) ;
// and get another response
response = await chat . GetResponseFromChatbotAsync ( ) ;
Console . WriteLine ( response ) ; // "No"
// the entire chat history is available in chat.Messages
foreach ( ChatMessage msg in chat . Messages )
{
Console . WriteLine ( $" { msg . Role } : { msg . Content } " ) ;
} 스트리밍을 사용하면 결과가 생성되어 응용 프로그램이 더 반응하는 느낌을받을 수 있습니다.
새로운 C# 8.0 비동기 반복자 사용 :
var chat = api . Chat . CreateConversation ( ) ;
chat . AppendUserInput ( " How to make a hamburger? " ) ;
await foreach ( var res in chat . StreamResponseEnumerableFromChatbotAsync ( ) )
{
Console . Write ( res ) ;
}또는 고전적인 .NET 프레임 워크 또는 C# <8.0을 사용하는 경우 :
var chat = api . Chat . CreateConversation ( ) ;
chat . AppendUserInput ( " How to make a hamburger? " ) ;
await chat . StreamResponseFromChatbotAsync ( res =>
{
Console . Write ( res ) ;
} ) ; 새로운 GPT-4 비전 모델을 사용하기 위해 채팅에 이미지를 보낼 수 있습니다. 이것은 Model.GPT4_Vision 모델에서만 작동합니다. 자세한 내용과 제한 사항은 https://platform.openai.com/docs/guides/vision을 참조하십시오.
// the simplest form
var result = await api . Chat . CreateChatCompletionAsync ( " What is the primary non-white color in this logo? " , ImageInput . FromFile ( " path/to/logo.png " ) ) ;
// or in a conversation
var chat = api . Chat . CreateConversation ( ) ;
chat . Model = Model . GPT4_Vision ;
chat . AppendSystemMessage ( " You are a graphic design assistant who helps identify colors. " ) ;
chat . AppendUserInput ( " What are the primary non-white colors in this logo? " , ImageInput . FromFile ( " path/to/logo.png " ) ) ;
string response = await chat . GetResponseFromChatbotAsync ( ) ;
Console . WriteLine ( response ) ; // "Blue and purple"
chat . AppendUserInput ( " What are the primary non-white colors in this logo? " , ImageInput . FromImageUrl ( " https://rogerpincombe.com/templates/rp/center-aligned-no-shadow-small.png " ) ) ;
response = await chat . GetResponseFromChatbotAsync ( ) ;
Console . WriteLine ( response ) ; // "Blue, red, and yellow"
// or when manually creating the ChatMessage
messageWithImage = new ChatMessage ( ChatMessageRole . User , " What colors do these logos have in common? " ) ;
messageWithImage . images . Add ( ImageInput . FromFile ( " path/to/logo.png " ) ) ;
messageWithImage . images . Add ( ImageInput . FromImageUrl ( " https://rogerpincombe.com/templates/rp/center-aligned-no-shadow-small.png " ) ) ;
// you can specify multiple images at once
chat . AppendUserInput ( " What colors do these logos have in common? " , ImageInput . FromFile ( " path/to/logo.png " ) , ImageInput . FromImageUrl ( " https://rogerpincombe.com/templates/rp/center-aligned-no-shadow-small.png " ) ) ; 채팅 대화 기록이 너무 길어지면 모델의 컨텍스트 길이에 맞지 않을 수 있습니다. 기본적으로 초기 비 시스템 메시지는 채팅 기록에서 제거되고 API 호출이 재조정됩니다. chat.AutoTruncateOnContextLengthExceeded = false 설정하여이를 비활성화하거나 다음과 같이 자르기 알고리즘을 대체 할 수 있습니다.
chat . OnTruncationNeeded += ( sender , args ) =>
{
// args is a List<ChatMessage> with the current chat history. Remove or edit as nessisary.
// replace this with more sophisticated logic for your use-case, such as summarizing the chat history
for ( int i = 0 ; i < args . Count ; i ++ )
{
if ( args [ i ] . Role != ChatMessageRole . System )
{
args . RemoveAt ( i ) ;
return ;
}
}
} ; 컨텍스트 길이가 더 큰 새 모델을 사용하고 싶을 수도 있습니다. chat.Model = Model.GPT4_Turbo 또는 chat.Model = Model.ChatGPTTurbo_16k 등을 설정 하여이 작업을 수행 할 수 있습니다.
chat.MostRecentApiResult.Usage.PromptTokens 및 관련 속성을 통해 토큰 사용을 볼 수 있습니다.
OpenAIAPI.Chat.CreateChatCompletionAsync() 및 관련 메소드를 사용하여 채팅 API의 전체 제어에 액세스 할 수 있습니다.
async Task < ChatResult > CreateChatCompletionAsync ( ChatRequest request ) ;
// for example
var result = await api . Chat . CreateChatCompletionAsync ( new ChatRequest ( )
{
Model = Model . ChatGPTTurbo ,
Temperature = 0.1 ,
MaxTokens = 50 ,
Messages = new ChatMessage [ ] {
new ChatMessage ( ChatMessageRole . User , " Hello! " )
}
} )
// or
var result = api . Chat . CreateChatCompletionAsync ( " Hello! " ) ;
var reply = results . Choices [ 0 ] . Message ;
Console . WriteLine ( $" { reply . Role } : { reply . Content . Trim ( ) } " ) ;
// or
Console . WriteLine ( results ) ; 주로 메타 데이터 인 ChatResult 반환하므로 .ToString() 메소드를 사용하여 Assistant의 답장 텍스트라면 텍스트를 얻으십시오.
완료 엔드 포인트 스트리밍 결과와 유사하게 작동하는 비동기 스트리밍 API도 있습니다.
새로운 Model.GPT4_Turbo 또는 gpt-3.5-turbo-1106 모델을 사용하면 ChatRequest.ResponseFormat ChatRequest.ResponseFormats.JsonObject 로 설정하여 JSON 모드를 활성화 할 수 있습니다. JSON 모드가 활성화되면 모델은 유효한 JSON 객체로 구문 분석하는 문자열 만 생성하도록 제한됩니다. 자세한 내용은 https://platform.openai.com/docs/guides/guides/guides를 참조하십시오.
ChatRequest chatRequest = new ChatRequest ( )
{
Model = model ,
Temperature = 0.0 ,
MaxTokens = 500 ,
ResponseFormat = ChatRequest . ResponseFormats . JsonObject ,
Messages = new ChatMessage [ ] {
new ChatMessage ( ChatMessageRole . System , " You are a helpful assistant designed to output JSON. " ) ,
new ChatMessage ( ChatMessageRole . User , " Who won the world series in 2020? Return JSON of a 'wins' dictionary with the year as the numeric key and the winning team as the string value. " )
}
} ;
var results = await api . Chat . CreateChatCompletionAsync ( chatRequest ) ;
Console . WriteLine ( results ) ;
/* prints:
{
"wins": {
2020: "Los Angeles Dodgers"
}
}
*/ 완성은 OpenAi에 의해 유산으로 간주됩니다. 완료 API는 OpenAIAPI.Completions 를 통해 액세스합니다.
async Task < CompletionResult > CreateCompletionAsync ( CompletionRequest request ) ;
// for example
var result = await api . Completions . CreateCompletionAsync ( new CompletionRequest ( " One Two Three One Two " , model : Model . CurieText , temperature : 0.1 ) ) ;
// or
var result = await api . Completions . CreateCompletionAsync ( " One Two Three One Two " , temperature : 0.1 ) ;
// or other convenience overloads CompletionRequest 미리 작성하거나 편의를 위해 도우미 과부하 중 하나를 사용할 수 있습니다. 주로 메타 데이터 인 CompletionResult 반환하므로 .ToString() 메소드를 사용하여 완료 한 경우 텍스트를 얻으십시오.
스트리밍을 사용하면 결과가 생성 될 수 있으므로 특히 Davinci와 같은 느린 모델에서 응용 프로그램이 더 반응이 좋을 수 있습니다.
새로운 C# 8.0 비동기 반복자 사용 :
IAsyncEnumerable < CompletionResult > StreamCompletionEnumerableAsync ( CompletionRequest request ) ;
// for example
await foreach ( var token in api . Completions . StreamCompletionEnumerableAsync ( new CompletionRequest ( " My name is Roger and I am a principal software engineer at Salesforce. This is my resume: " , Model . DavinciText , 200 , 0.5 , presencePenalty : 0.1 , frequencyPenalty : 0.1 ) ) )
{
Console . Write ( token ) ;
}또는 고전적인 .NET 프레임 워크 또는 C# <8.0을 사용하는 경우 :
async Task StreamCompletionAsync ( CompletionRequest request , Action < CompletionResult > resultHandler ) ;
// for example
await api . Completions . StreamCompletionAsync (
new CompletionRequest ( " My name is Roger and I am a principal software engineer at Salesforce. This is my resume: " , Model . DavinciText , 200 , 0.5 , presencePenalty : 0.1 , frequencyPenalty : 0.1 ) ,
res => ResumeTextbox . Text += res . ToString ( ) ) ;오디오 API는 연설, 전사 (텍스트에 대한 음성) 및 번역 (영어 텍스트에 대한 영어 음성)입니다.
TTS API는 OpenAIAPI.TextToSpeech 를 통해 액세스합니다.
await api . TextToSpeech . SaveSpeechToFileAsync ( " Hello, brave new world! This is a test. " , outputPath ) ;
// You can open it in the defaul audio player like this:
Process . Start ( outputPath ) ; TextToSpeechRequest 객체로 모든 요청 매개 변수를 지정할 수도 있습니다.
var request = new TextToSpeechRequest ( )
{
Input = " Hello, brave new world! This is a test. " ,
ResponseFormat = ResponseFormats . AAC ,
Model = Model . TTS_HD ,
Voice = Voices . Nova ,
Speed = 0.9
} ;
await api . TextToSpeech . SaveSpeechToFileAsync ( request , " test.aac " ) ; 파일에 저장하는 대신 api.TextToSpeech.GetSpeechAsStreamAsync(request) 로 오디오 바이트 스트림을 얻을 수 있습니다.
using ( Stream result = await api . TextToSpeech . GetSpeechAsStreamAsync ( " Hello, brave new world! " , Voices . Fable ) )
using ( StreamReader reader = new StreamReader ( result ) )
{
// do something with the audio stream here
} 오디오 전사 API를 사용하면 지원되는 언어로 오디오에서 텍스트를 생성 할 수 있습니다. OpenAIAPI.Transcriptions 를 통해 액세스합니다.
string resultText = await api . Transcriptions . GetTextAsync ( " path/to/file.mp3 " ) ;당신은 당신에게 세그먼트 및 토큰 수준 정보를 제공 할 수있는 장황 결과와 처리 시간과 같은 표준 OpenAI 메타 데이터를 제공 할 수 있습니다.
AudioResultVerbose result = await api . Transcriptions . GetWithDetailsAsync ( " path/to/file.m4a " ) ;
Console . WriteLine ( result . ProcessingTime . TotalMilliseconds ) ; // 496ms
Console . WriteLine ( result . text ) ; // "Hello, this is a test of the transcription function."
Console . WriteLine ( result . language ) ; // "english"
Console . WriteLine ( result . segments [ 0 ] . no_speech_prob ) ; // 0.03712
// etcSRT 또는 VTT 형식의 결과를 요청할 수도 있으며, 이는 비디오 용 자막을 생성하는 데 유용합니다.
string result = await api . Transcriptions . GetAsFormatAsync ( " path/to/file.m4a " , AudioRequest . ResponseFormats . SRT ) ;온도, 프롬프트, 언어 등과 같은 추가 매개 변수는 요청 당 또는 기본값으로 지정할 수 있습니다.
// inline
result = await api . Transcriptions . GetTextAsync ( " conversation.mp3 " , " en " , " This is a transcript of a conversation between a medical doctor and her patient: " , 0.3 ) ;
// set defaults
api . Transcriptions . DefaultTranscriptionRequestArgs . Language = " en " ;디스크에 로컬 파일을 제공하는 대신 오디오 바이트 스트림을 제공 할 수 있습니다. 이것은 먼저 디스크에 쓰지 않고도 마이크 또는 다른 소스에서 오디오를 스트리밍하는 데 유용 할 수 있습니다. 존재할 필요가 없지만 보내는 오디오 유형에 대한 정확한 확장이 있어야하는 파일 이름을 지정해서는 안됩니다. OpenAI는 파일 이름 확장을 사용하여 오디오 스트림의 형식을 결정합니다.
using ( var audioStream = File . OpenRead ( " path-here.mp3 " ) )
{
return await api . Transcriptions . GetTextAsync ( audioStream , " file.mp3 " ) ;
} 번역을 통해 지원되는 언어에서 영어로 텍스트를 전사 할 수 있습니다. OpenAi는 다른 언어로 번역하는 것을 지원하지 않습니다. OpenAIAPI.Translations 를 통해 액세스합니다. 전사와 동일한 기능을 모두 지원합니다.
string result = await api . Translations . GetTextAsync ( " chinese-example.m4a " ) ; 임베딩 API는 OpenAIAPI.Embeddings 통해 액세스합니다.
async Task < EmbeddingResult > CreateEmbeddingAsync ( EmbeddingRequest request ) ;
// for example
var result = await api . Embeddings . CreateEmbeddingAsync ( new EmbeddingRequest ( " A test text for embedding " , model : Model . AdaTextEmbedding ) ) ;
// or
var result = await api . Embeddings . CreateEmbeddingAsync ( " A test text for embedding " ) ;임베딩 결과에는 많은 메타 데이터가 포함되어 있으며, 플로트의 실제 벡터는 결과에 있습니다 .Data []. Embedding.
단순화하기 위해 플로트의 벡터를 직접 요청하고 api.Embeddings.GetEmbeddingsAsync("test text here") 사용하여 추가 메타 데이터를 혐오 할 수 있습니다.
중재 API는 OpenAIAPI.Moderation 를 통해 액세스됩니다.
async Task < ModerationResult > CreateEmbeddingAsync ( ModerationRequest request ) ;
// for example
var result = await api . Moderation . CallModerationAsync ( new ModerationRequest ( " A test text for moderating " , Model . TextModerationLatest ) ) ;
// or
var result = await api . Moderation . CallModerationAsync ( " A test text for moderating " ) ;
Console . WriteLine ( result . results [ 0 ] . MainContentFlag ) ; 결과는 .results[0] 에 있으며 FlaggedCategories 및 MainContentFlag 와 같은 좋은 도우미 방법이 있습니다.
파일 API 엔드 포인트는 OpenAIAPI.Files 를 통해 액세스됩니다.
// uploading
async Task < File > UploadFileAsync ( string filePath , string purpose = " fine-tune " ) ;
// for example
var response = await api . Files . UploadFileAsync ( " fine-tuning-data.jsonl " ) ;
Console . Write ( response . Id ) ; //the id of the uploaded file
// listing
async Task < List < File > > GetFilesAsync ( ) ;
// for example
var response = await api . Files . GetFilesAsync ( ) ;
foreach ( var file in response )
{
Console . WriteLine ( file . Name ) ;
}파일 내용을 가져 오거나 파일 삭제 등에 대한 방법도 있습니다.
미세 조정 엔드 포인트 자체는 아직 구현되지 않았지만 곧 추가 될 예정입니다.
Dall-E 이미지 생성 API는 OpenAIAPI.ImageGenerations 를 통해 액세스합니다.
async Task < ImageResult > CreateImageAsync ( ImageGenerationRequest request ) ;
// for example
var result = await api . ImageGenerations . CreateImageAsync ( new ImageGenerationRequest ( " A drawing of a computer writing a test " , 1 , ImageSize . _512 ) ) ;
// or
var result = await api . ImageGenerations . CreateImageAsync ( " A drawing of a computer writing a test " ) ;
Console . WriteLine ( result . Data [ 0 ] . Url ) ;이미지 결과에는 imageGenerationRequest.ResponseFormat에 따라 온라인 이미지의 URL 또는 Base64에 인코딩 된 이미지가 포함되어 있습니다 (URL은 기본값).
다음과 같이 Dall-E 3을 사용하십시오.
async Task < ImageResult > CreateImageAsync ( ImageGenerationRequest request ) ;
// for example
var result = await api . ImageGenerations . CreateImageAsync ( new ImageGenerationRequest ( " A drawing of a computer writing a test " , OpenAI_API . Models . Model . DALLE3 , ImageSize . _1024x1792 , " hd " ) ) ;
// or
var result = await api . ImageGenerations . CreateImageAsync ( " A drawing of a computer writing a test " , OpenAI_API . Models . Model . DALLE3 ) ;
Console . WriteLine ( result . Data [ 0 ] . Url ) ; Azure OpenAi 서비스를 사용하려면 Azure OpenAI 리소스의 이름과 모델 배포 ID를 지정해야합니다.
Microsoft Azure OpenAi 서비스에 액세스 할 수 없으므로이 기능을 테스트 할 수 없습니다. 액세스 권한이 있고 테스트 할 수있는 경우 결과를 설명하는 문제를 제출하십시오. 통합 테스트가있는 PR도 크게 높이 평가됩니다. 구체적으로, 지정된 모델이 Azure와 동일한 방식으로 작동한다는 것은 불분명합니다.
자세한 내용은 #64의 Azure Openai 문서 및 자세한 스크린 샷을 참조하십시오.
구성은 Azure 서비스에 대해 다음과 같은 것으로 보일 것입니다.
OpenAIAPI api = OpenAIAPI . ForAzure ( " YourResourceName " , " deploymentId " , " api-key " ) ;
api . ApiVersion = " 2023-03-15-preview " ; // needed to access chat endpoint on Azure 그런 다음 정상과 같은 api 객체를 사용할 수 있습니다. 또한 위의 인증 섹션에 나열된 다른 방법 중 하나 인 APIAuthentication 지정할 수도 있습니다. 현재이 라이브러리는 AD 플로우가 아닌 APIK 키 흐름 만 지원합니다.
2023 년 4 월 2 일 현재 Azure의 채팅 엔드 포인트에 액세스하려면 위에 표시된대로 API 버전 2023-03-15-preview 수동으로 선택해야합니다. 미리보기가 불가능되면 기본값을 업데이트합니다.
HTTP 요청에 사용할 IHttpClientFactory 지정하여 HTTP 요청 속성, 연결 풀링 및 조롱을 조정할 수 있습니다. #103의 세부 사항.
OpenAIAPI api = new OpenAIAPI ( ) ;
api . HttpClientFactory = myIHttpClientFactoryObject ; 모든 단일 클래스, 메소드 및 속성에는 광범위한 XML 문서가 있으므로 IntelliSense에 자동으로 표시되어야합니다. 공식 OpenAI 문서와 결합 된 것은 시작하기에 충분해야합니다. 궁금한 점이 있으면 여기에서 자유롭게 문제를여십시오. 나중에 더 나은 문서화가 올 수 있습니다.
CC-0 퍼블릭 도메인
이 라이브러리는 공개 도메인에서 라이센스가 부여 된 CC-0입니다. 허가 나 라이센스 등에 대해 걱정하지 않고 공개적으로 또는 개인적으로 원하는대로 사용할 수 있습니다. OpenAI API 주변의 래퍼 일 뿐이므로 여전히 OpenAI에 직접 액세스해야합니다. 나는 OpenAI와 관련이 없으며이 라이브러리는 그들에 의해 승인되지 않습니다. 베타 액세스 권한이 있고 C# 라이브러리를 만들기 위해 더 쉽게 액세스하고 싶었습니다. 바라건대 다른 사람들도 이것도 유용하다고 생각합니다. 기여하고 싶은 것이 있다면 PR을 열어주십시오.