Dlaczego warto używać funkcji wywołującej za pomocą wyszukiwania tekstu jądra semantycznego?
W poprzednich przykładach opartych na generacji rozszerzonej (RAG, Retrieval-Augmented Generation) użyto zapytania użytkownika jako zapytania wyszukiwania podczas pobierania odpowiednich informacji. Pytanie użytkownika może być długie i może obejmować wiele tematów lub może istnieć wiele różnych implementacji wyszukiwania, które zapewniają wyspecjalizowane wyniki. W przypadku jednego z tych scenariuszy może być przydatne umożliwienie modelowi sztucznej inteligencji wyodrębniania zapytania wyszukiwania lub zapytań od użytkownika i używania wywołania funkcji w celu pobrania odpowiednich potrzebnych informacji.
Napiwek
Aby uruchomić przykłady wyświetlane na tej stronie, przejdź do pozycji GettingStartedWithTextSearch/Step3_Search_With_FunctionCalling.cs.
Wywoływanie funkcji za pomocą wyszukiwania tekstu Bing
Napiwek
Przykłady w tej sekcji używają filtru IFunctionInvocationFilter
do rejestrowania funkcji wywoływanej przez model i parametrów, które wysyła.
Interesujące jest sprawdzenie, co model używa jako zapytania wyszukiwania podczas wywoływania elementu SearchPlugin
.
Oto implementacja filtru IFunctionInvocationFilter
.
private sealed class FunctionInvocationFilter(TextWriter output) : IFunctionInvocationFilter
{
public async Task OnFunctionInvocationAsync(FunctionInvocationContext context, Func<FunctionInvocationContext, Task> next)
{
if (context.Function.PluginName == "SearchPlugin")
{
output.WriteLine($"{context.Function.Name}:{JsonSerializer.Serialize(context.Arguments)}\n");
}
await next(context);
}
}
W poniższym przykładzie przedstawiono sposób SearchPlugin
tworzenia przy użyciu wyszukiwania w Internecie Bing.
Ta wtyczka zostanie anonsowana do modelu sztucznej inteligencji do użycia z automatycznym wywołaniem funkcji przy użyciu FunctionChoiceBehavior
w ustawieniach wykonywania monitu.
Po uruchomieniu tego przykładu sprawdź dane wyjściowe konsoli, aby zobaczyć, jaki model jest używany jako zapytanie wyszukiwania.
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using Microsoft.SemanticKernel.Data;
using Microsoft.SemanticKernel.Plugins.Web.Bing;
// Create a kernel with OpenAI chat completion
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddOpenAIChatCompletion(
modelId: "gpt-4o",
apiKey: "<Your OpenAI API Key>");
kernelBuilder.Services.AddSingleton<ITestOutputHelper>(output);
kernelBuilder.Services.AddSingleton<IFunctionInvocationFilter, FunctionInvocationFilter>();
Kernel kernel = kernelBuilder.Build();
// Create a search service with Bing search
var textSearch = new BingTextSearch(apiKey: "<Your Bing API Key>");
// Build a text search plugin with Bing search and add to the kernel
var searchPlugin = textSearch.CreateWithSearch("SearchPlugin");
kernel.Plugins.Add(searchPlugin);
// Invoke prompt and use text search plugin to provide grounding information
OpenAIPromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };
KernelArguments arguments = new(settings);
Console.WriteLine(await kernel.InvokePromptAsync("What is the Semantic Kernel?", arguments));
Wywoływanie funkcji za pomocą wyszukiwania tekstu Bing i cytatów
Poniższy przykład zawiera wymagane zmiany w celu uwzględnienia cytatów:
- Użyj
CreateWithGetTextSearchResults
polecenia , aby utworzyć elementSearchPlugin
, będzie zawierać link do oryginalnego źródła informacji. - Zmodyfikuj monit, aby poinstruować model, aby uwzględnił cytaty w odpowiedzi.
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using Microsoft.SemanticKernel.Data;
using Microsoft.SemanticKernel.Plugins.Web.Bing;
// Create a kernel with OpenAI chat completion
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddOpenAIChatCompletion(
modelId: "gpt-4o",
apiKey: "<Your OpenAI API Key>");
kernelBuilder.Services.AddSingleton<ITestOutputHelper>(output);
kernelBuilder.Services.AddSingleton<IFunctionInvocationFilter, FunctionInvocationFilter>();
Kernel kernel = kernelBuilder.Build();
// Create a search service with Bing search
var textSearch = new BingTextSearch(apiKey: "<Your Bing API Key>");
// Build a text search plugin with Bing search and add to the kernel
var searchPlugin = textSearch.CreateWithGetTextSearchResults("SearchPlugin");
kernel.Plugins.Add(searchPlugin);
// Invoke prompt and use text search plugin to provide grounding information
OpenAIPromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };
KernelArguments arguments = new(settings);
Console.WriteLine(await kernel.InvokePromptAsync("What is the Semantic Kernel? Include citations to the relevant information where it is referenced in the response.", arguments));
Wywoływanie funkcji za pomocą wyszukiwania i filtrowania tekstu Bing
Ostatni przykład w tej sekcji pokazuje, jak używać filtru z wywoływaniem funkcji.
W przypadku tego przykładu zostaną uwzględnione tylko wyniki wyszukiwania z witryny Blogi dla deweloperów firmy Microsoft.
Zostanie utworzone wystąpienie TextSearchFilter
klasy , a klauzula równości zostanie dodana, aby dopasować ją do devblogs.microsoft.com
witryny.
Filtr Ths będzie używany, gdy funkcja jest wywoływana w odpowiedzi na żądanie wywołujące funkcję z modelu.
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.OpenAI;
using Microsoft.SemanticKernel.Data;
using Microsoft.SemanticKernel.Plugins.Web.Bing;
// Create a kernel with OpenAI chat completion
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddOpenAIChatCompletion(
modelId: "gpt-4o",
apiKey: "<Your OpenAI API Key>");
kernelBuilder.Services.AddSingleton<ITestOutputHelper>(output);
kernelBuilder.Services.AddSingleton<IFunctionInvocationFilter, FunctionInvocationFilter>();
Kernel kernel = kernelBuilder.Build();
// Create a search service with Bing search
var textSearch = new BingTextSearch(apiKey: "<Your Bing API Key>");
// Build a text search plugin with Bing search and add to the kernel
var filter = new TextSearchFilter().Equality("site", "devblogs.microsoft.com");
var searchOptions = new TextSearchOptions() { Filter = filter };
var searchPlugin = KernelPluginFactory.CreateFromFunctions(
"SearchPlugin", "Search Microsoft Developer Blogs site only",
[textSearch.CreateGetTextSearchResults(searchOptions: searchOptions)]);
kernel.Plugins.Add(searchPlugin);
// Invoke prompt and use text search plugin to provide grounding information
OpenAIPromptExecutionSettings settings = new() { FunctionChoiceBehavior = FunctionChoiceBehavior.Auto() };
KernelArguments arguments = new(settings);
Console.WriteLine(await kernel.InvokePromptAsync("What is the Semantic Kernel? Include citations to the relevant information where it is referenced in the response.", arguments));
Wkrótce
Wkrótce pojawi się więcej.
Wkrótce
Wkrótce pojawi się więcej.