.NET 용 ChatGpt 통합 라이브러리, OpenAI 및 Azure OpenAI 서비스를 모두 지원합니다.
도서관은 Nuget에서 구입할 수 있습니다. 패키지 관리자 GUI 에서 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 모두에 포함 된 API도 지원합니다. 채팅 완료는 다른 모델로 임베딩을 수행 할 수 있습니다. 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 매개 변수를 설정할 수도 있습니다. 사용 가능한 매개 변수 목록과 그 의미에 대한 공식 문서를 확인하십시오.
AppSettings.json 파일의 ChatGpt 섹션을 사용하여 구성을 IconFiguration에서 자동으로 읽을 수 있습니다.
"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에 있고 모든 사용자가 종속성 주입을 통해 데이터베이스에 액세스 할 수있는 다른 API 키를 갖는 시나리오를 지원 해야하는 경우 :
builder . Services . AddChatGpt ( ( services , options ) =>
{
var accountService = services . GetRequiredService < IAccountService > ( ) ;
// Dynamically gets the API Key from the service.
var apiKey = " ... "
options . UseOpenAI ( apiKyey ) ;
} ) ;
보다 복잡한 시나리오에서는 코드와 IconFiguration을 사용하여 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를 사용하여 채팅 완료를 호출하고 API를 포함시킵니다. 사용자 정의 해야하는 경우 action <ihttpclientBuiler>를 인수로 받아들이는 addChatGpt 메소드의 오버로드를 사용할 수 있습니다. 예를 들어, HTTP 클라이언트에 탄력성을 추가하려면 (재 시도 정책이라고 가정하자) 폴리를 사용할 수 있습니다.
// 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 6.0 이상으로 제작 된 모든 .NET 응용 프로그램에서 사용할 수 있습니다. 예를 들어, 우리는 이러한 방식으로 최소한의 API를 만들 수 있습니다.
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
확인해야합니다.
구성을 사용하면 채팅 완료를 위해 기본 매개 변수를 설정할 수 있습니다. 그러나 ChatGptParameters 객체를 수락하는 AskAsync 또는 AskStreamAsync 오버로드를 사용하여 각 요청에 대해 매개 변수를 지정할 수도 있습니다.
var response = await chatGptClient . AskAsync ( conversationId , message , new ChatGptParameters
{
MaxTokens = 150 ,
Temperature = 0.7
} ) ;
모든 매개 변수를 지정할 필요는 없으며 재정의하려는 매개 변수 만 지정할 필요가 없습니다. 다른 하나는 기본 구성에서 가져옵니다.
Chatgpt는 비 결정적으로 알려져 있습니다. 이는 동일한 입력이 다른 출력을 생성 할 수 있음을 의미합니다. 이 동작을 제어하기 위해 온도 및 TOPP 매개 변수를 사용할 수 있습니다. 예를 들어, 온도를 0에 가까운 값으로 설정하면 모델을 더 결정적으로 만들고 1에 가까운 값으로 설정하면 모델을보다 창의적으로 만들 수 있습니다. 그러나 동일한 입력에 대해 동일한 출력을 얻는 데 항상 충분하지는 않습니다. 이 문제를 해결하기 위해 OpenAI는 시드 매개 변수를 도입했습니다. 지정된 경우, 모델은 동일한 시드 및 매개 변수로 반복 된 요청이 동일한 결과를 반환해야합니다. 그럼에도 불구하고,이 경우 결정론은 보장되지 않으며, 백엔드의 변경 사항을 모니터링하기 위해 SystemFingerPrint 응답 매개 변수를 참조해야합니다. 이 값의 변화는 백엔드 구성이 변경되었음을 의미하며 이는 결정론에 영향을 줄 수 있습니다.
항상 그렇듯이 시드 속성은 기본 구성 또는 chatgptParameters를 수용하는 AskAsync 또는 AskAsync 또는 AskStreamAsync 오버로드에 지정할 수 있습니다.
참고 종자 및 SystemFingerPrint는 GPT-4-1106- 프리뷰 와 같은 최신 모델에서만 지원됩니다.
JSON 형식의 응답을 포기하려면 ResponseFormat 매개 변수를 사용할 수 있습니다.
var response = await chatGptClient . AskAsync ( conversationId , message , new ChatGptParameters
{
ResponseFormat = ChatGptResponseFormat . Json ,
} ) ;
이런 식으로 응답은 항상 유효한 JSON입니다. 또한 시스템 또는 사용자 메시지를 통해 JSON을 생성하도록 모델에 지시해야합니다. 이 작업을 수행하지 않으면 모델이 오류를 반환합니다.
항상 그렇듯이 응답 성분은 기본 구성 또는 chatgptParameters를 수용하는 AskAsync 또는 AskAsync 또는 AskStreamAsync 오버로드에 지정할 수 있습니다.
참고 ResponseFormat은 GPT-4-1106- 프리뷰 와 같은 최신 모델에서만 지원됩니다.
AskAsync 및 AskStreamAsync (아래 참조) 메소드는 Confermited 매개 변수가 필요한 오버로드를 제공합니다. 빈 값을 통과하면 임의의 값이 생성되어 반환됩니다. AskAsync 또는 AskStreamAsync 의 후속 호출 에서이 값을 전달할 수 있으므로 라이브러리가 현재 대화의 이전 메시지를 자동으로 검색하고 ( Messagelimit 및 MessageExpiration 설정에 따라) 채팅 완료 API로 보냅니다.
이것은 모든 채팅 상호 작용의 기본 동작입니다. 대화 기록에서 특정 상호 작용을 추방하려면 AddToconversationHistory 인수를 False 로 설정할 수 있습니다.
var response = await chatGptClient . AskAsync ( conversationId , message , addToConversationHistory : false ) ;
이러한 방식으로 메시지는 채팅 완료 API로 전송되지만 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는 응답 스트리밍을 지원합니다. 이 기능을 사용하면 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 ) ;
}
참고 컨텐츠 필터링 시스템에 의해 응답이 필터링되면 Foreach 의 GetContent 메소드는 NULL 문자열을 반환합니다. 따라서 실제 콘텐츠에 액세스하기 전에 항상
response.IsContentFiltered
확인해야합니다.
응답 스트리밍은 iasyncenumerable을 반환하여 작동하므로 웹 API 프로젝트에서도 사용할 수 있습니다.
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 ( ) ;
참고 컨텐츠 필터링 시스템에 의해 응답이 필터링되면 Foreach 의 Asdeltas 메소드는 NULLS 문자열을 반환합니다.
라이브러리는 Blazor WebAssembly 응용 프로그램과도 100% 호환됩니다.
다양한 구현에 대한 자세한 내용은 샘플 폴더를 확인하십시오.
Chatgpt는 조수의 행동 방식에 영향을 미치기 위해 시스템 역할을 가진 메시지를 지원합니다. 예를 들어, 우리는 다음과 같은 것을 chatgpt에 말할 수 있습니다.
ChatGptNet은 SetupAsync 메소드를 사용 하여이 기능을 제공합니다.
var conversationId await = chatGptClient . SetupAsync ( " Answer in rhyme " ) ;
AskAsync를 호출 할 때 동일한 대화를 사용하는 경우 시스템 메시지는 모든 요청과 함께 자동으로 전송되므로 조수가 행동하는 방법을 알 수 있습니다.
참고 시스템 메시지는 메시지 제한 번호를 계산하지 않습니다.
만료 시간 ( MessageExpiration 속성에 의해 지정 됨)에 도달하면 대화 기록이 자동으로 삭제됩니다. 그러나 필요한 경우 즉시 역사를 지우는 것이 가능합니다.
await chatGptClient . DeleteConversationAsync ( conversationId , preserveSetup : false ) ;
PreservesEtup 인수는 Mantain이 SetupAsync 메소드 (기본값 : False )로 설정된 시스템 메시지를 결정할 수 있습니다.
기능 호출을 통해 기능을 설명하고 모델이 해당 함수를 호출하기 위해 인수가 포함 된 JSON 객체를 지능적으로 선택하도록 할 수 있습니다. 이것은 GPT의 기능을 외부 도구 및 API와보다 안정적으로 연결하는 새로운 방법입니다.
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"
}
API는 실제로 기능 호출을 실행하지 않습니다. 모델 출력을 사용하여 기능 호출을 실행하는 것은 개발자에게 달려 있습니다.
실제 실행 후에는 ChatGptClient 의 addToolReponseAsync 메소드를 호출하여 표준 메시지와 마찬가지로 대화 기록에 응답을 추가하여 채팅 완료에 자동으로 사용되도록해야합니다.
// Calls the remote function API.
var functionResponse = await GetWeatherAsync ( functionCall . Arguments ) ;
await chatGptClient . AddToolResponseAsync ( conversationId , functionCall , functionResponse ) ;
GPT-4-Turbo 와 같은 최신 모델은 기능에 대한보다 일반적인 접근 방식 인 도구 호출을 지원합니다. 요청을 보낼 때 모델이 호출 할 수있는 도구 목록을 지정할 수 있습니다. 현재 기능 만 지원되지만 향후 릴리스에서는 다른 유형의 도구를 사용할 수 있습니다.
직접 기능 호출 대신 도구 호출을 사용하려면 ChatGptToolParameters 객체 (이전 예제에서와 같이 FunctionCall 및 Function 대신)에서 ToolChoice 및 Tools 속성을 설정해야합니다.
var toolParameters = new ChatGptToolParameters
{
ToolChoice = ChatGptToolChoices . Auto , // This is the default if functions are present.
Tools = functions . ToTools ( )
} ;
Totools 확장 방법은 ChatGptFunction 목록을 도구 목록으로 변환하는 데 사용됩니다.
이 새로운 접근 방식을 사용하는 경우, 물론 모델이 이전에 표시된 동일한 접근 방식을 사용하여 도구 통화를 선택했는지 확인해야합니다. 그런 다음 함수의 실제 실행 후 addToolReponseAsync 메소드를 호출해야하지만이 경우 응답이 지칭하는 도구 (함수가 아닌)를 지정해야합니다.
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 ( ) ;
이 코드는 지정된 메시지에 대한 모든 임베딩이 포함 된 플로트 어레이를 제공합니다. 배열의 길이는 사용 된 모델에 따라 다릅니다.
모델 | 출력 차원 |
---|---|
텍스트-엠 베딩-아다 -002 | 1536 |
텍스트 엠 베딩 -3 스몰 | 1536 |
텍스트-엠 베딩 -3- 레이지 | 3072 |
Text-embedding-3 Small 및 Text-embedding-3-Large 와 같은 최신 모델을 통해 개발자는 성능과 임베딩 사용 비용을 트레이드 오프 할 수 있습니다. 구체적으로, 개발자는 개념 표현 속성을 잃지 않고 임베딩을 단축 할 수 있습니다.
ChatGpt의 경우이 설정은 다양한 방식으로 수행 할 수 있습니다.
builder . Services . AddChatGpt ( options =>
{
// ...
options . DefaultEmbeddingParameters = new EmbeddingParameters
{
Dimensions = 256
} ;
} ) ;
"ChatGPT": {
"DefaultEmbeddingParameters": {
"Dimensions": 256
}
}
그런 다음 특정 요청에 대한 차원을 변경하려면 GetEmbeddingAsync 호출에 포함 된 파라 메이트터 인수를 지정할 수 있습니다.
var response = await chatGptClient . GenerateEmbeddingAsync ( request . Message , new EmbeddingParameters
{
Dimensions = 512
} ) ;
var embeddings = response . GetEmbedding ( ) ; // The length of the array is 512
두 임베딩 사이의 코사인 유사성을 계산 해야하는 경우, 임베딩 혜택을 사용할 수 있습니다.
전체 기술 문서는 여기에서 제공됩니다.
프로젝트는 끊임없이 발전하고 있습니다. 기부금을 환영합니다. 레포에 문제를 제출하고 요청을 가져 오면 가능한 한 해결하겠습니다.
경고 개발 지점에서 작업하고 마스터 브랜치를 직접 사용하지 마십시오. PULL 요청을 생성하여 타겟팅 개발 .