OpenAI聊天完成API(CHATGPT)與DI和EF核心支持集成。它允許您在.NET應用程序中使用API。此外,客戶端還通過異步流支持流響應(例如chatgpt)。
AddChatGptEntityFrameworkIntegration現在需要builder.Configuration作為強制性參數。StructuredResponse模塊允許您從API作為C#對象獲得結構化響應。請參閱:結構性響應部分。 首先,您需要創建一個OpenAI帳戶並獲取API密鑰(或OpenRouter或Azure OpenAI)。您可以在https://platform.openai.com/account/api-keys上執行此操作。
使用DI和持久性(EF Core)支持的.NET項目中使用ChatGpt服務的最簡單方法是安裝Nuget Package OpenAi.Chatgpt.EntityFrameWorkCore:
Install-Package OpenAI.ChatGPT.EntityFrameworkCore
如果您不想使用EF Core,則可以使用IChatHistoryStorage界面安裝openai.chatgpt.aspnetcore的軟件包。
TL; DR:請參閱參考項目中的示例。
appsettings.json文件(不安全)中設置OpenAI API密鑰甚至是主機(可選): {
"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 ;
}
}請參閱《大火》示例。
如果要配置請求參數,則可以在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中的參數描述。
如果服務器響應不是成功的狀態代碼,則客戶端將拋出Not ExpedResponseException。例外將包含來自OpenAI API的錯誤消息。
默認情況下,請求取消或ChatService.Stop()方法調用將拋出OperationCanceledException 。如果您不想扔它(與流響應有關),則可以將throwOnCancellation參數設置為false :
await foreach ( string chunk in chatService . StreamNextMessageResponse ( text , throwOnCancellation : false ) )
{
//...
} ChatGPTFactory , ChatGPT類線程安全取決於IChatHistoryStorage實現。如果您將ChatGPTFactory與實體框架一起使用,則不是線程安全。 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在引擎蓋下,它使用GPT4TURBO的API的新JSON模式以及gpt-3.5-turbo-1106 。還支持常規的GPT4和GPT3.5TURBO模型,但是GPT3.5響應可能不穩定(對於GPT3.5而言,嚴格建議提供examples參數)。
帶有數組,嵌套對象和枚舉的更複雜的示例在測試中可用:
chatgpt_api_dotnet/tests/openai.chatgpt.integrationTests/openaiclienttests/openaiclient_get_getStructuredResponse.cs
F50D386中的第1行
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/chatgpttranslatreslatorserviceTests.cs
11658b7中的第36行
nuget:https://www.nuget.org/packages/openai.chatgpt.modules.translator
這是可以在chatcoppletions(chatgpt)API請求(OpenAi.chatgpt/models/chatcompletion/chatcompletionrequest.cs)中使用的主要參數的列表。其中一些是從本文中獲取的:https://towardsdatascience.com/gpt-3-parameters-and-prompt-design-1a595dc5b405
下面列出的聊天參數API。
預測生成的AI模型由發動機參數指定。可用型號如下所述:https://platform.openai.com/docs/models
| C#模型 | API模型 |
|---|---|
| chatcompletionmodels.gpt4turbo | GPT-4-1106-preiview |
| 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-11106 |
| 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.CalculateApproxTotalTokenCount方法來計算大約令牌計數ChatCompletionResponse.Usage.TotalTokens 。作為英語的經驗法則,1個令牌大約為4個字符(因此100個令牌≈75個字)。請參閱openai:https://platform.openai.com/tokenizer的Tokenizer要使用的採樣溫度在0到2之間。
ChatCompletionTemperatures中可用。ChatCompletionTemperatures.Balanced (0.5)。描述:在被映射到概率之前,模型輸出了非均衡值(logits)。邏輯通常與諸如SoftMax之類的函數一起使用,以將其轉換為概率。
但是,在應用SoftMax函數之前,我們可以使用受熱力學啟發的技巧,並使用溫度參數(即SoftMax(logits/Wemper))擴展邏輯。
接近1的溫度參數意味著邏輯通過無修改而通過SoftMax函數。如果溫度接近零,則可能與其他令牌相比,最高可能的令牌將變得更有可能,即模型變得更加確定性,並且在給定單詞序列後始終輸出相同的令牌集。
更多參數說明可以在此處找到:其中一些是從本文中獲取的:https://towardsdatascience.com/gpt-3-parameters-and-parameters-and-prompt-design-1a595dc5b405
如果您不需要DI和聊天歷史記錄,則只能使用Nuget Package 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 ) ;
}或者只是將消息歷史記錄作為集合發送。