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.
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.
Návod
Další informace o použití vektorového úložiště pro výsledky hledání najdete v dokumentaci k integraci služby Vector Stores .
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.
| Možnost | Typ | Description | Výchozí |
|---|---|---|---|
| SearchTime | 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 |
Návod
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 ke konektorům 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.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 = OpenAIChatClient(model="gpt-4o").as_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)
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 = chat_client.as_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]
)
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 = chat_client.as_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]
)
Tento přístup umožňuje agentovi zvolit nejvhodnější strategii vyhledávání na základě dotazu uživatele.
Podporované konektory VectorStore
Tento model funguje s jakýmkoli konektorem Sémantické jádro VectorStore, včetně:
- Azure AI Vyhledávač (
AzureAISearchCollection) - Qdrant (
QdrantCollection) - Borovice (
PineconeCollection) - Redis (
RedisCollection) - Weaviate (
WeaviateCollection) - In-Memory (
InMemoryVectorStoreCollection) - A další
Každý konektor poskytuje stejnou create_search_function metodu, která se dá přemístit na nástroje Agent Framework, což vám umožní zvolit vektorové databáze, které nejlépe vyhovují vašim potřebám. Podívejte se sem na úplný seznam.
Graf RAG
Pro GraphRAG s využitím procházení grafů rozšířené vyhledávání s dotazy Cypher, viz Neo4j GraphRAG Provider.