Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Microsoft Agent Framework támogatja a kiterjesztett generáció (RAG) lekérését olyan környezetszolgáltatókon keresztül, amelyek lekért tartalmat adnak hozzá a modell meghívása előtt, és olyan keresőeszközökkel, amelyek lehetővé teszik a modell számára a földelési adatok igény szerinti lekérését.
A lekérés mellett a beszélgetési/munkamenet-mintákról a Beszélgetések > Memória áttekintésében olvashat. A szolgáltatásspecifikus beállításért lásd: Azure AI Keresés, Microsoft Foundry és Neo4j.
A TextSearchProvider használata
Az TextSearchProvider osztály egy RAG-környezetszolgáltató beépített implementációja.
Különböző működési módokat támogat, például az egyes ügynökök keresését a csevegési előzményekkel futtatva, vagy hirdetési függvényeszközöket a keresésekhez.
A beállítással ChatClientAgent könnyen csatlakoztatható egy AIContextProviders adott elemhez.
// 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)]
});
Ehhez TextSearchProvider olyan függvényre van szükség, amely megadja a keresési eredményeket egy lekérdezésben. Ez bármilyen keresési technológiával implementálható, például Azure AI Keresés vagy webes keresőmotor használatával.
Tip
A vektortárolók keresési eredményekhez való használatával kapcsolatos további információkért tekintse meg a vektortár-integrációkat .
Íme egy példa egy modellkeresési függvényre, amely a lekérdezés alapján előre definiált eredményeket ad vissza.
SourceName és SourceLink nem kötelezőek, de ha meg van adva, az ügynök az információ forrására hivatkozik a felhasználó kérdésének megválaszolásakor.
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 beállításai
Az TextSearchProvider osztályon keresztül TextSearchProviderOptions testre szabható. Íme egy példa arra, hogy olyan beállításokat hozhat létre, amelyekkel minden modell meghívása előtt futtathatja a keresést, és rövid ideig tarthatja a csevegési előzményeket a keresésekhez.
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,
};
Az TextSearchProvider osztály az alábbi lehetőségeket támogatja az TextSearchProviderOptions osztályon keresztül.
| Option | Típus | Leírás | Default |
|---|---|---|---|
| Keresési Idő | TextSearchProviderOptions.TextSearchBehavior |
Azt jelzi, hogy mikor kell végrehajtani a keresést. Két lehetőség közül választhat, minden alkalommal, amikor az ügynök fut, vagy igény szerint függvényhívással. | TextSearchProviderOptions.TextSearchBehavior.BeforeAIInvoke |
| FunctionToolName | string |
A közzétett keresőeszköz neve igény szerinti módban való működéskor. | "Keresés" |
| FunctionToolDescription | string |
A közzétett keresőeszköz leírása igény szerinti módban való működéskor. | "Lehetővé teszi további információk keresését a felhasználói kérdés megválaszolásához." |
| ContextPrompt | string |
A környezeti kérés előtagja az eredményekhez. | "## További környezet\nVegye figyelembe a forrásdokumentumok következő információinak a felhasználónak való megválaszolásakor:" |
| CitationsPrompt | string |
Az idézetek kéréséhez az eredmények után hozzáfűzött utasítás. | "Ha elérhető a dokumentum neve és hivatkozása, hivatkozzon a forrásdokumentumra." |
| ContextFormatter | Func<IList<TextSearchProvider.TextSearchResult>, string> |
Nem kötelező delegálni az eredménylista formázásának teljes testreszabásához. Ha meg van adva, ContextPrompt és CitationsPrompt a rendszer figyelmen kívül hagyja. |
null |
| RecentMessageMemoryLimit | int |
Azoknak a legutóbbi beszélgetési üzeneteknek a száma (mind a felhasználó, mind az asszisztens), amelyek a memóriában maradnak, és belefoglalnak a keresések keresési bemenetének BeforeAIInvoke összeállításakor. |
0 (letiltva) |
| RecentMessageRolesIncluded | List<ChatRole> |
Azoknak a típusoknak a ChatRole listája, amelyekre szűrni szeretné a legutóbbi üzeneteket, amikor eldönti, hogy mely legutóbbi üzeneteket vegye figyelembe a keresési bemenet létrehozásakor. |
ChatRole.User |
Tip
A teljes futtatható példákért tekintse meg a .NET-mintákat .
Az Agent Framework natív vektortároló-szerződéseket és create_vector_search_tool(). A segéd minden SupportsVectorSearch implementációt függvényeszközsé alakít, így a modell a válaszok előtt lekérheti a földelési adatokat.
Natív vektorkeresési eszköz létrehozása
Először határozza meg a vektortároló-modellt, hozzon létre egy gyűjteményt, és töltse be a rekordjait. Az alábbi minta a következővel OpenAIEmbeddingClienthasználhatóInMemoryCollection, de bármilyen natív Agent Framework-gyűjteményt megadhat, amely implementálhatóSupportsVectorSearch. Ezután elérhetővé teszi az opcionális kategória- és minősítési szűrőket a modellnek, leképezi az egyes eredményeket a földelő szövegre, és arra utasítja az ügynököt, hogy keressen rá, mielőtt választ ad:
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)
A teljes minta meghatározza a Hotel modellt, és betölti a forrásrekordokat a megjelenített gyűjtemény beállítása előtt. A futtatás előtt állítsa be OPENAI_API_KEY .
Keresési viselkedés testreszabása
Konfigurálja create_vector_search_tool() a következő lehetőségeket:
| Option | Alkalmazás célja |
|---|---|
name |
Beállítja a modell számára közzétett függvénynevet. Használjon egyedi nevet több keresőeszköz hozzáadásakor. |
description |
Ez a cikk azt ismerteti, hogy a modell mikor és miért használja az eszközt. |
approval_mode |
Eszközjóváhagyás beállítása a (vagynever_require) értékrealways_require. |
search_type |
Kiválaszt vagy vectorkeyword_hybrid keres. A gyűjteménynek támogatnia kell a kiválasztott módot. |
top és skip |
Állítsa be a rögzített lapozási értékeket, vagy használja a modell által biztosított beírt Param értékeket. |
filter |
Hordozható Filter vagy FilterGroup. A szűrő tartalmazhat az eszközsémában közzétett beírt Param értékeket. |
result_mapper |
Ezeket SearchResponse szöveggé vagy multimodálissá Content alakítja a modellhez. |
A létrehozott eszköz mindig tartalmaz egy sztringet query . A szűrőben Paramtopvagy skip a beállításokban szereplő értékek további érvényesített eszközargumentumokká válnak.
A Literal modell által megadott értékek az alkalmazás által elfogadott tartományon belül maradnak.
Több eszközt is létrehozhat különböző gyűjteményekhez vagy keresési módokhoz. Adjon külön-külön name minden eszközt, hogy description a modell kiválaszthassa a megfelelő tudásbázist.
Natív vektortároló kiválasztása
Natív Python-implementációk érhetők el a memóriabeli kereséshez, Azure AI Keresés, PostgreSQL-hez pgvector, Qdrant és Redis használatával. A keresési módok, a csomagok életciklusa, a telepítési parancsok és a korlátozások eltérőek. Implementáció kiválasztásához és konfigurálásához tekintse meg a Vector Store-integrációkat . Ez a lap azokat az adatbázisokat is azonosítja, amelyek jelenleg csak külön Szemantikus kernel összekötővel rendelkeznek.
Megjegyzés:
A funkció Go-támogatása hamarosan érkezik. A legújabb állapotot az Agent Framework Go-adattárában tekinthet meg.
Graph RAG
Ha a GraphRAG-t gráfbejárással bővített kereséssel, Cypher-lekérdezésekkel használja, tekintse meg a Neo4j GraphRAG-szolgáltatót.