Perpustakaan Integrasi ChatGPT untuk .NET, mendukung layanan OpenAi dan Azure Openai.
Perpustakaan tersedia di Nuget. Cukup cari chatgptNet di manajer paket GUI atau jalankan perintah berikut di .net CLI :
dotnet add package ChatGptNetDaftar Layanan ChatGPT di Startup Aplikasi:
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 mendukung layanan OpenAi dan Azure OpenAi, jadi perlu untuk mengatur pengaturan konfigurasi yang benar berdasarkan penyedia yang dipilih:
ChatGPT dapat digunakan dengan berbagai model untuk penyelesaian obrolan, baik di OpenAi dan Azure OpenAI Service. Dengan properti DefaultModel , Anda dapat menentukan model default yang akan digunakan, kecuali jika Anda memberikan nilai eksplisit dalam metode AsyStreamAsync .
Bahkan jika itu tidak sepenuhnya diperlukan untuk percakapan obrolan, perpustakaan juga mendukung API yang menanamkan, pada Openai dan Azure Openai. Sedangkan untuk penyelesaian obrolan, embeddings dapat dilakukan dengan model yang berbeda. Dengan properti DefaultemBedDingModel , Anda dapat menentukan model default yang akan digunakan, kecuali jika Anda memberikan nilai eksplisit dalam metode getembeddingAsync .
Model yang tersedia saat ini adalah:
Mereka memiliki nama tetap, tersedia di file openaichatgptmodels.cs.
Dalam layanan Azure Openai, Anda diharuskan untuk menggunakan model sebelum Anda dapat melakukan panggilan. Ketika Anda menggunakan model, Anda harus menugaskannya nama, itu harus cocok dengan nama yang Anda gunakan dengan chatgptNet .
Perhatikan beberapa model tidak tersedia di semua wilayah. Anda dapat merujuk ke halaman ringkasan model dan halaman ketersediaan wilayah untuk memeriksa ketersediaan saat ini.
ChatGPT bertujuan untuk mendukung skenario percakapan: Pengguna dapat berbicara dengan chatgpt tanpa menentukan konteks penuh untuk setiap interaksi. Namun, riwayat percakapan tidak dikelola oleh Openai atau Azure Openai Service, jadi terserah kita untuk mempertahankan keadaan saat ini. Secara default, ChatGptNet menangani persyaratan ini menggunakan memorycache yang menyimpan pesan untuk setiap percakapan. Perilaku dapat diatur menggunakan properti berikut:
Jika perlu, kemungkinan untuk menyediakan cache khusus dengan menerapkan antarmuka ichatgptcache dan kemudian memanggil metode ekstensi 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 > ( ) ;Kami juga dapat mengatur parameter chatgpt untuk penyelesaian obrolan saat startup. Periksa dokumentasi resmi untuk daftar parameter yang tersedia dan artinya.
Konfigurasi dapat secara otomatis dibaca dari Iconfiguration, menggunakan misalnya bagian chatgpt di file 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
//}
}
Dan kemudian gunakan kelebihan metode CHE AddChatGPT yang sesuai:
// Adds ChatGPT service using settings from IConfiguration.
builder . Services . AddChatGpt ( builder . Configuration ) ;Metode AddChatGPT juga memiliki kelebihan beban yang menerima argumen iserviceProvider sebagai argumen. Ini dapat digunakan, misalnya, jika kita berada di API Web dan kita perlu mendukung skenario di mana setiap pengguna memiliki kunci API yang berbeda yang dapat diambil mengakses database melalui injeksi ketergantungan:
builder . Services . AddChatGpt ( ( services , options ) =>
{
var accountService = services . GetRequiredService < IAccountService > ( ) ;
// Dynamically gets the API Key from the service.
var apiKey = " ... "
options . UseOpenAI ( apiKyey ) ;
} ) ;Dalam skenario yang lebih kompleks, dimungkinkan untuk mengkonfigurasi chatgptNet menggunakan kode dan ikonfigurasi. Ini bisa berguna jika kita ingin mengatur banyak properti umum, tetapi pada saat yang sama kita membutuhkan beberapa logika konfigurasi. Misalnya:
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 menggunakan httpClient untuk menghubungi penyelesaian obrolan dan menanamkan API. Jika Anda perlu menyesuaikannya, Anda dapat menggunakan kelebihan metode AddChatGPT yang menerima tindakan <IhttpClientBuiler> sebagai argumen. Misalnya, jika Anda ingin menambahkan ketahanan pada klien HTTP (katakanlah kebijakan coba lagi), Anda dapat menggunakan 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 ) ;
} ) ;
} )Informasi lebih lanjut tentang topik ini tersedia di dokumentasi resmi.
Perpustakaan dapat digunakan dalam aplikasi .NET apa pun yang dibangun dengan .NET 6.0 atau lebih baru. Misalnya, kita dapat membuat API minimal dengan cara ini:
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 ) ;Jika kami hanya ingin mengambil pesan respons, kami dapat memanggil metode GetContent :
var content = response . GetContent ( ) ;CATATAN Jika respons telah difilter oleh sistem penyaringan konten, GetContent akan mengembalikan NULL . Jadi, Anda harus selalu memeriksa
response.IsContentFiltered.
Menggunakan konfigurasi, dimungkinkan untuk mengatur parameter default untuk penyelesaian obrolan. Namun, kami juga dapat menentukan parameter untuk setiap permintaan, menggunakan AskAsync atau AskstreamAsync Overloads yang menerima objek ChatGptParameters:
var response = await chatGptClient . AskAsync ( conversationId , message , new ChatGptParameters
{
MaxTokens = 150 ,
Temperature = 0.7
} ) ;Kami tidak perlu menentukan semua parameter, hanya yang ingin kami angkankan. Yang lain akan diambil dari konfigurasi default.
Chatgpt dikenal tidak deterministik. Ini berarti bahwa input yang sama dapat menghasilkan output yang berbeda. Untuk mencoba mengendalikan perilaku ini, kita dapat menggunakan parameter suhu dan topp . Misalnya, mengatur suhu ke nilai -nilai di dekat 0 membuat model lebih deterministik, sambil mengaturnya ke nilai dekat 1 membuat model lebih kreatif. Namun, ini tidak selalu cukup untuk mendapatkan output yang sama untuk input yang sama. Untuk mengatasi masalah ini, Openai memperkenalkan parameter benih . Jika ditentukan, model harus sampel deterministik, sedemikian rupa sehingga permintaan berulang dengan benih yang sama dan parameter harus mengembalikan hasil yang sama. Namun demikian, determinisme tidak dijamin dalam kasus ini, dan Anda harus merujuk pada parameter respons SystemFingerPrint untuk memantau perubahan dalam backend. Perubahan dalam nilai ini berarti bahwa konfigurasi backend telah berubah, dan ini dapat memengaruhi determinisme.
Seperti biasa, properti seed dapat ditentukan dalam konfigurasi default atau di AskAsync atau Askstreamasync Overloads yang menerima chatgptParameters.
Catatan Seed dan SystemFingerprint hanya didukung oleh model terbaru, seperti preview GPT-4-1106 .
Jika Anda ingin melampaui respons dalam format JSON, Anda dapat menggunakan parameter responseFormat :
var response = await chatGptClient . AskAsync ( conversationId , message , new ChatGptParameters
{
ResponseFormat = ChatGptResponseFormat . Json ,
} ) ;Dengan cara ini, responsnya akan selalu menjadi JSON yang valid. Perhatikan bahwa juga harus menginstruksikan model untuk menghasilkan JSON melalui sistem atau pesan pengguna. Jika Anda tidak melakukan ini, model akan mengembalikan kesalahan.
Seperti biasa, properti responseFormat dapat ditentukan dalam konfigurasi default atau di AskAsync atau AskstreamAsync kelebihan yang menerima chatgptParameters.
Catatan ResponseFormat hanya didukung oleh model terbaru, seperti preview GPT-4-1106 .
Metode AskAsync dan AskstreamAsync (lihat di bawah) memberikan kelebihan beban yang memerlukan parameter ConversationID . Jika kita memberikan nilai kosong, yang acak dihasilkan dan dikembalikan. Kami dapat memberikan nilai ini dalam doa berikutnya dari AskAsync atau AskstreamAsync , sehingga perpustakaan secara otomatis mengambil pesan sebelumnya dari percakapan saat ini (menurut pengaturan MessageLimit dan Messageeexpiration ) dan mengirim mereka ke CHAT COMPETION API.
Ini adalah perilaku default untuk semua interaksi obrolan. Jika Anda ingin memancarkan interaksi tertentu dari riwayat percakapan, Anda dapat mengatur argumen addToConVersationHistory ke False :
var response = await chatGptClient . AskAsync ( conversationId , message , addToConversationHistory : false ) ;Dengan cara ini, pesan akan dikirim ke API penyelesaian obrolan, tetapi itu dan jawaban yang sesuai dari ChatGPT tidak akan ditambahkan ke riwayat percakapan.
Di sisi lain, dalam beberapa skenario, bisa berguna untuk secara manual menambahkan interaksi obrolan (yaitu, pertanyaan yang diikuti dengan jawaban) ke riwayat percakapan. Misalnya, kami mungkin ingin menambahkan pesan yang dihasilkan oleh bot. Dalam hal ini, kita dapat menggunakan metode AddInteractionAsync :
await chatGptClient . AddInteractionAsync ( conversationId , question : " What is the weather like in Taggia? " ,
answer : " It's Always Sunny in Taggia " ) ;Pertanyaan akan ditambahkan sebagai pesan pengguna dan jawabannya akan ditambahkan sebagai Asisten Pesan dalam riwayat percakapan. Seperti biasa, pesan -pesan baru ini (menghormati opsi MessageLimit ) akan digunakan dalam dongeng berikutnya dari AskAsync atau AskstreamAsync .
API Penyelesaian Obrolan mendukung streaming respons. Saat menggunakan fitur ini, Delta Pesan Parsial akan dikirim, seperti di ChatGPT. Token akan dikirim sebagai peristiwa yang Sent server hanya data saat tersedia. ChatgptNet menyediakan streaming respons menggunakan metode 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 ) ;
}Catatan Jika respons telah difilter oleh sistem penyaringan konten, metode GetContent di foreach akan mengembalikan string nol . Jadi, Anda harus selalu memeriksa
response.IsContentFiltered.
Streaming respons bekerja dengan mengembalikan iasyncenumerable, sehingga dapat digunakan bahkan dalam proyek API web:
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 ( ) ;Catatan Jika respons telah difilter oleh sistem penyaringan konten, metode asdeltas di foreach akan mengembalikan string nulls .
Perpustakaan ini 100% kompatibel juga dengan aplikasi Blazor WebAssembly:
Lihatlah folder sampel untuk informasi lebih lanjut tentang berbagai implementasi.
ChatGPT mendukung pesan dengan peran sistem untuk mempengaruhi bagaimana asisten harus berperilaku. Misalnya, kita dapat mengetahui chatgpt sesuatu seperti itu:
ChatgptNet menyediakan fitur ini menggunakan metode SetupAsync :
var conversationId await = chatGptClient . SetupAsync ( " Answer in rhyme " ) ;Jika kami menggunakan ConversgonicID yang sama saat menelepon AskAsync , maka pesan sistem akan secara otomatis dikirim bersama dengan setiap permintaan, sehingga asisten akan tahu bagaimana berperilaku.
Catatan Pesan sistem tidak diperhitungkan untuk nomor batas pesan.
Riwayat percakapan secara otomatis dihapus ketika waktu kedaluwarsa (ditentukan oleh properti MessageExpiration ) tercapai. Namun, jika perlu dimungkinkan untuk segera menghapus sejarah:
await chatGptClient . DeleteConversationAsync ( conversationId , preserveSetup : false ) ;Argumen PreserveSetup memungkinkan untuk memutuskan apakah Mantain juga pesan sistem yang telah ditetapkan dengan metode SetupAsync (default: false ).
Dengan panggilan fungsi, kami dapat menggambarkan fungsi dan memiliki model secara cerdas memilih untuk menghasilkan objek JSON yang berisi argumen untuk memanggil fungsi tersebut. Ini adalah cara baru untuk lebih andal menghubungkan kemampuan GPT dengan alat dan API eksternal.
ChatgptNet sepenuhnya mendukung panggilan fungsi dengan memberikan kelebihan metode AskAsync yang memungkinkan untuk menentukan definisi fungsi. Jika parameter ini dipasok, maka model akan memutuskan kapan tepat untuk menggunakan satu fungsi. Misalnya:
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 ) ;Kita dapat melewati sejumlah fungsi yang sewenang -wenang, masing -masing dengan nama, deskripsi dan skema JSON yang menggambarkan parameter fungsi, mengikuti referensi skema JSON. Di bawah kap, fungsi disuntikkan ke dalam pesan sistem dalam sintaks model telah dilatih. Ini berarti fungsi dihitung terhadap batas konteks model dan ditagih sebagai token input.
Objek respons yang dikembalikan dengan metode AskAsync menyediakan properti untuk memeriksa apakah model telah memilih panggilan fungsi:
if ( response . ContainsFunctionCalls ( ) )
{
Console . WriteLine ( " I have identified a function to call: " ) ;
var functionCall = response . GetFunctionCall ( ) ! ;
Console . WriteLine ( functionCall . Name ) ;
Console . WriteLine ( functionCall . Arguments ) ;
}Kode ini akan mencetak sesuatu seperti ini:
I have identified a function to call:
GetCurrentWeather
{
"location": "Taggia",
"format": "celsius"
}
Perhatikan bahwa API tidak akan benar -benar menjalankan panggilan fungsi apa pun. Terserah pengembang untuk menjalankan panggilan fungsi menggunakan output model.
Setelah eksekusi yang sebenarnya, kita perlu memanggil metode AddToolResponseAsync pada chatgptClient untuk menambahkan respons ke riwayat percakapan, seperti pesan standar, sehingga akan secara otomatis digunakan untuk penyelesaian obrolan:
// Calls the remote function API.
var functionResponse = await GetWeatherAsync ( functionCall . Arguments ) ;
await chatGptClient . AddToolResponseAsync ( conversationId , functionCall , functionResponse ) ;Model yang lebih baru seperti GPT-4-Turbo mendukung pendekatan fungsi yang lebih umum, panggilan alat . Saat Anda mengirim permintaan, Anda dapat menentukan daftar alat yang dapat dihubungi oleh model. Saat ini, hanya fungsi yang didukung, tetapi di masa depan rilis jenis alat lain yang akan tersedia.
Untuk menggunakan panggilan alat alih -alih panggilan fungsi langsung, Anda perlu mengatur properti ToolChoice dan Tools di objek ChatGPtToolParameters (bukan FunctionCall dan Fungsi , seperti pada contoh sebelumnya):
var toolParameters = new ChatGptToolParameters
{
ToolChoice = ChatGptToolChoices . Auto , // This is the default if functions are present.
Tools = functions . ToTools ( )
} ;Metode ekstensi tovools digunakan untuk mengonversi daftar chatgptFunction ke daftar alat.
Jika Anda menggunakan pendekatan baru ini, tentu saja Anda masih perlu memeriksa apakah model telah memilih panggilan alat, menggunakan pendekatan yang sama yang ditunjukkan sebelumnya. Kemudian, setelah pelaksanaan fungsi yang sebenarnya, Anda harus memanggil metode AddToolResponseAsync , tetapi dalam hal ini Anda perlu menentukan alat (bukan fungsi) yang merujuk responsnya:
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 ) ;Akhirnya, Anda perlu mengirim ulang pesan asli ke API penyelesaian obrolan, sehingga model dapat melanjutkan percakapan dengan mempertimbangkan respons panggilan fungsi. Lihatlah sampel yang memanggil fungsi untuk implementasi lengkap dari alur kerja ini.
Saat menggunakan layanan Azure OpenAi, kami secara otomatis mendapatkan pemfilteran konten secara gratis. Untuk detail tentang cara kerjanya, lihat dokumentasinya. Informasi ini dikembalikan untuk semua skenario saat menggunakan API versi 2023-06-01-preview atau lebih baru. ChatgptNet sepenuhnya mendukung model objek ini dengan menyediakan properti yang sesuai di kelas chatgptresponse dan chatgptChoice.
Embeddings memungkinkan untuk mengubah teks menjadi ruang vektor. Ini dapat berguna untuk membandingkan kesamaan dua kalimat, misalnya. ChatgptNet sepenuhnya mendukung fitur ini dengan menyediakan metode getembeddingAsync :
var response = await chatGptClient . GenerateEmbeddingAsync ( message ) ;
var embeddings = response . GetEmbedding ( ) ;Kode ini akan memberi Anda array float yang berisi semua embeddings untuk pesan yang ditentukan. Panjang array tergantung pada model yang digunakan:
| Model | Dimensi keluaran |
|---|---|
| Text-Embedding-DAGA-002 | 1536 |
| Text-Embedding-3-Small | 1536 |
| Text-Embedding-3-Large | 3072 |
Model yang lebih baru seperti Text-Embedding-3-Small dan Text-Embedding-3-Large memungkinkan pengembang untuk trade-off kinerja dan biaya menggunakan embeddings. Secara khusus, pengembang dapat memperpendek embeddings tanpa embedding kehilangan sifat-sifat representasi konsepnya.
Adapun chatgpt, pengaturan ini dapat dilakukan dengan berbagai cara:
builder . Services . AddChatGpt ( options =>
{
// ...
options . DefaultEmbeddingParameters = new EmbeddingParameters
{
Dimensions = 256
} ;
} ) ; "ChatGPT": {
"DefaultEmbeddingParameters": {
"Dimensions": 256
}
}
Kemudian, jika Anda ingin mengubah dimensi untuk permintaan tertentu, Anda dapat menentukan argumen embeddingparameters dalam doa getembeddingAsync :
var response = await chatGptClient . GenerateEmbeddingAsync ( request . Message , new EmbeddingParameters
{
Dimensions = 512
} ) ;
var embeddings = response . GetEmbedding ( ) ; // The length of the array is 512Jika Anda perlu menghitung kesamaan kosinus antara dua embedding, Anda dapat menggunakan metode embeddingutility.cosinesimilarity .
Dokumentasi teknis lengkap tersedia di sini.
Proyek ini terus berkembang. Kontribusi dipersilakan. Jangan ragu untuk mengajukan masalah dan menarik permintaan pada repo dan kami akan mengatasinya.
PERINGATAN Ingatlah untuk bekerja di cabang pengembangan , jangan gunakan cabang master secara langsung. Buat Permintaan Tarik Menargetkan Berkembang .