Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Microsoft Agent Framework podporuje snadné přidávání schopností načítání rozšířené generace (RAG) do agentů přidáním zprostředkovatelů kontextu AI do agenta.
Vzory konverzací a relací společně s načítáním najdete v tématu Přehled konverzací a paměti. Informace o nastavení specifické pro službu najdete v tématu Azure AI Vyhledávač, Microsoft Foundry a Neo4j.
Použití TextSearchProvideru
Třída TextSearchProvider je předefinovaná implementace zprostředkovatele kontextu RAG.
Podporuje různé režimy provozu, například vyhledávání jednotlivých agentů s historií chatu nebo reklamní nástroje pro vyhledávání.
Můžete ho ChatClientAgentAIContextProviders snadno připojit k použití této možnosti.
// 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)]
});
Vyžaduje TextSearchProvider funkci, která poskytuje výsledky hledání zadanému dotazu. Lze ji implementovat pomocí libovolné vyhledávací technologie, například Azure AI Vyhledávač nebo webového vyhledávacího webu.
Tip
Další informace o použití vektorového úložiště pro výsledky hledání najdete v tématu Integrace vektorového úložiště .
Tady je příklad napodobení vyhledávací funkce, která vrací předem definované výsledky na základě dotazu.
SourceName a SourceLink jsou volitelné, ale pokud je zadaná, bude agent používat k citování zdroje informací při odpovídání na otázku uživatele.
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);
}
Možnosti TextSearchProvider
Dá TextSearchProvider se přizpůsobit prostřednictvím TextSearchProviderOptions třídy. Tady je příklad vytvoření možností pro spuštění vyhledávání před každým vyvoláním modelu a krátké průběžné okno historie chatu pro hledání.
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,
};
Třída TextSearchProvider podporuje následující možnosti prostřednictvím TextSearchProviderOptions třídy.
| Option | Typ | Description | Výchozí |
|---|---|---|---|
| Čas hledání | TextSearchProviderOptions.TextSearchBehavior |
Označuje, kdy má být vyhledávání provedeno. Existují dvě možnosti, při každém spuštění agenta nebo volání funkce na vyžádání. | TextSearchProviderOptions.TextSearchBehavior.BeforeAIInvoke |
| FunctionToolName | string |
Název vystaveného vyhledávacího nástroje při provozu v režimu na vyžádání. | "Hledat" |
| FunctionToolDescription | string |
Popis vystaveného vyhledávacího nástroje při provozu v režimu na vyžádání. | "Umožňuje hledání dalších informací, které pomáhají zodpovědět otázku uživatele." |
| ContextPrompt | string |
Kontextový řádek s předponou výsledků. | "## Další kontext\npři odpovídání na uživatele zvažte následující informace ze zdrojových dokumentů:" |
| CitationsPrompt | string |
Instrukce připojená po výsledcích k vyžádání citací. | "Do zdrojového dokumentu uveďte citace s názvem dokumentu a odkazem, pokud je k dispozici název dokumentu a odkaz." |
| ContextFormatter | Func<IList<TextSearchProvider.TextSearchResult>, string> |
Volitelný delegát pro úplné přizpůsobení formátování seznamu výsledků Pokud je k dispozici, ContextPrompt a CitationsPrompt jsou ignorovány. |
null |
| RecentMessageMemoryLimit | int |
Počet nedávných zpráv konverzace (uživatele i asistenta), které mají zůstat v paměti, a zahrnout při vytváření vstupu hledání hledání BeforeAIInvoke . |
0 (zakázáno) |
| RecentMessageRolesIncluded | List<ChatRole> |
Seznam ChatRole typů pro filtrování posledních zpráv při rozhodování, které poslední zprávy mají být zahrnuty při vytváření vstupu hledání. |
ChatRole.User |
Tip
Kompletní příklady s možností spuštění najdete v ukázkách .NET.
Agent Framework podporuje použití kolekcí VectorStore Sémantické jádro k poskytování funkcí RAG agentům. Toho se dosahuje prostřednictvím funkce mostu, která převádí Sémantické jádro vyhledávací funkce na nástroje Agent Framework.
Vytvoření vyhledávacího nástroje z VectorStore
Metoda create_search_function z kolekce Sémantické jádro VectorStore vrátí KernelFunction, který lze převést na nástroj Agent Framework pomocí .as_agent_framework_tool().
V dokumentaci k implementaci vektorového úložiště se dozvíte, jak nastavit různé kolekce vektorového úložiště.
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 import Agent
from agent_framework.openai import OpenAIChatClient
# 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 = Agent(
client=OpenAIChatClient(model="gpt-4o"),
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)
Důležité
Tato funkce vyžaduje semantic-kernel verzi 1.38 nebo vyšší.
Přizpůsobení chování hledání
Funkci vyhledávání můžete přizpůsobit různými možnostmi:
# 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}",
)
Úplné podrobnosti o parametrech dostupných pro create_search_function najdete v dokumentaci k Sémantické jádro.
Použití více vyhledávacích funkcí
Agenta můžete poskytnout více vyhledávacích nástrojů pro různé znalostní domény:
# 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 = Agent(
client=chat_client,
instructions="You are a support agent. Use the appropriate search tool to find information before answering. Cite your sources.",
tools=[product_search, policy_search]
)
Můžete také vytvořit více vyhledávacích funkcí ze stejné kolekce s různými popisy a parametry, které poskytují specializované možnosti vyhledávání:
# 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 = Agent(
client=chat_client,
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]
)
Tento přístup umožňuje agentovi zvolit nejvhodnější strategii vyhledávání na základě dotazu uživatele.
Podporované implementace úložiště vektorů
Tento model funguje s jakoukoli implementací vectorstore Sémantické jádro, včetně:
- Azure AI Vyhledávač (
AzureAISearchCollection) - Qdrant (
QdrantCollection) - Borovice (
PineconeCollection) - Redis (
RedisCollection) - Weaviate (
WeaviateCollection) - In-Memory (
InMemoryVectorStoreCollection) - A další
Každá implementace poskytuje stejnou create_search_function metodu, kterou je možné překlenout na nástroje Agent Framework. Vyberte vektorové databáze, které nejlépe vyhovují vašim potřebám. Podívejte se na úplný seznam implementací.
Poznámka:
Podpora této funkce v Go již brzy. Nejnovější stav najdete v úložišti Agent Framework Go .
Graf RAG
Pro GraphRAG s využitím procházení grafů rozšířené vyhledávání s dotazy Cypher, viz Neo4j GraphRAG Provider.