مكتبة تكامل ChatGPT لـ .NET ، تدعم خدمة Openai و Azure Openai.
المكتبة متوفرة على Nuget. فقط ابحث عن chatgptnet في واجهة المستخدم الرسومية لمدير الحزمة أو قم بتشغيل الأمر التالي في .NET CLI :
dotnet add package ChatGptNetسجل خدمة chatgpt عند بدء تشغيل التطبيق:
builder . Services . AddChatGpt ( options =>
{
// OpenAI.
//options.UseOpenAI(apiKey: "", organization: "");
// Azure OpenAI Service.
//options.UseAzure(resourceName: "", apiKey: "", authenticationType: AzureAuthenticationType.ApiKey);
options . DefaultModel = " my-model " ;
options . DefaultEmbeddingModel = " text-embedding-ada-002 " ;
options . MessageLimit = 16 ; // Default: 10
options . MessageExpiration = TimeSpan . FromMinutes ( 5 ) ; // Default: 1 hour
options . DefaultParameters = new ChatGptParameters
{
MaxTokens = 800 ,
//MaxCompletionTokens = 800, // o1 series models support this property instead of MaxTokens
Temperature = 0.7
} ;
} ) ;يدعم ChatGptnet خدمة Openai و Azure Openai ، لذلك من الضروري تعيين إعدادات التكوين الصحيحة بناءً على المزود المختار:
يمكن استخدام ChatGPT مع طرز مختلفة لإنجاز الدردشة ، سواء على خدمة Openai و Azure Openai. باستخدام خاصية DefaultModel ، يمكنك تحديد النموذج الافتراضي الذي سيتم استخدامه ، إلا إذا قمت بتمرير قيمة واضحة في أساليب AskAsync أو AsyStreamAsync .
حتى لو لم يكن ذلك ضروريًا تمامًا لمحادثة الدردشة ، فإن المكتبة تدعم أيضًا واجهة برمجة تطبيقات التضمين ، على كل من Openai و Azure Openai. بالنسبة لإنجاز الدردشة ، يمكن إجراء التضمينات مع نماذج مختلفة. باستخدام خاصية DefaultEmbedDingModel ، يمكنك تحديد النموذج الافتراضي الذي سيتم استخدامه ، إلا إذا قمت بتمرير قيمة صريحة في طريقة getEmbedDingAsync .
النماذج المتاحة حاليًا هي:
لديهم أسماء ثابتة ، متوفرة في ملف OpenAichatgptModels.cs.
في Azure Openai Service ، يجب عليك أولاً نشر نموذج قبل أن تتمكن من إجراء مكالمات. عند نشر نموذج ، تحتاج إلى تعيين اسم ، يجب أن يتطابق مع الاسم الذي تستخدمه مع ChatGptNet .
لاحظ أن بعض النماذج غير متوفرة في جميع المناطق. يمكنك الرجوع إلى جدول ملخص النموذج وصفحة توافر المنطقة للتحقق من التوافر الحالي.
يهدف ChatGPT إلى دعم سيناريوهات المحادثة: يمكن للمستخدم التحدث إلى ChatGPT دون تحديد السياق الكامل لكل تفاعل. ومع ذلك ، لا تتم إدارة تاريخ المحادثة بواسطة خدمة Openai أو Azure Openai ، لذلك الأمر متروك لنا للاحتفاظ بالحالة الحالية. افتراضيًا ، يتعامل ChatGptNet مع هذا المطلب باستخدام MemoryCache يخزن الرسائل لكل محادثة. يمكن تعيين السلوك باستخدام الخصائص التالية:
إذا لزم الأمر ، من الممكن توفير ذاكرة التخزين المؤقت المخصصة من خلال تطبيق واجهة IChatGPTCache ثم استدعاء طريقة امتداد WithCache :
public class LocalMessageCache : IChatGptCache
{
private readonly Dictionary < Guid , IEnumerable < ChatGptMessage > > localCache = new ( ) ;
public Task SetAsync ( Guid conversationId , IEnumerable < ChatGptMessage > messages , TimeSpan expiration , CancellationToken cancellationToken = default )
{
localCache [ conversationId ] = messages . ToList ( ) ;
return Task . CompletedTask ;
}
public Task < IEnumerable < ChatGptMessage > ? > GetAsync ( Guid conversationId , CancellationToken cancellationToken = default )
{
localCache . TryGetValue ( conversationId , out var messages ) ;
return Task . FromResult ( messages ) ;
}
public Task RemoveAsync ( Guid conversationId , CancellationToken cancellationToken = default )
{
localCache . Remove ( conversationId ) ;
return Task . CompletedTask ;
}
public Task < bool > ExistsAsync ( Guid conversationId , CancellationToken cancellationToken = default )
{
var exists = localCache . ContainsKey ( conversationId ) ;
return Task . FromResult ( exists ) ;
}
}
// Registers the custom cache at application startup.
builder . Services . AddChatGpt ( /* ... */ ) . WithCache < LocalMessageCache > ( ) ;يمكننا أيضًا تعيين معلمات chatgpt لإكمال الدردشة عند بدء التشغيل. تحقق من الوثائق الرسمية لقائمة المعلمات المتاحة ومعناها.
يمكن قراءة التكوين تلقائيًا من الأيقونات ، باستخدام قسم chatGPT على سبيل المثال في ملف AppSettings.Json :
"ChatGPT": {
"Provider": "OpenAI", // Optional. Allowed values: OpenAI (default) or Azure
"ApiKey": "", // Required
//"Organization": "", // Optional, used only by OpenAI
"ResourceName": "", // Required when using Azure OpenAI Service
"ApiVersion": "2024-10-21", // Optional, used only by Azure OpenAI Service (default: 2024-10-21)
"AuthenticationType": "ApiKey", // Optional, used only by Azure OpenAI Service. Allowed values: ApiKey (default) or ActiveDirectory
"DefaultModel": "my-model",
"DefaultEmbeddingModel": "text-embedding-ada-002", // Optional, set it if you want to use embedding
"MessageLimit": 20,
"MessageExpiration": "00:30:00",
"ThrowExceptionOnError": true // Optional, default: true
//"User": "UserName",
//"DefaultParameters": {
// "Temperature": 0.8,
// "TopP": 1,
// "MaxTokens": 500,
// "MaxCompletionTokens": null, // o1 series models support this property instead of MaxTokens
// "PresencePenalty": 0,
// "FrequencyPenalty": 0,
// "ResponseFormat": { "Type": "text" }, // Allowed values for Type: text (default) or json_object
// "Seed": 42 // Optional (any integer value)
//},
//"DefaultEmbeddingParameters": {
// "Dimensions": 1536
//}
}
ثم استخدم الحمل الزائد المقابل لطريقة Che Addchatgpt :
// Adds ChatGPT service using settings from IConfiguration.
builder . Services . AddChatGpt ( builder . Configuration ) ;تحتوي طريقة AddChatGPT أيضًا على حمل زائد يقبل iserviceprovider كوسيطة. يمكن استخدامه ، على سبيل المثال ، إذا كنا في واجهة برمجة تطبيقات الويب ونحتاج إلى دعم السيناريوهات التي يكون فيها كل مستخدم لديه مفتاح API مختلف يمكن استرداده للوصول إلى قاعدة بيانات عبر حقن التبعية:
builder . Services . AddChatGpt ( ( services , options ) =>
{
var accountService = services . GetRequiredService < IAccountService > ( ) ;
// Dynamically gets the API Key from the service.
var apiKey = " ... "
options . UseOpenAI ( apiKyey ) ;
} ) ;في سيناريوهات أكثر تعقيدًا ، من الممكن تكوين ChatGptNet باستخدام كل من الكود والأيقونات. يمكن أن يكون هذا مفيدًا إذا أردنا تعيين مجموعة من الخصائص الشائعة ، ولكن في نفس الوقت نحتاج إلى بعض منطق التكوين. على سبيل المثال:
builder . Services . AddChatGpt ( ( services , options ) =>
{
// Configure common properties (message limit and expiration, default parameters, ecc.) using IConfiguration.
options . UseConfiguration ( builder . Configuration ) ;
var accountService = services . GetRequiredService < IAccountService > ( ) ;
// Dynamically gets the API Key from the service.
var apiKey = " ... "
options . UseOpenAI ( apiKyey ) ;
} ) ;يستخدم ChatGptNet httpclient للاتصال بإنجاز الدردشة وتضمين واجهات برمجة التطبيقات. إذا كنت بحاجة إلى تخصيصه ، فيمكنك استخدام الحمل الزائد لطريقة AddChatGPT التي تقبل إجراءً <ihttpclientbuiler> كوسيطة. على سبيل المثال ، إذا كنت ترغب في إضافة مرونة إلى عميل HTTP (دعنا نقول سياسة إعادة المحاولة) ، فيمكنك استخدام Polly:
// using Microsoft.Extensions.DependencyInjection;
// Requires: Microsoft.Extensions.Http.Resilience
builder . Services . AddChatGpt ( context . Configuration ,
httpClient =>
{
// Configures retry policy on the inner HttpClient using Polly.
httpClient . AddStandardResilienceHandler ( options =>
{
options . AttemptTimeout . Timeout = TimeSpan . FromMinutes ( 1 ) ;
options . CircuitBreaker . SamplingDuration = TimeSpan . FromMinutes ( 3 ) ;
options . TotalRequestTimeout . Timeout = TimeSpan . FromMinutes ( 3 ) ;
} ) ;
} )مزيد من المعلومات حول هذا الموضوع متاح على الوثائق الرسمية.
يمكن استخدام المكتبة في أي تطبيق .NET مصمم باستخدام .NET 6.0 أو أحدث. على سبيل المثال ، يمكننا إنشاء الحد الأدنى من واجهة برمجة التطبيقات بهذه الطريقة:
app . MapPost ( " /api/chat/ask " , async ( Request request , IChatGptClient chatGptClient ) =>
{
var response = await chatGptClient . AskAsync ( request . ConversationId , request . Message ) ;
return TypedResults . Ok ( response ) ;
} )
. WithOpenApi ( ) ;
// ...
public record class Request ( Guid ConversationId , string Message ) ;إذا كنا نريد فقط استرداد رسالة الاستجابة ، فيمكننا استدعاء طريقة getContent :
var content = response . GetContent ( ) ;لاحظ إذا تم ترشيح الاستجابة بواسطة نظام تصفية المحتوى ، فسيتم إرجاع GetContent NULL . لذلك ، يجب عليك دائمًا التحقق من
response.IsContentFiltered.
باستخدام التكوين ، من الممكن تعيين المعلمات الافتراضية لإنجاز الدردشة. ومع ذلك ، يمكننا أيضًا تحديد المعلمات لكل طلب ، باستخدام عمليات تحميل AskAsync أو AskstreamAsync التي تقبل كائن ChatGptParameters:
var response = await chatGptClient . AskAsync ( conversationId , message , new ChatGptParameters
{
MaxTokens = 150 ,
Temperature = 0.7
} ) ;لا نحتاج إلى تحديد جميع المعلمات ، فقط المعلمات التي نريد تجاوزها. سيتم أخذ الأخرى من التكوين الافتراضي.
من المعروف أن chatgpt غير حتمية. هذا يعني أن نفس المدخلات يمكن أن تنتج مخرجات مختلفة. لمحاولة التحكم في هذا السلوك ، يمكننا استخدام معلمات درجة الحرارة و TOPP . على سبيل المثال ، يجعل ضبط درجة الحرارة على القيم القريبة إلى 0 النموذج أكثر حتمية ، مع تعيينه على القيم القريبة إلى 1 يجعل النموذج أكثر إبداعًا. ومع ذلك ، هذا لا يكفي دائمًا للحصول على نفس الإخراج لنفس الإدخال. لمعالجة هذه المشكلة ، قدم Openai معلمة البذور . إذا تم تحديده ، فيجب أن يتم عينة النموذج بشكل حتمي ، بحيث يجب أن تُرجع الطلبات المتكررة بنفس البذور والمعلمات نفس النتيجة. ومع ذلك ، لا يتم ضمان الحتمية لا في هذه الحالة ، ويجب أن تشير إلى معلمة استجابة SystemFingerPrint لمراقبة التغييرات في الواجهة الخلفية. التغييرات في هذه القيم تعني أن تكوين الواجهة الخلفية قد تغير ، وقد يؤثر ذلك على الحتمية.
كما هو الحال دائمًا ، يمكن تحديد خاصية البذور في التكوين الافتراضي أو في عمليات التحميل الزائد لـ AskAsync أو AskstreamAsync التي تقبل شاتيباراميراميرامترات.
ملاحظة يتم دعم Seed و SystemFingerPrint فقط من خلال أحدث النماذج ، مثل GPT-4-1106-Preview .
إذا كنت تريد أن تخدع الاستجابة بتنسيق JSON ، فيمكنك استخدام معلمة ResponseFormat :
var response = await chatGptClient . AskAsync ( conversationId , message , new ChatGptParameters
{
ResponseFormat = ChatGptResponseFormat . Json ,
} ) ;وبهذه الطريقة ، ستكون الاستجابة دائمًا JSON صالحة. لاحظ أنه يجب أيضًا توجيه النموذج لإنتاج JSON عبر نظام أو رسالة مستخدم. إذا لم تقم بذلك ، فسيقوم النموذج بإرجاع خطأ.
كما هو الحال دائمًا ، يمكن تحديد خاصية ResponseFormat في التكوين الافتراضي أو في عمليات التحميل الزائد لـ ASKASYNC أو ASKSTREAMASYNC التي تقبل chatgptparameters.
Note Responseformat مدعوم فقط من قبل أحدث النماذج ، مثل GPT-4-1106-Preview .
توفر أساليب AskAsync و Askstreamasync (انظر أدناه) عمليات تحميل زائدة تتطلب معلمة محادثة . إذا تم نقل قيمة فارغة ، يتم إنشاء قيمة عشوائية وإعادتها. يمكننا تمرير هذه القيمة في الدعوات اللاحقة لـ ASKASYNC أو ASKSTREAMASYNC ، بحيث تقوم المكتبة تلقائيًا باسترداد الرسائل السابقة للمحادثة الحالية (وفقًا لإعدادات Messagelimit و MessageExpiration ) وإرسالها إلى API لإكمال الدردشة.
هذا هو السلوك الافتراضي لجميع تفاعلات الدردشة. إذا كنت ترغب في التخلص من تفاعل معين من تاريخ المحادثة ، فيمكنك تعيين وسيطة AddToConversationHistory إلى False :
var response = await chatGptClient . AskAsync ( conversationId , message , addToConversationHistory : false ) ;وبهذه الطريقة ، سيتم إرسال الرسالة إلى واجهة برمجة تطبيقات إكمال الدردشة ، ولكن لن تتم إضافة الإجابة المقابلة من ChatGPT إلى تاريخ المحادثة.
من ناحية أخرى ، في بعض السيناريوهات ، قد يكون من المفيد إضافة تفاعل الدردشة يدويًا (أي سؤال متبوعًا بإجابة) على تاريخ المحادثة. على سبيل المثال ، قد نرغب في إضافة رسالة تم إنشاؤها بواسطة روبوت. في هذه الحالة ، يمكننا استخدام طريقة addInterActionAsync :
await chatGptClient . AddInteractionAsync ( conversationId , question : " What is the weather like in Taggia? " ,
answer : " It's Always Sunny in Taggia " ) ;سيتم إضافة السؤال كرسالة مستخدم وسيتم إضافة الإجابة كرسالة مساعدة في سجل المحادثة. كما هو الحال دائمًا ، سيتم استخدام هذه الرسائل الجديدة (فيما يتعلق بخيار Messagelimit ) في الدعوات اللاحقة لـ Askasync أو Askstreamasync .
API الانتهاء من الدردشة تدعم بث الاستجابة. عند استخدام هذه الميزة ، سيتم إرسال Deltas للرسالة الجزئية ، كما هو الحال في ChatGPT. سيتم إرسال الرموز كأحداث خادم فقط للبيانات عند توفرها. يوفر ChatGptnet دفق الاستجابة باستخدام طريقة AskstreamAsync :
// Requests a streaming response.
var responseStream = chatGptClient . AskStreamAsync ( conversationId , message ) ;
await foreach ( var response in responseStream )
{
Console . Write ( response . GetContent ( ) ) ;
await Task . Delay ( 80 ) ;
}لاحظ إذا تم ترشيح الاستجابة بواسطة نظام تصفية المحتوى ، فإن طريقة getContent في foreach ستعيد السلاسل الفارغة . لذلك ، يجب عليك دائمًا التحقق من
response.IsContentFiltered.
يعمل تدفق الاستجابة من خلال إرجاع iasyncenumeripty ، بحيث يمكن استخدامه حتى في مشروع واجهة برمجة تطبيقات الويب:
app . MapGet ( " /api/chat/stream " , ( Guid ? conversationId , string message , IChatGptClient chatGptClient ) =>
{
async IAsyncEnumerable < string ? > Stream ( )
{
// Requests a streaming response.
var responseStream = chatGptClient . AskStreamAsync ( conversationId . GetValueOrDefault ( ) , message ) ;
// Uses the "AsDeltas" extension method to retrieve partial message deltas only.
await foreach ( var delta in responseStream . AsDeltas ( ) )
{
yield return delta ;
await Task . Delay ( 50 ) ;
}
}
return Stream ( ) ;
} )
. WithOpenApi ( ) ;لاحظ إذا تم تصفية الاستجابة بواسطة نظام تصفية المحتوى ، فإن طريقة Asdeltas في Foreach ستعيد سلسلة Nulls .
المكتبة متوافقة بنسبة 100 ٪ أيضًا مع تطبيقات Blazor Webassembly:
تحقق من مجلد العينات لمزيد من المعلومات حول التطبيقات المختلفة.
يدعم ChatGPT الرسائل التي تحمل دور النظام للتأثير على كيفية تصرف المساعد. على سبيل المثال ، يمكننا أن نقول لدردشة شيء من هذا القبيل:
يوفر ChatGptNet هذه الميزة باستخدام طريقة SetUpAsync :
var conversationId await = chatGptClient . SetupAsync ( " Answer in rhyme " ) ;إذا استخدمنا نفس المحادثة عند الاتصال بـ ASKASYNC ، فسيتم إرسال رسالة النظام تلقائيًا مع كل طلب ، حتى يعرف المساعد كيفية التصرف.
ملاحظة لا يتم احتساب رسالة النظام لرقم الحد من الرسائل.
يتم حذف سجل المحادثة تلقائيًا عند الوصول إلى وقت انتهاء الصلاحية (المحددة بواسطة خاصية MessageExpiration ). ومع ذلك ، إذا لزم الأمر ، فمن الممكن مسح التاريخ على الفور:
await chatGptClient . DeleteConversationAsync ( conversationId , preserveSetup : false ) ;تسمح وسيطة Preservesetup بتحديد ما إذا كان Mantain أيضًا رسالة النظام التي تم تعيينها باستخدام طريقة setupasync (افتراضي: خطأ ).
من خلال استدعاء الوظيفة ، يمكننا وصف الوظائف ونطلب من النموذج بذكاء إخراج كائن JSON يحتوي على وسيط لاستدعاء هذه الوظائف. هذه طريقة جديدة لتوصيل قدرات GPT بشكل أكثر موثوقية باستخدام الأدوات الخارجية وواجهة برمجة التطبيقات.
يدعم ChatGptNet بالكامل استدعاء الوظيفة من خلال توفير حمولة زائدة من طريقة AskAsync التي تسمح بتحديد تعريفات الوظائف. إذا تم توفير هذه المعلمة ، فسيقرر النموذج متى يتم الاعتماد على استخدام وظيفة. على سبيل المثال:
var functions = new List < ChatGptFunction >
{
new ( )
{
Name = " GetCurrentWeather " ,
Description = " Get the current weather " ,
Parameters = JsonDocument . Parse ( """
{
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and/or the zip code"
},
"format": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "The temperature unit to use. Infer this from the user's location."
}
},
"required": ["location", "format"]
}
""" )
} ,
new ( )
{
Name = " GetWeatherForecast " ,
Description = " Get an N-day weather forecast " ,
Parameters = JsonDocument . Parse ( """
{
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and/or the zip code"
},
"format": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "The temperature unit to use. Infer this from the user's location."
},
"daysNumber": {
"type": "integer",
"description": "The number of days to forecast"
}
},
"required": ["location", "format", "daysNumber"]
}
""" )
}
} ;
var toolParameters = new ChatGptToolParameters
{
FunctionCall = ChatGptToolChoices . Auto , // This is the default if functions are present.
Functions = functions
} ;
var response = await chatGptClient . AskAsync ( " What is the weather like in Taggia? " , toolParameters ) ;يمكننا تمرير عدد تعسفي من الوظائف ، كل واحدة تحمل اسمًا ووصفًا ومخطط JSON يصف معلمات الوظيفة ، بعد مراجع مخطط JSON. تحت الغطاء ، يتم حقن الوظائف في رسالة النظام في بناء جملة تم تدريب النموذج. هذا يعني أن وظائف العد مقابل حد سياق النموذج ويتم وصفه كـ رمز إدخال.
يوفر كائن الاستجابة الذي يتم إرجاعه بواسطة طريقة AskAsync خاصية للتحقق مما إذا كان النموذج قد حدد استدعاء دالة:
if ( response . ContainsFunctionCalls ( ) )
{
Console . WriteLine ( " I have identified a function to call: " ) ;
var functionCall = response . GetFunctionCall ( ) ! ;
Console . WriteLine ( functionCall . Name ) ;
Console . WriteLine ( functionCall . Arguments ) ;
}سيطبع هذا الرمز شيئًا كهذا:
I have identified a function to call:
GetCurrentWeather
{
"location": "Taggia",
"format": "celsius"
}
لاحظ أن واجهة برمجة التطبيقات لن تنفذ بالفعل أي مكالمات دالة. الأمر متروك للمطورين لتنفيذ مكالمات الوظائف باستخدام مخرجات النموذج.
بعد التنفيذ الفعلي ، نحتاج إلى استدعاء طريقة AddToolResPonseasyNC على ChatGptClient لإضافة الاستجابة إلى سجل المحادثة ، تمامًا مثل الرسالة القياسية ، بحيث يتم استخدامها تلقائيًا لإكمال الدردشة:
// Calls the remote function API.
var functionResponse = await GetWeatherAsync ( functionCall . Arguments ) ;
await chatGptClient . AddToolResponseAsync ( conversationId , functionCall , functionResponse ) ;تدعم النماذج الأحدث مثل GPT-4-Turbo نهجًا أكثر عمومية للوظائف ، ودعوة الأداة . عند إرسال طلب ، يمكنك تحديد قائمة بالأدوات التي قد يتصل بها النموذج. حاليًا ، يتم دعم الوظائف فقط ، ولكن في الإصدار المستقبلي ، ستكون أنواع أخرى من الأدوات متاحة.
لاستخدام استدعاء الأدوات بدلاً من استدعاء الوظائف المباشرة ، تحتاج إلى تعيين خصائص الأدوات والأدوات في كائن chatgpttoolparameters (بدلاً من الوظيفة والوظيفة ، كما في المثال السابق):
var toolParameters = new ChatGptToolParameters
{
ToolChoice = ChatGptToolChoices . Auto , // This is the default if functions are present.
Tools = functions . ToTools ( )
} ;يتم استخدام طريقة تمديد Totools لتحويل قائمة من chatgptfunction إلى قائمة الأدوات.
إذا كنت تستخدم هذا النهج الجديد ، بالطبع لا تزال بحاجة إلى التحقق مما إذا كان النموذج قد حدد مكالمة أداة ، باستخدام نفس النهج الموضح من قبل. بعد ذلك ، بعد التنفيذ الفعلي للوظيفة ، يجب عليك استدعاء طريقة AddToolResPonseasync ، ولكن في هذه الحالة تحتاج إلى تحديد الأداة (وليس الوظيفة) التي تشير إليها الاستجابة:
var tool = response . GetToolCalls ( ) ! . First ( ) ;
var functionCall = response . GetFunctionCall ( ) ! ;
// Calls the remote function API.
var functionResponse = await GetWeatherAsync ( functionCall . Arguments ) ;
await chatGptClient . AddToolResponseAsync ( conversationId , tool , functionResponse ) ;أخيرًا ، تحتاج إلى إعادة تقديم الرسالة الأصلية إلى API لإكمال الدردشة ، بحيث يمكن للنموذج متابعة المحادثة مع مراعاة استجابة استدعاء الوظيفة. تحقق من عينة استدعاء الوظيفة للتنفيذ الكامل لسير العمل هذا.
عند استخدام خدمة Azure Openai ، نحصل تلقائيًا على تصفية المحتوى مجانًا. للحصول على تفاصيل حول كيفية عملها ، تحقق من الوثائق. يتم إرجاع هذه المعلومات لجميع السيناريوهات عند استخدام API الإصدار 2023-06-01-preview أو لاحقًا. يدعم ChatGptNet هذا نموذج الكائن هذا من خلال توفير الخصائص المقابلة في فئات ChatGptResponse و ChatGptChoice.
تسمح التضمينات بتحويل النص إلى مساحة متجه. يمكن أن يكون هذا مفيدًا لمقارنة تشابه جملتين ، على سبيل المثال. يدعم ChatGptNet هذه الميزة بالكامل من خلال توفير طريقة getEmbeddingAsync :
var response = await chatGptClient . GenerateEmbeddingAsync ( message ) ;
var embeddings = response . GetEmbedding ( ) ;سيعطيك هذا الرمز مجموعة تعويم تحتوي على جميع التضمين للرسالة المحددة. يعتمد طول المصفوفة على النموذج المستخدم:
| نموذج | البعد الإخراج |
|---|---|
| النصوص النصية -ADA-002 | 1536 |
| النصوص النصية-3-small | 1536 |
| embedding-3-large | 3072 |
تتيح النماذج الأحدث مثل embedding-3-small و embedding-3-large للمطورين أداء المقايضة وتكلفة استخدام التضمينات. على وجه التحديد ، يمكن للمطورين تقصير التضمينات دون فقدان خصائص تمثيلها المفاهيم.
أما بالنسبة إلى chatgpt ، يمكن إجراء هذه الإعدادات بطرق مختلفة:
builder . Services . AddChatGpt ( options =>
{
// ...
options . DefaultEmbeddingParameters = new EmbeddingParameters
{
Dimensions = 256
} ;
} ) ; "ChatGPT": {
"DefaultEmbeddingParameters": {
"Dimensions": 256
}
}
ثم ، إذا كنت ترغب في تغيير البعد لطلب معين ، فيمكنك تحديد وسيطة inmbeddarameters في استدعاء getEmbeddingAsync :
var response = await chatGptClient . GenerateEmbeddingAsync ( request . Message , new EmbeddingParameters
{
Dimensions = 512
} ) ;
var embeddings = response . GetEmbedding ( ) ; // The length of the array is 512إذا كنت بحاجة إلى حساب تشابه جيب التمام بين اثنين من التضمين ، فيمكنك استخدام طريقة التضمين .
الوثائق التقنية الكاملة متوفرة هنا.
المشروع يتطور باستمرار. المساهمات موضع ترحيب. لا تتردد في تقديم المشكلات وسحب الطلبات على الريبو وسنخاطبها قدر الإمكان.
تحذير تذكر العمل على فرع التطوير ، لا تستخدم الفرع الرئيسي مباشرة. إنشاء طلبات سحب الاستهداف تطوير .