중요합니다
이 기능은 실험 단계에 있습니다. 이 단계의 기능은 현재 개발 중이며 미리 보기 또는 릴리스 후보 단계로 넘어가기 전에 크게 변경될 수 있습니다.
개요
상황별 함수 선택은 에이전트가 현재 대화 컨텍스트에 따라 가장 관련성이 큰 함수만 동적으로 선택하고 보급할 수 있도록 하는 의미 체계 커널 에이전트 프레임워크의 고급 기능입니다. 이 기능은 사용 가능한 모든 함수를 AI 모델에 노출하는 대신 RAG(Retrieval-Augmented 생성)을 사용하여 사용자의 요청과 가장 관련된 함수만 필터링하고 표시합니다.
이 방법은 AI 모델이 적절한 함수를 선택하는 데 어려움을 겪을 수 있는 많은 수의 사용 가능한 함수를 처리할 때 함수 선택 과제를 해결하여 혼동과 최적이 아닌 성능으로 이어질 수 있습니다.
경고
ContextualFunctionProvider를 사용할 때 에이전트의 UseImmutableKernel 설정을 true로 설정해야 합니다. 이 기능은 에이전트를 호출할 때 커널을 복제할 필요가 있기 때문입니다.
UseImmutableKernel 설정을 true로 변경하면 플러그인 등을 통해 에이전트 호출 중에 수행된 커널 데이터 수정이 호출이 완료된 후에는 유지되지 않음을 의미합니다.
상황에 맞는 함수 선택 작동 방식
에이전트가 상황별 함수 선택으로 구성된 경우 벡터 저장소 및 포함 생성기를 활용하여 현재 대화 컨텍스트(이전 메시지 및 사용자 입력 포함)와 사용 가능한 함수의 설명 및 이름을 의미 체계적으로 일치합니다. 지정된 제한까지 가장 관련성이 큰 함수는 호출을 위해 AI 모델에 보급됩니다.
이 메커니즘은 광범위한 플러그 인 또는 도구 집합에 액세스할 수 있는 에이전트에 특히 유용하므로 각 단계에서 상황에 맞는 적절한 작업만 고려됩니다.
사용 예제
다음 예제에서는 상황에 맞는 함수 선택을 사용하도록 에이전트를 구성하는 방법을 보여 줍니다. 에이전트는 고객 검토를 요약하도록 설정되지만 각 호출에 대해 가장 관련성이 큰 함수만 AI 모델에 보급됩니다. 이 메서드는 GetAvailableFunctions 컨텍스트 선택의 이점을 강조하기 위해 관련 함수와 관련이 없는 함수를 모두 의도적으로 포함합니다.
// Create an embedding generator for function vectorization
var embeddingGenerator = new AzureOpenAIClient(new Uri("<endpoint>"), new ApiKeyCredential("<api-key>"))
.GetEmbeddingClient("<deployment-name>")
.AsIEmbeddingGenerator();
// Create kernel and register AzureOpenAI chat completion service
var kernel = Kernel.CreateBuilder()
.AddAzureOpenAIChatCompletion("<deployment-name>", "<endpoint>", "<api-key>");
.Build();
// Create a chat completion agent
ChatCompletionAgent agent = new()
{
Name = "ReviewGuru",
Instructions = "You are a friendly assistant that summarizes key points and sentiments from customer reviews. For each response, list available functions.",
Kernel = kernel,
Arguments = new(new PromptExecutionSettings { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto(options: new FunctionChoiceBehaviorOptions { RetainArgumentTypes = true }) }),
// This setting must be set to true when using the ContextualFunctionProvider
UseImmutableKernel = true
};
// Create the agent thread and register the contextual function provider
ChatHistoryAgentThread agentThread = new();
agentThread.AIContextProviders.Add(
new ContextualFunctionProvider(
vectorStore: new InMemoryVectorStore(new InMemoryVectorStoreOptions() { EmbeddingGenerator = embeddingGenerator }),
vectorDimensions: 1536,
functions: AvailableFunctions(),
maxNumberOfFunctions: 3, // Only the top 3 relevant functions are advertised
loggerFactory: LoggerFactory
)
);
// Invoke the agent
ChatMessageContent message = await agent.InvokeAsync("Get and summarize customer review.", agentThread).FirstAsync();
Console.WriteLine(message.Content);
// Output
/*
Customer Reviews:
-----------------
1. John D. - ★★★★★
Comment: Great product and fast shipping!
Date: 2023-10-01
Summary:
--------
The reviews indicate high customer satisfaction,
highlighting product quality and shipping speed.
Available functions:
--------------------
- Tools-GetCustomerReviews
- Tools-Summarize
- Tools-CollectSentiments
*/
IReadOnlyList<AIFunction> GetAvailableFunctions()
{
// Only a few functions are directly related to the prompt; the majority are unrelated to demonstrate the benefits of contextual filtering.
return new List<AIFunction>
{
// Relevant functions
AIFunctionFactory.Create(() => "[ { 'reviewer': 'John D.', 'date': '2023-10-01', 'rating': 5, 'comment': 'Great product and fast shipping!' } ]", "GetCustomerReviews"),
AIFunctionFactory.Create((string text) => "Summary generated based on input data: key points include customer satisfaction.", "Summarize"),
AIFunctionFactory.Create((string text) => "The collected sentiment is mostly positive.", "CollectSentiments"),
// Irrelevant functions
AIFunctionFactory.Create(() => "Current weather is sunny.", "GetWeather"),
AIFunctionFactory.Create(() => "Email sent.", "SendEmail"),
AIFunctionFactory.Create(() => "The current stock price is $123.45.", "GetStockPrice"),
AIFunctionFactory.Create(() => "The time is 12:00 PM.", "GetCurrentTime")
};
}
벡터 저장소
공급자는 주로 단순성을 제공하는 메모리 내 벡터 저장소를 사용하도록 설계되었습니다. 그러나 다른 유형의 벡터 저장소를 사용하는 경우 데이터 동기화 및 일관성 처리에 대한 책임은 호스팅 애플리케이션에 있습니다.
함수 목록이 변경되거나 함수 포함 원본이 수정될 때마다 동기화가 필요합니다. 예를 들어 에이전트에 처음에 클라우드 벡터 저장소에 벡터화 및 저장되는 3개의 함수(f1, f2, f3)가 있고 나중에 f3이 에이전트의 함수 목록에서 제거되는 경우 에이전트에 있는 현재 함수(f1 및 f2)만 반영하도록 벡터 저장소를 업데이트해야 합니다. 벡터 저장소를 업데이트하지 못하면 관련 없는 함수가 결과로 반환될 수 있습니다. 마찬가지로 함수 이름, 설명 등과 같은 벡터화에 사용되는 데이터가 변경되면 업데이트된 정보에 따라 벡터 저장소를 제거하고 새 포함으로 다시 채워야 합니다.
외부 또는 분산 벡터 저장소에서 데이터 동기화를 관리하는 것은 복잡하고 오류가 발생하기 쉬울 수 있습니다. 특히 다른 서비스 또는 인스턴스가 독립적으로 작동하고 동일한 데이터에 대한 일관된 액세스가 필요할 수 있는 분산 애플리케이션에서 그렇습니다. 반면, 메모리 내 저장소를 사용하면 이 프로세스가 간소화됩니다. 함수 목록 또는 벡터화 원본이 변경되면 메모리 내 저장소를 새 함수 집합 및 해당 포함으로 쉽게 다시 만들 수 있으므로 최소한의 노력으로 일관성을 보장할 수 있습니다.
함수 지정
컨텍스트 함수 공급자는 현재 컨텍스트에 따라 가장 관련성이 큰 함수를 선택할 수 있는 함수 목록과 함께 제공되어야 합니다. 이 작업은 생성자의 매개 변수 functions 에 함수 ContextualFunctionProvider 목록을 제공하여 수행됩니다.
함수 외에도 매개 변수를 사용하여 maxNumberOfFunctions 반환할 관련 함수의 최대 수를 지정해야 합니다.
이 매개 변수는 현재 컨텍스트에 가장 적합한 함수를 선택할 때 공급자가 고려할 함수 수를 결정합니다.
지정된 숫자는 정확하지 않습니다. 오히려 특정 시나리오에 따라 상한으로 사용됩니다.
이 값을 너무 낮게 설정하면 에이전트가 시나리오에 필요한 모든 함수에 액세스하지 못하게 되어 시나리오 오류가 발생할 수 있습니다. 반대로 너무 높게 설정하면 너무 많은 함수로 인해 에이전트가 과부하가 발생하여 환각, 과도한 입력 토큰 사용 및 최적이 아닐 수 있습니다.
// Create the provider with a list of functions and a maximum number of functions to return
ContextualFunctionProvider provider = new (
vectorStore: new InMemoryVectorStore(new InMemoryVectorStoreOptions { EmbeddingGenerator = embeddingGenerator }),
vectorDimensions: 1536,
functions: [AIFunctionFactory.Create((string text) => $"Echo: {text}", "Echo"), <other functions>]
maxNumberOfFunctions: 3 // Only the top 3 relevant functions are advertised
);
상황별 함수 공급자 옵션
공급자가 작동하는 방식의 ContextualFunctionProviderOptions 다양한 측면을 사용자 지정할 수 있는 클래스를 사용하여 공급자를 구성할 수 있습니다.
// Create options for the contextual function provider
ContextualFunctionProviderOptions options = new ()
{
...
};
// Create the provider with options
ContextualFunctionProvider provider = new (
...
options: options // Pass the options
);
컨텍스트 크기
컨텍스트 크기는 새 호출에 대한 컨텍스트를 구성할 때 포함된 이전 에이전트 호출의 최근 메시지 수를 결정합니다. 공급자는 이전 호출에서 지정된 번호까지 모든 메시지를 수집하고 컨텍스트를 형성하기 위해 새 메시지에 추가합니다.
최근 메시지를 새 메시지와 함께 사용하는 것은 대화의 이전 단계에서 정보를 필요로 하는 작업에 특히 유용합니다. 예를 들어 에이전트가 한 호출에서 리소스를 프로비전하고 다음에 배포하는 경우 배포 단계에서 프로비전 단계의 세부 정보에 액세스하여 배포에 대한 프로비전된 리소스 정보를 가져올 수 있습니다.
기본적으로 최근 메시지 수에 대한 기본값은 2이며, 이는 필요한 경우 NumberOfRecentMessagesInContext 속성에서 ContextualFunctionProviderOptions를 지정하여 구성할 수 있습니다.
ContextualFunctionProviderOptions options = new ()
{
NumberOfRecentMessagesInContext = 1 // Only the last message will be included in the context
};
컨텍스트 내재화 원본 값
컨텍스트 함수 선택을 수행하려면 공급자가 현재 컨텍스트를 벡터화하여 벡터 저장소의 사용 가능한 함수와 비교할 수 있어야 합니다. 기본적으로 공급자는 비어있지 않은 모든 최근 메시지와 새 메시지를 단일 문자열로 연결하여 이 컨텍스트 포함을 만듭니다. 그러면 벡터화되고 관련 함수를 검색하는 데 사용됩니다.
일부 시나리오에서는 다음 동작을 사용자 지정할 수 있습니다.
- 특정 메시지 유형(예: 사용자 메시지만)에 집중
- 컨텍스트에서 특정 정보 제외
- 벡터화 전에 컨텍스트 전처리 또는 요약(예: 프롬프트 다시 쓰기 적용)
이렇게 하려면 사용자 지정 대리자를 에 할당할 ContextEmbeddingValueProvider수 있습니다. 이 대리자는 최근 및 새 메시지를 수신하고 컨텍스트 포함의 원본으로 사용할 문자열 값을 반환합니다.
ContextualFunctionProviderOptions options = new()
{
ContextEmbeddingValueProvider = async (recentMessages, newMessages, cancellationToken) =>
{
// Example: Only include user messages in the embedding
var allUserMessages = recentMessages.Concat(newMessages)
.Where(m => m.Role == "user")
.Select(m => m.Content)
.Where(content => !string.IsNullOrWhiteSpace(content));
return string.Join("\n", allUserMessages);
}
};
컨텍스트 포함을 사용자 지정하면 특히 복잡하거나 특수화된 에이전트 시나리오에서 함수 선택의 관련성을 향상시킬 수 있습니다.
함수 내장 원본 값
공급자는 컨텍스트와 비교하고 가장 관련성이 큰 함수를 선택하기 위해 사용 가능한 각 함수를 벡터화해야 합니다. 기본적으로 공급자는 함수의 이름과 설명을 단일 문자열에 연결하여 함수 포함을 만든 다음, 벡터 저장소에 벡터화되고 저장됩니다.
EmbeddingValueProvider의 ContextualFunctionProviderOptions 속성을 사용하여 이 동작을 사용자 지정할 수 있습니다. 이 속성을 사용하면 함수 및 취소 토큰을 수신하는 콜백을 지정하고 함수 포함의 원본으로 사용할 문자열을 반환할 수 있습니다. 이 기능은 다음을 수행하려는 경우에 유용합니다.
- 포함 원본에 함수 메타데이터 추가
- 벡터화 전에 함수 정보를 전처리, 필터링 또는 다시 포맷
ContextualFunctionProviderOptions options = new()
{
EmbeddingValueProvider = async (function, cancellationToken) =>
{
// Example: Use only the function name for embedding
return function.Name;
}
};
원본 값을 포함하는 함수를 사용자 지정하면 함수 선택 정확도가 향상될 수 있습니다. 특히 함수에 다양한 컨텍스트 관련 메타데이터가 있거나 각 함수의 특정 측면에 검색을 집중하려는 경우 더욱 그렇습니다.
다음 단계
곧 출시
자세한 내용은 곧 제공될 예정입니다.
곧 출시
자세한 내용은 곧 제공될 예정입니다.