Varför ska du använda funktionsanrop med semantisk kerneltextsökning?
I tidigare RAG-baserade exempel (Retrieval-Augmented Generation) har användarens fråga använts som sökfråga när relevant information hämtas. Användaren frågar kan vara lång och kan sträcka sig över flera ämnen eller det kan finnas flera olika sökimplementeringar som ger specialiserade resultat. För något av dessa scenarier kan det vara användbart att låta AI-modellen extrahera sökfrågan eller frågorna från användarens fråga och använda funktionsanrop för att hämta relevant information som behövs.
Dricks
Om du vill köra exemplen som visas på den här sidan går du till GettingStartedWithTextSearch/Step3_Search_With_FunctionCalling.cs.
Funktionsanrop med textsökning i Bing
Dricks
Exemplen i det här avsnittet använder ett IFunctionInvocationFilter
filter för att logga funktionen som modellen anropar och vilka parametrar den skickar.
Det är intressant att se vad modellen använder som en sökfråga när du SearchPlugin
anropar .
Här är filterimplementeringen 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);
}
}
Exemplet nedan skapar en SearchPlugin
webbsökning i Bing.
Det här plugin-programmet kommer att annonseras till AI-modellen för användning med automatiska funktionsanrop med hjälp av FunctionChoiceBehavior
inställningarna för körning av fråga.
När du kör det här exemplet kontrollerar du konsolens utdata för att se vilken modell som används som sökfråga.
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));
Funktionsanrop med textsökning i Bing och citat
Exemplet nedan innehåller de ändringar som krävs för att inkludera citat:
- Använd
CreateWithGetTextSearchResults
för att skapaSearchPlugin
, som innehåller länken till den ursprungliga källan till informationen. - Ändra uppmaningen för att instruera modellen att inkludera citat i svaret.
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));
Funktionsanrop med textsökning och filtrering i Bing
Det sista exemplet i det här avsnittet visar hur du använder ett filter med funktionsanrop.
För det här exemplet inkluderas endast sökresultat från webbplatsen Microsoft Developer Blogs.
En instans av TextSearchFilter
skapas och en likhetsklausul läggs till för att matcha devblogs.microsoft.com
webbplatsen.
Filtret Ths används när funktionen anropas som svar på en funktion som anropar begäran från modellen.
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));
Kommer snart
Fler kommer snart.
Kommer snart
Fler kommer snart.