次の方法で共有


セマンティック カーネル テキスト検索とは

警告

セマンティック カーネル テキスト検索機能はプレビュー段階であり、破壊的変更を必要とする機能強化は、リリース前の限られた状況で引き続き発生する可能性があります。

セマンティック カーネルには、開発者が大規模言語モデル (LLM) を呼び出すときに検索を統合できる機能が用意されています。 LLM は固定データ セットでトレーニングされ、ユーザーの質問に正確に応答するために追加のデータへのアクセスが必要になる場合があるため、これは重要です。

LLM を要求するときに追加のコンテキストを提供するプロセスは、取得拡張生成 (RAG) と呼ばれます。 RAG には通常、現在のユーザーの質問に関連する追加のデータを取得し、このデータを使用して LLM に送信されるプロンプトを拡張することが含まれます。 LLM は、そのトレーニングと追加のコンテキストを使用して、より正確な応答を提供できます。

これが重要になる簡単な例は、ユーザーの質問が LLM のトレーニング データ セットに含まれていない最新の情報に関連している場合です。 適切なテキスト検索を実行し、ユーザーの質問に結果を含めることで、より正確な応答が得られます。

セマンティック カーネルには、開発者が Web 検索またはベクター データベースを使用して検索を実行し、アプリケーションに RAG を簡単に追加できる一連のテキスト検索機能が用意されています。

次のサンプル コードでは、Bingまたは Google を使用して Web 検索操作を実行できます。

ヒント

このページに示されているサンプルを実行するには、 GettingStartedWithTextSearch/Step1_Web_Search.cs に移動します。

テキスト検索インスタンスを作成する

各サンプルでは、テキスト検索インスタンスを作成し、検索操作を実行して、指定されたクエリの結果を取得します。 検索結果には、その内容を説明する Web ページからのテキストのスニペットが含まれます。 これにより、限られたコンテキスト (Web ページのコンテンツのサブセット) のみが提供され、情報のソースへのリンクは提供されません。 以降のサンプルでは、これらの制限に対処する方法を示します。

ヒント

次のサンプル コードでは、セマンティック カーネル OpenAI コネクタと Web プラグインを使用し、次のコマンドを使用してインストールします。

dotnet add package Microsoft.SemanticKernel
dotnet add package Microsoft.SemanticKernel.Plugins.Web

using Microsoft.SemanticKernel.Data;
using Microsoft.SemanticKernel.Plugins.Web.Bing;

// Create an ITextSearch instance using Bing search
var textSearch = new BingTextSearch(apiKey: "<Your Bing API Key>");

var query = "What is the Semantic Kernel?";

// Search and return results
KernelSearchResults<string> searchResults = await textSearch.SearchAsync(query, new() { Top = 4 });
await foreach (string result in searchResults.Results)
{
    Console.WriteLine(result);
}
using Microsoft.SemanticKernel.Data;
using Microsoft.SemanticKernel.Plugins.Web.Google;

// Create an ITextSearch instance using Google search
var textSearch = new GoogleTextSearch(
    searchEngineId: "<Your Google Search Engine Id>",
    apiKey: "<Your Google API Key>");

var query = "What is the Semantic Kernel?";

// Search and return results
KernelSearchResults<string> searchResults = await textSearch.SearchAsync(query, new() { Top = 4 });
await foreach (string result in searchResults.Results)
{
    Console.WriteLine(result);
}

ヒント

取得できる検索結果の種類の詳細については、 テキスト検索プラグインに関するドキュメントを参照してください。

テキスト検索結果を使用してプロンプトを拡張する

次の手順では、Web テキスト検索からプラグインを作成し、プラグインを呼び出して検索結果をプロンプトに追加します。

次のサンプル コードは、これを実現する方法を示しています。

  1. OpenAI サービスが登録されている Kernel を作成します。 これは、プロンプトを使用して gpt-4o モデルを呼び出すために使用されます。
  2. テキスト検索インスタンスを作成します。
  3. テキスト検索インスタンスから検索プラグインを作成します。
  4. クエリを使用して検索プラグインを呼び出し、元のクエリと共にプロンプトに検索結果を含めるプロンプト テンプレートを作成します。
  5. プロンプトを呼び出し、応答を表示します。

このモデルは、Web 検索から入手できる最新の情報に根付いた応答を提供します。

Bing Web Search

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>");
Kernel kernel = kernelBuilder.Build();

// Create a text search using 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
var query = "What is the Semantic Kernel?";
var prompt = "{{SearchPlugin.Search $query}}. {{$query}}";
KernelArguments arguments = new() { { "query", query } };
Console.WriteLine(await kernel.InvokePromptAsync(prompt, arguments));

Google Web 検索

using Microsoft.SemanticKernel.Data;
using Microsoft.SemanticKernel.Plugins.Web.Google;

// Create a kernel with OpenAI chat completion
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddOpenAIChatCompletion(
        modelId: "gpt-4o",
        apiKey: "<Your OpenAI API Key>");
Kernel kernel = kernelBuilder.Build();

// Create an ITextSearch instance using Google search
var textSearch = new GoogleTextSearch(
    searchEngineId: "<Your Google Search Engine Id>",
    apiKey: "<Your Google API Key>");

// Build a text search plugin with Google 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
var query = "What is the Semantic Kernel?";
var prompt = "{{SearchPlugin.Search $query}}. {{$query}}";
KernelArguments arguments = new() { { "query", query } };
Console.WriteLine(await kernel.InvokePromptAsync(prompt, arguments));

上記のサンプルには、いくつかの問題があります。

  1. 応答には、基礎コンテキストを提供するために使用された Web ページを示す引用は含まれません。
  2. 応答には、任意の Web サイトからのデータが含まれます。これを信頼済みサイトに制限することをお勧めします。
  3. 各 Web ページのスニペットのみがモデルに基になるコンテキストを提供するために使用されています。スニペットには、正確な応答を提供するために必要なデータが含まれていない可能性があります。

これらの問題の解決策については、 テキスト検索プラグイン について説明しているページを参照してください。

次に、 Text Search の抽象化を確認することをお勧めします。

間もなく利用できます

詳細は近日公開予定です。

間もなく利用できます

詳細は近日公開予定です。

次のステップ