Udostępnij przez


Pobieranie agenta rozszerzonej generacji (RAG)

Program Microsoft Agent Framework obsługuje dodawanie funkcji generacji rozszerzonej (RAG) do agentów przez dodanie dostawców kontekstu sztucznej inteligencji do agenta.

Korzystanie z elementu TextSearchProvider

Klasa TextSearchProvider jest wbudowaną implementacją dostawcy kontekstu RAG.

Można go łatwo dołączyć do ChatClientAgent elementu przy użyciu AIContextProviderFactory opcji zapewnienia możliwości RAG agentowi.

// Create the AI agent with the TextSearchProvider as the AI context provider.
AIAgent agent = azureOpenAIClient
    .GetChatClient(deploymentName)
    .CreateAIAgent(new ChatClientAgentOptions
    {
        Instructions = "You are a helpful support specialist for Contoso Outdoors. Answer questions using the provided context and cite the source document when available.",
        AIContextProviderFactory = ctx => new TextSearchProvider(SearchAdapter, ctx.SerializedState, ctx.JsonSerializerOptions, textSearchOptions)
    });

Funkcja TextSearchProvider wymaga funkcji, która udostępnia wyniki wyszukiwania przy użyciu zapytania. Można to zaimplementować przy użyciu dowolnej technologii wyszukiwania, np. usługi Azure AI Search lub wyszukiwarki internetowej.

Oto przykład pozornej funkcji wyszukiwania, która zwraca wstępnie zdefiniowane wyniki na podstawie zapytania. SourceName i SourceLink są opcjonalne, ale jeśli zostanie podany przez agenta, będzie używany do przytaczania źródła informacji podczas odpowiadania na pytanie użytkownika.

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);
}

Opcje textSearchProvider

Element TextSearchProvider można dostosować za pomocą TextSearchProviderOptions klasy . Oto przykład tworzenia opcji uruchamiania wyszukiwania przed każdym wywołaniem modelu i zachowanie krótkiego okna kroczącego kontekstu konwersacji.

TextSearchProviderOptions textSearchOptions = new()
{
    // Run the search prior to every model invocation and keep a short rolling window of conversation context.
    SearchTime = TextSearchProviderOptions.TextSearchBehavior.BeforeAIInvoke,
    RecentMessageMemoryLimit = 6,
};

Klasa TextSearchProvider obsługuje następujące opcje za pośrednictwem TextSearchProviderOptions klasy .

Option Typ Description Default
Czas wyszukiwania TextSearchProviderOptions.TextSearchBehavior Wskazuje, kiedy należy wykonać wyszukiwanie. Istnieją dwie opcje, za każdym razem, gdy agent jest wywoływany lub na żądanie za pośrednictwem wywołania funkcji. TextSearchProviderOptions.TextSearchBehavior.BeforeAIInvoke
FunctionToolName string Nazwa uwidocznionego narzędzia wyszukiwania podczas pracy w trybie na żądanie. "Wyszukaj"
FunctionToolDescription string Opis uwidocznionego narzędzia wyszukiwania podczas pracy w trybie na żądanie. "Umożliwia wyszukiwanie dodatkowych informacji, aby pomóc w udzieleniu odpowiedzi na pytanie użytkownika".
ContextPrompt string Monit kontekstu poprzedzony prefiksem do wyników podczas pracy w BeforeAIInvoke trybie. "## Dodatkowy kontekst\nRozważ następujące informacje z dokumentów źródłowych podczas odpowiadania użytkownikowi:"
CytatyPrompt string Instrukcja dołączona po wynikach w celu żądania cytatów podczas pracy w BeforeAIInvoke trybie. "Dołącz cytaty do dokumentu źródłowego z nazwą dokumentu i linkiem, jeśli dostępna jest nazwa i link dokumentu".
ContextFormatter Func<IList<TextSearchProvider.TextSearchResult>, string> Opcjonalny delegat w celu pełnego dostosowania formatowania listy wyników podczas pracy w BeforeAIInvoke trybie. W przypadku podania ContextPrompt wartości i CitationsPrompt są ignorowane. null
RecentMessageMemoryLimit int Liczba ostatnich wiadomości konwersacji (zarówno użytkownika, jak i asystenta), które mają być przechowywane w pamięci i uwzględniane podczas konstruowania danych wejściowych wyszukiwania wyszukiwania BeforeAIInvoke . 0 (wyłączone)
RecentMessageRolesIncluded List<ChatRole> Lista typów do filtrowania ostatnich komunikatów ChatRole podczas podejmowania decyzji, które ostatnie komunikaty mają być uwzględniane podczas konstruowania danych wejściowych wyszukiwania. ChatRole.User

Korzystanie z semantycznego magazynu wektorów jądra z platformą Agent Framework

Program Agent Framework obsługuje używanie kolekcji VectorStore jądra semantycznego w celu zapewnienia funkcji RAG agentom. Jest to osiągane za pomocą funkcji mostka, która konwertuje funkcje wyszukiwania semantycznych jądra na narzędzia platformy Agent Framework.

Ważne

Ta funkcja wymaga semantic-kernel wersji 1.38 lub nowszej.

Tworzenie narzędzia wyszukiwania na podstawie magazynu wektorów

Metoda create_search_function z kolekcji Semantic Kernel VectorStore zwraca element KernelFunction , który można przekonwertować na narzędzie Platformy agentów przy użyciu polecenia .as_agent_framework_tool(). Skorzystaj z dokumentacji łączników magazynu wektorów , aby dowiedzieć się, jak skonfigurować różne kolekcje magazynów wektorów.

from semantic_kernel.connectors.ai.open_ai import OpenAITextEmbedding
from semantic_kernel.connectors.azure_ai_search import AzureAISearchCollection
from semantic_kernel.functions import KernelParameterMetadata
from agent_framework.openai import OpenAIResponsesClient

# Define your data model
class SupportArticle:
    article_id: str
    title: str
    content: str
    category: str
    # ... other fields

# Create an Azure AI Search collection
collection = AzureAISearchCollection[str, SupportArticle](
    record_type=SupportArticle,
    embedding_generator=OpenAITextEmbedding()
)

async with collection:
    await collection.ensure_collection_exists()
    # Load your knowledge base articles into the collection
    # await collection.upsert(articles)

    # Create a search function from the collection
    search_function = collection.create_search_function(
        function_name="search_knowledge_base",
        description="Search the knowledge base for support articles and product information.",
        search_type="keyword_hybrid",
        parameters=[
            KernelParameterMetadata(
                name="query",
                description="The search query to find relevant information.",
                type="str",
                is_required=True,
                type_object=str,
            ),
            KernelParameterMetadata(
                name="top",
                description="Number of results to return.",
                type="int",
                default_value=3,
                type_object=int,
            ),
        ],
        string_mapper=lambda x: f"[{x.record.category}] {x.record.title}: {x.record.content}",
    )

    # Convert the search function to an Agent Framework tool
    search_tool = search_function.as_agent_framework_tool()

    # Create an agent with the search tool
    agent = OpenAIResponsesClient(model_id="gpt-4o").create_agent(
        instructions="You are a helpful support specialist. Use the search tool to find relevant information before answering questions. Always cite your sources.",
        tools=search_tool
    )

    # Use the agent with RAG capabilities
    response = await agent.run("How do I return a product?")
    print(response.text)

Dostosowywanie zachowania wyszukiwania

Funkcję wyszukiwania można dostosować przy użyciu różnych opcji:

# Create a search function with filtering and custom formatting
search_function = collection.create_search_function(
    function_name="search_support_articles",
    description="Search for support articles in specific categories.",
    search_type="keyword_hybrid",
    # Apply filters to restrict search scope
    filter=lambda x: x.is_published == True,
    parameters=[
        KernelParameterMetadata(
            name="query",
            description="What to search for in the knowledge base.",
            type="str",
            is_required=True,
            type_object=str,
        ),
        KernelParameterMetadata(
            name="category",
            description="Filter by category: returns, shipping, products, or billing.",
            type="str",
            type_object=str,
        ),
        KernelParameterMetadata(
            name="top",
            description="Maximum number of results to return.",
            type="int",
            default_value=5,
            type_object=int,
        ),
    ],
    # Customize how results are formatted for the agent
    string_mapper=lambda x: f"Article: {x.record.title}\nCategory: {x.record.category}\nContent: {x.record.content}\nSource: {x.record.article_id}",
)

Aby uzyskać szczegółowe informacje na temat parametrów dostępnych dla create_search_functionprogramu , zobacz dokumentację jądra semantycznego.

Korzystanie z wielu funkcji wyszukiwania

Możesz udostępnić agentowi wiele narzędzi wyszukiwania dla różnych domen wiedzy:

# Create search functions for different knowledge bases
product_search = product_collection.create_search_function(
    function_name="search_products",
    description="Search for product information and specifications.",
    search_type="semantic_hybrid",
    string_mapper=lambda x: f"{x.record.name}: {x.record.description}",
).as_agent_framework_tool()

policy_search = policy_collection.create_search_function(
    function_name="search_policies",
    description="Search for company policies and procedures.",
    search_type="keyword_hybrid",
    string_mapper=lambda x: f"Policy: {x.record.title}\n{x.record.content}",
).as_agent_framework_tool()

# Create an agent with multiple search tools
agent = chat_client.create_agent(
    instructions="You are a support agent. Use the appropriate search tool to find information before answering. Cite your sources.",
    tools=[product_search, policy_search]
)

Można również utworzyć wiele funkcji wyszukiwania z tej samej kolekcji z różnymi opisami i parametrami, aby zapewnić wyspecjalizowane funkcje wyszukiwania:

# Create multiple search functions from the same collection
# Generic search for broad queries
general_search = support_collection.create_search_function(
    function_name="search_all_articles",
    description="Search all support articles for general information.",
    search_type="semantic_hybrid",
    parameters=[
        KernelParameterMetadata(
            name="query",
            description="The search query.",
            type="str",
            is_required=True,
            type_object=str,
        ),
    ],
    string_mapper=lambda x: f"{x.record.title}: {x.record.content}",
).as_agent_framework_tool()

# Detailed lookup for specific article IDs
detail_lookup = support_collection.create_search_function(
    function_name="get_article_details",
    description="Get detailed information for a specific article by its ID.",
    search_type="keyword",
    top=1,
    parameters=[
        KernelParameterMetadata(
            name="article_id",
            description="The specific article ID to retrieve.",
            type="str",
            is_required=True,
            type_object=str,
        ),
    ],
    string_mapper=lambda x: f"Title: {x.record.title}\nFull Content: {x.record.content}\nLast Updated: {x.record.updated_date}",
).as_agent_framework_tool()

# Create an agent with both search functions
agent = chat_client.create_agent(
    instructions="You are a support agent. Use search_all_articles for general queries and get_article_details when you need full details about a specific article.",
    tools=[general_search, detail_lookup]
)

Takie podejście pozwala agentowi wybrać najbardziej odpowiednią strategię wyszukiwania na podstawie zapytania użytkownika.

Obsługiwane łączniki VectorStore

Ten wzorzec działa z dowolnym łącznikiem Semantic Kernel VectorStore, w tym:

  • Azure AI Search (AzureAISearchCollection)
  • Qdrant (QdrantCollection)
  • Pinecone (PineconeCollection)
  • Redis (RedisCollection)
  • Weaviate (WeaviateCollection)
  • In-Memory (InMemoryVectorStoreCollection)
  • I nawet więcej

Każdy łącznik udostępnia tę samą create_search_function metodę, którą można połączyć z narzędziami platformy Agent Framework, umożliwiając wybór bazy danych wektorów, która najlepiej odpowiada Twoim potrzebom. Zobacz pełną listę tutaj.

Dalsze kroki