Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Microsoft Agent Framework поддерживает извлечение дополненного поколения (RAG) через поставщиков контекстов, которые добавляют полученное содержимое перед вызовом модели и средствами поиска, которые позволяют модели получать данные о основе по запросу.
Общие сведения о шаблонах бесед и сеансов вместе с получением см. в разделе "Беседы и память". Сведения о настройке для конкретной службы см. в разделе Поиск с использованием ИИ Azure, Microsoft Foundry и Neo4j.
Использование TextSearchProvider
Класс TextSearchProvider является внестандартной реализацией поставщика контекста RAG.
Она поддерживает различные режимы работы, например поиск каждого агента, выполняемого с помощью журнала чата, или средств рекламной функции для выполнения поиска.
Его можно легко подключить к параметру ChatClientAgentAIContextProviders .
// Configure the options for the TextSearchProvider.
TextSearchProviderOptions textSearchOptions = new()
{
SearchTime = TextSearchProviderOptions.TextSearchBehavior.BeforeAIInvoke,
};
// Create the AI agent with the TextSearchProvider.
AIAgent agent = azureOpenAIClient
.GetChatClient(deploymentName)
.AsAIAgent(new ChatClientAgentOptions
{
ChatOptions = new() { Instructions = "You are a helpful support specialist. Answer questions using the provided context and cite the source document when available." },
AIContextProviders = [new TextSearchProvider(SearchAdapter, textSearchOptions)]
});
Для TextSearchProvider выполнения запроса требуется функция, предоставляющая результаты поиска. Это можно реализовать с помощью любой технологии поиска, например Поиск с использованием ИИ Azure или веб-поисковой системы.
Tip
Дополнительные сведения об использовании векторного хранилища для результатов поиска см. в разделе интеграции хранилища векторов .
Ниже приведен пример функции поиска макета, которая возвращает предварительно определенные результаты на основе запроса.
SourceName и SourceLink являются необязательными, но если предоставлено, агент будет использовать для указания источника информации при ответе на вопрос пользователя.
static Task<IEnumerable<TextSearchProvider.TextSearchResult>> SearchAdapter(string query, CancellationToken cancellationToken)
{
// The mock search inspects the user's question and returns pre-defined snippets
// that resemble documents stored in an external knowledge source.
List<TextSearchProvider.TextSearchResult> results = new();
if (query.Contains("return", StringComparison.OrdinalIgnoreCase) || query.Contains("refund", StringComparison.OrdinalIgnoreCase))
{
results.Add(new()
{
SourceName = "Contoso Outdoors Return Policy",
SourceLink = "https://contoso.com/policies/returns",
Text = "Customers may return any item within 30 days of delivery. Items should be unused and include original packaging. Refunds are issued to the original payment method within 5 business days of inspection."
});
}
return Task.FromResult<IEnumerable<TextSearchProvider.TextSearchResult>>(results);
}
Параметры TextSearchProvider
Его TextSearchProvider можно настроить с помощью TextSearchProviderOptions класса. Ниже приведен пример создания параметров для выполнения поиска до каждого вызова модели и сохранения короткого скользящего окна журнала чата для поиска.
TextSearchProviderOptions textSearchOptions = new()
{
// Run the search prior to every model invocation and keep a short rolling window of chat history for searches.
SearchTime = TextSearchProviderOptions.TextSearchBehavior.BeforeAIInvoke,
RecentMessageMemoryLimit = 6,
};
Класс TextSearchProvider поддерживает следующие параметры через TextSearchProviderOptions класс.
| Опция | Type | Описание | Default |
|---|---|---|---|
| ВремяПоиска | TextSearchProviderOptions.TextSearchBehavior |
Указывает, когда должен выполняться поиск. Существует два варианта при каждом запуске агента или по запросу через вызов функции. | TextSearchProviderOptions.TextSearchBehavior.BeforeAIInvoke |
| FunctionToolName | string |
Имя предоставленного средства поиска при работе в режиме по запросу. | "Поиск" |
| FunctionToolDescription | string |
Описание предоставленного средства поиска при работе в режиме по запросу. | "Позволяет искать дополнительную информацию, чтобы помочь ответить на вопрос пользователя". |
| ContextPrompt | string |
Запрос контекста, префиксированного в результаты. | "## Дополнительный контекст\nУчитывайте следующие сведения из исходных документов при реагировании на пользователя:" |
| СсылкиPrompt | string |
Инструкция, добавленная после результатов для запроса ссылок. | "Включите ссылки на исходный документ с именем документа и ссылкой, если имя документа и ссылка доступны". |
| ContextFormatter | Func<IList<TextSearchProvider.TextSearchResult>, string> |
Необязательный делегат для полной настройки форматирования списка результатов. Если указано, ContextPrompt и CitationsPrompt игнорируются. |
null |
| RecentMessageMemoryLimit | int |
Количество последних сообщений бесед (как пользователя, так и помощника), которые хранятся в памяти и включаются при создании входных данных поиска для BeforeAIInvoke поиска. |
0 (отключено) |
| RecentMessageRolesIncluded | List<ChatRole> |
Список типов для фильтрации последних ChatRole сообщений при принятии решения о том, какие последние сообщения следует включить при создании входных данных поиска. |
ChatRole.User |
Tip
Полные примеры запуска см. в примерах .NET .
Agent Framework предоставляет собственные контракты векторного хранилища и create_vector_search_tool(). Вспомогательный инструмент преобразует любую SupportsVectorSearch реализацию в средство функции, чтобы модель может получить данные о заземления перед ответами.
Создание собственного средства поиска векторов
Сначала определите модель векторного хранилища, создайте коллекцию и загрузите ее записи. В следующем примере используется InMemoryCollection , OpenAIEmbeddingClientно можно указать любую собственную коллекцию Agent Framework, которая реализует SupportsVectorSearch. Затем он предоставляет необязательные фильтры категорий и рейтингов для модели, сопоставляет каждый результат с текстом заземления и предписывает агенту выполнять поиск перед ответами:
import asyncio
import json
import os
from typing import Annotated, Any, Literal
from urllib.request import urlopen
from agent_framework import (
Agent,
Filter,
FilterGroup,
InMemoryCollection,
Param,
VectorStoreField,
create_vector_search_tool,
vectorstoremodel,
)
from agent_framework.openai import OpenAIChatClient, OpenAIEmbeddingClient
from dotenv import load_dotenv
async def main() -> None:
"""Create an in-memory hotel search tool and give it to an agent."""
api_key = os.environ["OPENAI_API_KEY"]
collection: InMemoryCollection[str, Hotel] = InMemoryCollection(
Hotel,
embedding_generator=OpenAIEmbeddingClient(
model="text-embedding-3-small",
api_key=api_key,
),
)
await collection.ensure_collection_exists()
# 1. Load the hotel records.
hotels = await asyncio.to_thread(load_hotels)
await collection.upsert(hotels)
# 2. Param values become optional model-visible filter arguments.
# When the allowed values are known, use Literal so the tool schema exposes
# them as an enum.
category = Param(
"category",
Literal["Boutique", "Budget", "Extended-Stay", "Luxury", "Resort and Spa", "Suite"],
description="Only return hotels in this category.",
)
min_rating = Param(
"min_rating",
float,
description="The minimum guest rating.",
minimum=0,
maximum=5,
)
tool = create_vector_search_tool(
collection,
description="Search the hotel dataset, optionally filtering by category and minimum rating.",
filter=FilterGroup(
"and",
(
Filter("category", "eq", category),
Filter("rating", "gte", min_rating),
),
),
result_mapper=lambda result: (
f"(hotel_id: {result['record'].hotel_id}) {result['record'].hotel_name} "
f"(rating {result['record'].rating}) - {result['record'].description}. "
f"Address: {result['record'].address.city}, {result['record'].address.country}."
),
)
# 3. The agent chooses whether to supply the exposed category and minimum-rating filters.
async with Agent(
client=OpenAIChatClient(
model="gpt-5.4-nano",
api_key=api_key,
),
name="HotelAgent",
instructions=(
"Always use the search tool to answer hotel questions. "
"Use category and minimum rating filters when the request provides them. "
"Include the hotel_id in the answer."
),
tools=[tool],
) as agent:
result = await agent.run("Find a resort and spa with a rating of at least 4.")
print(result)
Полный Hotel пример определяет модель и загружает исходные записи до настройки показанной коллекции. Задайте перед OPENAI_API_KEY запуском.
Настройка поведения поиска
Настройте create_vector_search_tool() следующие параметры:
| Опция | Purpose |
|---|---|
name |
Задает имя функции, предоставляемое модели. При добавлении нескольких средств поиска используйте уникальное имя. |
description |
Объясняет, когда и почему модель должна использовать средство. |
approval_mode |
Задает утверждение средства или always_requirenever_require. |
search_type |
Выбирает или keyword_hybrid выполняет vector поиск. Коллекция должна поддерживать выбранный режим. |
top и skip. |
Задайте фиксированные значения разбиения по страницам или используйте типизированные Param значения, предоставляемые моделью. |
filter |
Применяет переносимую Filter или FilterGroup. Фильтр может содержать типизированные Param значения, предоставляемые в схеме средства. |
result_mapper |
Преобразует каждый из них SearchResponse в текст или мультимодальный Content для модели. |
Созданное средство всегда включает query строку. Все Param значения в фильтре topили skip параметры становятся дополнительными проверенными аргументами средства.
Используйте Literal и числовые ограничения, чтобы сохранить предоставленные моделью значения в диапазоне, который принимает приложение.
Вы можете создать несколько инструментов для различных коллекций или режимов поиска. Присвойте каждому инструменту отдельный namedescription и поэтому модель может выбрать соответствующий источник знаний.
Выбор собственного векторного хранилища
Собственные реализации Python доступны для поиска в памяти, Поиск с использованием ИИ Azure, PostgreSQL с pgvector, Qdrant и Redis. Их режимы поиска, жизненный цикл пакета, команды установки и ограничения отличаются. Чтобы выбрать и настроить реализацию, см. сведения об интеграции с хранилищем векторов . Эта страница также определяет базы данных, которые в настоящее время имеют только отдельный соединитель Semantic Kernel.
RAG в Go
Пакет agent/textsearch добавляет полученные знания с помощью agent.ContextProvider. Укажите функцию поиска, которая возвращает []textsearch.Result, включая текстовые и необязательные имена источников и ссылки, а затем зарегистрируйте поставщика в agent.Config.ContextProviders.
В поддерживаемом примере пользовательского источника данных используется функция поиска макета и развертывание модели Foundry:
import (
"context"
"fmt"
"strings"
"github.com/microsoft/agent-framework-go/agent"
"github.com/microsoft/agent-framework-go/agent/textsearch"
"github.com/microsoft/agent-framework-go/examples/internal/demo"
"github.com/microsoft/agent-framework-go/provider/foundryprovider"
)
searchProvider := textsearch.NewContextProvider(mockSearch, textsearch.Config{
SearchTime: textsearch.BeforeInvoke,
RecentMessageMemoryLimit: 6,
})
a := foundryprovider.NewAgent(demo.FoundryProjectEndpoint, token, foundryprovider.ModelDeployment(demo.FoundryModel),
foundryprovider.AgentConfig{
Instructions: "You are a helpful support specialist for Contoso Outdoors. Answer questions using the provided context and cite the source document when available.",
Config: agent.Config{
ContextProviders: []agent.ContextProvider{searchProvider},
Middlewares: []agent.Middleware{logger},
},
DisableStoreOutput: true,
})
Выберите, когда выполняется извлечение:
-
textsearch.BeforeInvokeвыполняет поиск перед каждым запуском и внедряет форматированные результаты в контекст модели. Это значение по умолчанию. -
textsearch.OnDemandFunctionCallingпредоставляет средство поиска, чтобы модель может запрашивать дополнительный контекст. Используйте поставщик с включенным автоматическим вызовом функции-средства.
RecentMessageMemoryLimit при необходимости сохраняет отдельные сообщения в сеансе для обогащения автоматических поисковых запросов. Повторно используйте явный сеанс для сохранения этого контекста запроса. Это не долгосрочное хранилище бесед.
Настройте textsearch.Config.Logger для диагностики автоматического поиска. Принудительно применять элементы управления доступом в функции поиска и обрабатывать полученные текстовые и модели созданные поисковые запросы как ненадежные входные данные.
См. примеры Go RAG для поиска в вектора в памяти, Qdrant, пользовательского извлечения, поиска файлов Foundry и Neo4j GraphRAG. Сведения о встроенных хранилищах и их ограничениях см. в разделе интеграции с хранилищем векторов.
Граф RAG
Сведения о GraphRAG с помощью обхода графа с запросами Cypher см. в разделе "Поставщик GraphRAG Neo4j".