Интеграция API API (CHATGPT) OpenAI (CHATGPT) с поддержкой DI и EF CORE. Это позволяет использовать API в ваших приложениях .NET. Кроме того, клиент поддерживает потоковые ответы (например, CHATGPT) через Async Streams.
AddChatGptEntityFrameworkIntegration теперь требует builder.Configuration в качестве обязательного параметра.StructuredResponse позволяет получить структурированные ответы от API в качестве объекта C#. См. Структурированный разговор. Во -первых, вам нужно создать учетную запись OpenAI и получить ключ API (или OpenRouter или Azure OpenAI). Вы можете сделать это по адресу https://platform.openai.com/account/api-keys.
Самый простой способ использовать услугу CHATGPT в вашем проекте .NET с поддержкой DI и Persistence (EF CORE) - это установить пакет NUGET OPENAI.CHATGPT.EentityFrameWorkCore:
Install-Package OpenAI.ChatGPT.EntityFrameworkCore
Если вы не хотите использовать EF Core, вы можете установить пакет openai.chatgpt.aspnetcore и реализовать свое собственное хранилище для истории чата, используя интерфейс IChatHistoryStorage .
TL; DR: см. Пример в справочном проекте.
appsettings.json (небезопасно): {
"AIProvider" : " openai " , // or openrouter or azure_openai
"OpenAICredentials" : { //optional
"ApiKey" : " your-api-key-from-openai " ,
"ApiHost" : " https://api.openai.com/v1/ "
},
"AzureOpenAICredentials" : { //optional
"ApiKey" : " your-api-key-from-azure-openai " ,
"ApiHost" : " https://{your-host}.openai.azure.com/ " ,
"DeploymentName" : " gpt-4-turbo-preview "
},
"OpenRouterCredentials" : { //optional
"ApiKey" : " your-api-key-from-openrouter " ,
"ApiHost" : " https://openrouter.ai/api/v1 "
}
} Кроме того, вы можете указать ключ OpenAI API как переменную среды ASPNETCORE_OpenAICredentials:ApiKey .
builder . Services . AddChatGptEntityFrameworkIntegration (
builder . Configuration ,
options => options . UseSqlite ( " Data Source=chats.db " ) ) ; Вместо options.UseSqlite("Data Source=chats.db") Используйте свой собственный DB и строка подключения.
ChatGPTFactory в ваш сервис и используйте его для создания экземпляра ChatGPT : public class YourService
{
private readonly ChatGPTFactory _chatGptFactory ;
public YourService ( ChatGPTFactory chatGptFactory )
{
_chatGptFactory = chatGptFactory ;
}
public async Task < string > GetAnswer ( string text )
{
ChatGPT chatGpt = await _chatGptFactory . Create ( userId ) ;
var chatService = await chatGpt . ContinueOrStartNewTopic ( ) ;
response = await _chatService . GetNextMessageResponse ( _prompt ) ;
return response ;
}
}Смотрите пример Blazor.
Если вы хотите настроить параметры запроса, вы можете сделать это в конфигурации appsettings.json или в ChatGPTFactory.Create или в методах ChatGPT.CreateChat .
{
"ChatGPTConfig" : {
"InitialSystemMessage" : " You are a helpful and kind assistant. " ,
"InitialUserMessage" : null ,
"MaxTokens" : null ,
"Model" : null ,
"Temperature" : null ,
"PassUserIdToOpenAiRequests" : true
}
}См. Параметры Описание внутри ChatgptConfig.
Если ответ сервера не является кодом состояния успеха, клиент бросит notexpectedResponseException. Исключение будет содержать сообщение об ошибке от API OpenAI.
По умолчанию, запрашивая отмену или метод ChatService.Stop() Вызовы вызовет OperationCanceledException . Если вы не хотите бросить его (актуально для потоковых ответов), вы можете установить параметр throwOnCancellation на false :
await foreach ( string chunk in chatService . StreamNextMessageResponse ( text , throwOnCancellation : false ) )
{
//...
} ChatGPTFactory , ChatGPT Class-Safety зависит от реализации IChatHistoryStorage . Если вы используете ChatGPTFactory с Entity Framework, это не безопасно. Класс ChatService не безопасен.
В любом случае, эти услуги предназначены для безопасного использования с DI, поэтому вам не нужно беспокоиться об этом.
Все методы из всех пакетов предназначены для использования в асинхронном контексте, и используйте ConfigureAwait(false) (спасибо за пакет ConfigureAwait.Fody ).
Поскольку ChatGPTFactory зависит от IHttpClientFactory , вы можете легко использовать любую из доступных политик для нее, например, Polly .
Этот модуль позволяет получить структурированные ответы от API в качестве объекта C#. Это полезно, если вы хотите использовать API для чего -то большего, чем просто чат.
record City ( string Name , int YearOfFoundation , string Country ) ;
var message = Dialog
. StartAsSystem ( " Return requested data. " )
. ThenUser ( " I need info about Almaty city " ) ;
City almaty = await _client . GetStructuredResponse < City > ( message , model : ChatCompletionModels . Gpt4Turbo ) ;
Console . WriteLine ( almaty ) ; // Name: "Almaty", Country: "Kazakhstan", YearOfFoundation: 1854 Под капотом он использует новый режим JSON API для GPT4Turbo и для gpt-3.5-turbo-1106 . Регулярные модели GPT4 и GPT3.5turbo также поддерживаются, но ответы GPT3.5 могут быть нестабильными (для GPT3.5 он строго рекомендуется предоставить параметр examples ).
Более сложные примеры с массивами, вложенными объектами и перечислениями доступны в тестах:
CHATGPT_API_DOTNET/TESTS/OPENAI.CHATGPT.INTEGRATIONTSTS/OPENAICLIENTTSTS/OPENAICLIVE_GETSTRUCTURDRESPONSE.CS
Линия 1 в F50D386
Nuget: https://www.nuget.org/packages/openai.chatgpt.modules.structuredResponse
Этот модуль позволяет переводить сообщения с одного языка на другой.
string textToTranslate = " Hello, world! " ;
string translatedText = await _client . TranslateText ( textToTranslate , " English " , " Russian " ) ;
Console . WriteLine ( translatedText ) ; // "Привет, мир!" Кроме того, можно перевести весь объект в паре с модулем StructuredResponse :
var objectToTranslate = new Order (
new List < Order . Item >
{
new ( 1 , " Book " , 5 ) ,
new ( 2 , " Pen " , 10 ) ,
new ( 3 , " Notebook " , 3 )
}
) ;
Order translatedObject = await _client . TranslateObject ( objectToTranslate , " English " , " Russian " ) ;См. Полный пример в тестах:
ChatGPT_API_dotnet/tests/OpenAI.ChatGpt.IntegrationTests/ChatGptTranslatorServiceTests.cs
Линия 36 в 11658B7
Nuget: https://www.nuget.org/packages/openai.chatgpt.modules.translator
Вот список основных параметров, которые можно использовать в запросе API Chatcompletions (CHATGPT) (OpenAI.Chatgpt/Models/Chatcompletion/ChatcompletionRequest.cs). Некоторые из них взяты из этой статьи: https://towardsdatascience.com/gpt-3-parameters-and-prompt-design-1a595dc5b405
Ниже перечисленные параметры для API Chatcompletions.
Модель ИИ, генерирующая прогноз, указана параметром двигателя. Доступные модели описаны ниже: https://platform.openai.com/docs/models
| C# модель | Модель API |
|---|---|
| Chatcompletionmodels.gpt4turbo | GPT-4-1106-Preview |
| Chatcompletionmodels.gpt4 | GPT-4 |
| Chatcompletionmodels.gpt4_0613 | GPT-4-0613 |
| Chatcompletionmodels.gpt4_32k | GPT-4-32K |
| Chatcompletionmodels.gpt4_32k_0613 | GPT-4-32K-0613 |
| Chatcompletionmodels.gpt3_5_turbo | GPT-3.5-Turbo |
| Chatcompletionmodels.gpt3_5_turbo_1106 | GPT-3.5-Turbo-1106 |
| Chatcompletionmodels.gpt3_5_turbo_16k | GPT-3,5-Turbo-16K |
| Chatcompletionmodels.gpt3_5_turbo_0613 | GPT-3.5-Turbo-0613 |
| Chatcompletionmodels.gpt3_5_turbo_16k_0613 | GPT-3,5-Turbo-16K-0613 |
| Chatcompletionmodels.gpt4_0314 | GPT-4-0314 |
| Chatcompletionmodels.gpt4_32k_0314 | GPT-4-32K-0314 |
| Chatcompletionmodels.gpt3_5_turbo_0301 | GPT-3.5-Turbo-0301 |
Максимальное количество токенов разрешено для сгенерированного ответа. По умолчанию в ChatCompletionRequest.MaxTokensDefault (64).
ChatCompletionModels.GetMaxTokensLimitForModel .ChatCompletionMessage.CalculateApproxTotalTokenCountChatCompletionResponse.Usage.TotalTokens . Как правило для английского языка, 1 токен составляет около 4 символов (поэтому 100 токенов ≈ 75 слов). См. Tokenizer от Openai: https://platform.openai.com/tokenizerКакая температура выборки использовать от 0 до 2.
ChatCompletionTemperatures .ChatCompletionTemperatures.Balanced (0,5).Описание: Перед тем как быть отображаемым в вероятности, модель выводит неглазуемые значения (logits). Логиты обычно используются с такой функцией, как Softmax, для преобразования их в вероятности.
Но, прежде чем применять функцию SoftMax, мы можем использовать трюк, вдохновленный термодинамикой и масштабировать логиты с помощью параметра температуры, т.е. softmax (logits/температура).
Параметр температуры, близкий к 1, будет означать, что логиты проходят через функцию SoftMax без модификации. Если температура близка к нулю, самые высокие вероятные токены станут очень вероятными по сравнению с другими токенами, то есть модель становится более детерминированной и всегда будет выводить один и тот же набор токенов после данной последовательности слов.
Больше параметров описания можно найти здесь: некоторые из них взяты из этой статьи: https://towardsdatascience.com/gpt-3-parameters-and-prompt-design-1a595dc5b405
Если вам не нужна история DI и чат, вы можете использовать только пакет NUGET OPENAI.CHATGPT:
Install-Package OpenAI.ChatGPT
Затем создайте экземпляр OpenAIClient :
_client = new OpenAiClient ( " {YOUR_OPENAI_API_KEY} " ) ; string text = " Who are you? " ;
string response = await _client . GetChatCompletions ( new UserMessage ( text ) , maxTokens : 80 ) ;
Console . WriteLine ( response ) ; var text = " Write the world top 3 songs of Soul genre " ;
await foreach ( string chunk in _client . StreamChatCompletions ( new UserMessage ( text ) , maxTokens : 80 ) )
{
Console . Write ( chunk ) ;
} Используйте методы ThenAssistant , а ThenUser для создания диалога:
var dialog = Dialog . StartAsUser ( " How many meters are in a kilometer? Write just the number. " ) //the message from user
. ThenAssistant ( " 1000 " ) // response from the assistant
. ThenUser ( " Convert it to hex. Write just the number. " ) ; // the next message from user
await foreach ( var chunk in _client . StreamChatCompletions ( dialog , maxTokens : 80 ) )
{
Console . Write ( chunk ) ;
}Или просто отправьте историю сообщений в качестве коллекции.