Rychlý start: Generování vyhledávací služby (RAG) se základními daty ze služby Azure AI Search
V tomto rychlém startu se dozvíte, jak odesílat dotazy do modelu dokončování chatu pro konverzační vyhledávání prostřednictvím indexovaného obsahu ve službě Azure AI Search. Pomocí webu Azure Portal nastavíte prostředky a pak spustíte kód Pythonu pro volání rozhraní API.
Požadavky
Visual Studio Code s rozšířením Pythonu a balíčkem Jupyter Další informace najdete v pythonu v editoru Visual Studio Code.
Předplatné Azure s oprávněními k přiřazování rolí. Vytvořte si ho zdarma.
-
- Zvolte oblast , která podporuje model dokončení chatu, který chcete použít (gpt-4o, gpt-4o-mini nebo ekvivalentní model).
- Nasaďte model dokončování chatu v Azure AI Foundry nebo použijte jiný přístup.
-
- Stejná oblast jako Azure OpenAI
- Doporučuje se úroveň Basic nebo vyšší.
- Povolte sémantické řazení.
- Povolte řízení přístupu na základě role (viz níže).
Pokud chcete splnit požadavek na stejnou oblast, začněte tím, že zkontrolujete oblasti pro model chatu, který chcete použít. Jakmile identifikujete oblast, ověřte, že je služba Azure AI Search dostupná ve stejné oblasti.
Ujistěte se, že znáte název nasazeného modelu a máte koncové body pro oba prostředky Azure. Tyto informace zadáte v následujících krocích.
Stáhnout soubor
Stáhněte si poznámkový blok Jupyter z GitHubu a odešlete požadavky v tomto rychlém startu. Další informace najdete v tématu Stahování souborů z GitHubu.
Můžete také spustit nový soubor v místním systému a ručně vytvořit požadavky pomocí pokynů v tomto článku.
Konfigurace přístupu
Požadavky na koncový bod vyhledávání musí být ověřeny a autorizované. Pro tuto úlohu můžete použít klíče rozhraní API nebo role. Klíče se snadněji spouštějí, ale role jsou bezpečnější. Tento rychlý start předpokládá role.
Nastavujete dva klienty, takže potřebujete oprávnění k oběma prostředkům.
Azure AI Search přijímá požadavek na dotaz z místního systému. Pokud již ukázkový index hotelů existuje, přiřaďte si přiřazení role Čtenář dat indexu vyhledávání. Pokud neexistuje, přiřaďte si role Přispěvatel vyhledávací služby a Přispěvatel dat indexu vyhledávání, abyste mohli index vytvořit a dotazovat.
Azure OpenAI přijímá dotaz a výsledky hledání z místního systému. Přiřaďte si roli uživatele OpenAI služeb Cognitive Services v Azure OpenAI.
Přihlaste se k portálu Azure.
Konfigurace azure AI Search pro přístup na základě role:
Na webu Azure Portal vyhledejte Search Azure AI.
V nabídce vlevo vyberte Klíče nastavení>a pak vyberte řízení přístupu na základě role nebo obojí.
Přiřazení rolí:
V nabídce vlevo vyberte Řízení přístupu (IAM).
Ve službě Azure AI Search vyberte tyto role pro vytvoření, načtení a dotazování indexu vyhledávání a pak je přiřaďte identitě uživatele Microsoft Entra ID:
- Přispěvatel dat indexu vyhledávání
- Přispěvatel vyhledávací služby
V Azure OpenAI vyberte Řízení přístupu (IAM) a přiřaďte tuto roli sami sobě v Azure OpenAI:
- Uživatel Cognitive Services OpenAI
Může trvat několik minut, než se oprávnění projeví.
Vytvoření indexu
Vyhledávací index poskytuje základní data pro model chatu. Doporučujeme vytvořit hotelový ukázkový index, který je možné vytvořit v minutách a spustit na libovolné úrovni vyhledávací služby. Tento index se vytvoří pomocí předdefinovaných ukázkových dat.
Na webu Azure Portal vyhledejte svou vyhledávací službu.
Na domovské stránce Přehled vyberte Importovat data a spusťte průvodce.
Na stránce Připojit k datům vyberte v rozevíracím seznamu ukázky.
Zvolte ukázku hotelů.
Vyberte Další přes zbývající stránky a přijměte výchozí hodnoty.
Po vytvoření indexu v nabídce vlevo vyberte Indexy správy>vyhledávání a otevřete index.
Vyberte Upravit JSON.
Posuňte se na konec indexu, kde najdete zástupné symboly pro konstrukce, které lze přidat do indexu.
"analyzers": [], "tokenizers": [], "tokenFilters": [], "charFilters": [], "normalizers": [],
Na nový řádek za "normalizers" vložte následující sémantickou konfiguraci. Tento příklad určuje
"defaultConfiguration"
, což je důležité pro spuštění tohoto rychlého startu."semantic":{ "defaultConfiguration":"semantic-config", "configurations":[ { "name":"semantic-config", "prioritizedFields":{ "titleField":{ "fieldName":"HotelName" }, "prioritizedContentFields":[ { "fieldName":"Description" } ], "prioritizedKeywordsFields":[ { "fieldName":"Category" }, { "fieldName":"Tags" } ] } } ] },
Uloží změny.
Spuštěním následujícího dotazu v Průzkumníku služby Search otestujte index:
complimentary breakfast
.Výstup by měl vypadat podobně jako v následujícím příkladu. Výsledky, které se vrátí přímo z vyhledávacího webu, se skládají z polí a jejich doslovných hodnot spolu s metadaty, jako je skóre hledání a sémantické skóre řazení a titulek, pokud použijete sémantický ranker. Příkaz select jsme použili k vrácení pouze polí HotelName, Description a Tags.
{ "@odata.count": 18, "@search.answers": [], "value": [ { "@search.score": 2.2896252, "@search.rerankerScore": 2.506816864013672, "@search.captions": [ { "text": "Head Wind Resort. Suite. coffee in lobby\r\nfree wifi\r\nview. The best of old town hospitality combined with views of the river and cool breezes off the prairie. Our penthouse suites offer views for miles and the rooftop plaza is open to all guests from sunset to 10 p.m. Enjoy a **complimentary continental breakfast** in the lobby, and free Wi-Fi throughout the hotel..", "highlights": "" } ], "HotelName": "Head Wind Resort", "Description": "The best of old town hospitality combined with views of the river and cool breezes off the prairie. Our penthouse suites offer views for miles and the rooftop plaza is open to all guests from sunset to 10 p.m. Enjoy a complimentary continental breakfast in the lobby, and free Wi-Fi throughout the hotel.", "Tags": [ "coffee in lobby", "free wifi", "view" ] }, { "@search.score": 2.2158256, "@search.rerankerScore": 2.288334846496582, "@search.captions": [ { "text": "Swan Bird Lake Inn. Budget. continental breakfast\r\nfree wifi\r\n24-hour front desk service. We serve a continental-style breakfast each morning, featuring a variety of food and drinks. Our locally made, oh-so-soft, caramel cinnamon rolls are a favorite with our guests. Other breakfast items include coffee, orange juice, milk, cereal, instant oatmeal, bagels, and muffins..", "highlights": "" } ], "HotelName": "Swan Bird Lake Inn", "Description": "We serve a continental-style breakfast each morning, featuring a variety of food and drinks. Our locally made, oh-so-soft, caramel cinnamon rolls are a favorite with our guests. Other breakfast items include coffee, orange juice, milk, cereal, instant oatmeal, bagels, and muffins.", "Tags": [ "continental breakfast", "free wifi", "24-hour front desk service" ] }, { "@search.score": 0.92481667, "@search.rerankerScore": 2.221315860748291, "@search.captions": [ { "text": "White Mountain Lodge & Suites. Resort and Spa. continental breakfast\r\npool\r\nrestaurant. Live amongst the trees in the heart of the forest. Hike along our extensive trail system. Visit the Natural Hot Springs, or enjoy our signature hot stone massage in the Cathedral of Firs. Relax in the meditation gardens, or join new friends around the communal firepit. Weekend evening entertainment on the patio features special guest musicians or poetry readings..", "highlights": "" } ], "HotelName": "White Mountain Lodge & Suites", "Description": "Live amongst the trees in the heart of the forest. Hike along our extensive trail system. Visit the Natural Hot Springs, or enjoy our signature hot stone massage in the Cathedral of Firs. Relax in the meditation gardens, or join new friends around the communal firepit. Weekend evening entertainment on the patio features special guest musicians or poetry readings.", "Tags": [ "continental breakfast", "pool", "restaurant" ] }, . . . ]}
Získání koncových bodů služby
Ve zbývajících částech nastavíte volání rozhraní API pro Azure OpenAI a Azure AI Search. Získejte koncové body služby, abyste je mohli zadat jako proměnné v kódu.
Přihlaste se k portálu Azure.
Na domovské stránce Přehled zkopírujte adresu URL. Příkladem koncového bodu může být
https://example.search.windows.net
.Vyhledejte službu Azure OpenAI.
Na domovské stránce Přehled vyberte odkaz pro zobrazení koncových bodů. Zkopírujte adresu URL. Příkladem koncového bodu může být
https://example.openai.azure.com/
.
Vytvoříte virtuální prostředí.
V tomto kroku přepněte zpět do místního systému a editoru Visual Studio Code. Doporučujeme vytvořit virtuální prostředí, abyste mohli nainstalovat závislosti izolovaně.
V editoru Visual Studio Code otevřete složku obsahující quickstart-RAG.ipynb.
Stisknutím kombinace kláves Ctrl-shift-P otevřete paletu příkazů, vyhledejte Python: Vytvořit prostředí a pak vyberte
Venv
, že chcete vytvořit virtuální prostředí v aktuálním pracovním prostoru.Pro závislosti vyberte Quickstart-RAG\requirements.txt.
Vytvoření prostředí trvá několik minut. Až bude prostředí připravené, pokračujte dalším krokem.
Přihlášení k Azure
Pro připojení používáte ID Microsoft Entra a přiřazení rolí. Ujistěte se, že jste přihlášeni ke stejnému tenantovi a předplatnému jako Azure AI Search a Azure OpenAI. Pomocí Azure CLI na příkazovém řádku můžete zobrazit aktuální vlastnosti, změnit vlastnosti a přihlásit se. Další informace najdete v tématu Připojení bez klíčů.
Postupně spusťte každý z následujících příkazů.
az account show
az account set --subscription <PUT YOUR SUBSCRIPTION ID HERE>
az login --tenant <PUT YOUR TENANT ID HERE>
Teď byste se měli přihlásit k Azure z místního zařízení.
Nastavení dotazu a vlákna chatu
Tato část používá Visual Studio Code a Python k volání rozhraní API pro dokončování chatu v Azure OpenAI.
Spusťte Visual Studio Code a otevřete soubor .ipynb nebo vytvořte nový soubor Pythonu.
Nainstalujte následující balíčky Pythonu.
! pip install azure-search-documents==11.6.0b5 --quiet ! pip install azure-identity==1.16.1 --quiet ! pip install openai --quiet ! pip install aiohttp --quiet ! pip install ipykernel --quiet
Nastavte následující proměnné a nahraďte zástupné symboly koncovými body, které jste shromáždili v předchozím kroku.
AZURE_SEARCH_SERVICE: str = "PUT YOUR SEARCH SERVICE ENDPOINT HERE" AZURE_OPENAI_ACCOUNT: str = "PUT YOUR AZURE OPENAI ENDPOINT HERE" AZURE_DEPLOYMENT_MODEL: str = "gpt-4o"
Nastavte klienty, výzvu, dotaz a odpověď.
V případě cloudu Azure Government upravte koncový bod rozhraní API poskytovatele tokenu na
"https://cognitiveservices.azure.us/.default"
.# Set up the query for generating responses from azure.identity import DefaultAzureCredential from azure.identity import get_bearer_token_provider from azure.search.documents import SearchClient from openai import AzureOpenAI credential = DefaultAzureCredential() token_provider = get_bearer_token_provider(credential, "https://cognitiveservices.azure.com/.default") openai_client = AzureOpenAI( api_version="2024-06-01", azure_endpoint=AZURE_OPENAI_ACCOUNT, azure_ad_token_provider=token_provider ) search_client = SearchClient( endpoint=AZURE_SEARCH_SERVICE, index_name="hotels-sample-index", credential=credential ) # This prompt provides instructions to the model GROUNDED_PROMPT=""" You are a friendly assistant that recommends hotels based on activities and amenities. Answer the query using only the sources provided below in a friendly and concise bulleted manner. Answer ONLY with the facts listed in the list of sources below. If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. Query: {query} Sources:\n{sources} """ # Query is the question being asked. It's sent to the search engine and the chat model query="Can you recommend a few hotels with complimentary breakfast?" # Search results are created by the search client # Search results are composed of the top 5 results and the fields selected from the search index # Search results include the top 5 matches to your query search_results = search_client.search( search_text=query, top=5, select="Description,HotelName,Tags" ) sources_formatted = "\n".join([f'{document["HotelName"]}:{document["Description"]}:{document["Tags"]}' for document in search_results]) # Send the search results and the query to the LLM to generate a response based on the prompt. response = openai_client.chat.completions.create( messages=[ { "role": "user", "content": GROUNDED_PROMPT.format(query=query, sources=sources_formatted) } ], model=AZURE_DEPLOYMENT_MODEL ) # Here is the response from the chat model. print(response.choices[0].message.content)
Výstup je z Azure OpenAI a skládá se z doporučení pro několik hotelů. Tady je příklad, jak může výstup vypadat:
Sure! Here are a few hotels that offer complimentary breakfast: - **Head Wind Resort** - Complimentary continental breakfast in the lobby - Free Wi-Fi throughout the hotel - **Double Sanctuary Resort** - Continental breakfast included - **White Mountain Lodge & Suites** - Continental breakfast available - **Swan Bird Lake Inn** - Continental-style breakfast each morning with a variety of food and drinks such as caramel cinnamon rolls, coffee, orange juice, milk, cereal, instant oatmeal, bagels, and muffins
Pokud se zobrazí chybová zpráva Zakázáno , zkontrolujte konfiguraci služby Azure AI Search a ujistěte se, že je povolený přístup na základě role.
Pokud se zobrazí chybová zpráva o neúspěšné autorizaci, počkejte několik minut a zkuste to znovu. Může trvat několik minut, než se přiřazení rolí zprovozní.
Pokud se zobrazí chybová zpráva o nenalezení prostředku, zkontrolujte identifikátory URI prostředků a ujistěte se, že je verze rozhraní API v chatovacím modelu platná.
Pokud chcete experimentovat dál, změňte dotaz a spusťte poslední krok, abyste lépe pochopili, jak model funguje se základními daty.
Můžete také upravit výzvu ke změně tónu nebo struktury výstupu.
Dotaz můžete také vyzkoušet bez sémantického řazení nastavením
use_semantic_reranker=False
v kroku parametrů dotazu. Sémantické řazení nemůže výrazně zlepšit význam výsledků dotazu a schopnost LLM vracet užitečné informace. Experimentování vám může pomoct při rozhodování, jestli se to pro váš obsah liší.
Odeslání složitého dotazu RAG
Azure AI Search podporuje složité typy pro vnořené struktury JSON. V indexu hotels-sample-je příkladem komplexního typu, Address
který Address.StreetAddress
se skládá z , , Address.City
, Address.StateProvince
Address.PostalCode
a Address.Country
. Index má také složitou kolekci Rooms
pro každý hotel.
Pokud má index složité typy, dotaz může tato pole poskytnout, pokud nejprve převedete výstup výsledků hledání na JSON a pak předáte JSON do chatovacího modelu. Následující příklad přidá do požadavku komplexní typy. Pokyny k formátování obsahují specifikaci JSON.
import json
# Query is the question being asked. It's sent to the search engine and the LLM.
query="Can you recommend a few hotels that offer complimentary breakfast?
Tell me their description, address, tags, and the rate for one room that sleeps 4 people."
# Set up the search results and the chat thread.
# Retrieve the selected fields from the search index related to the question.
selected_fields = ["HotelName","Description","Address","Rooms","Tags"]
search_results = search_client.search(
search_text=query,
top=5,
select=selected_fields,
query_type="semantic"
)
sources_filtered = [{field: result[field] for field in selected_fields} for result in search_results]
sources_formatted = "\n".join([json.dumps(source) for source in sources_filtered])
response = openai_client.chat.completions.create(
messages=[
{
"role": "user",
"content": GROUNDED_PROMPT.format(query=query, sources=sources_formatted)
}
],
model=AZURE_DEPLOYMENT_MODEL
)
print(response.choices[0].message.content)
Výstup je z Azure OpenAI a přidává obsah ze složitých typů.
Here are a few hotels that offer complimentary breakfast and have rooms that sleep 4 people:
1. **Head Wind Resort**
- **Description:** The best of old town hospitality combined with views of the river and
cool breezes off the prairie. Enjoy a complimentary continental breakfast in the lobby,
and free Wi-Fi throughout the hotel.
- **Address:** 7633 E 63rd Pl, Tulsa, OK 74133, USA
- **Tags:** Coffee in lobby, free Wi-Fi, view
- **Room for 4:** Suite, 2 Queen Beds (Amenities) - $254.99
2. **Double Sanctuary Resort**
- **Description:** 5-star Luxury Hotel - Biggest Rooms in the city. #1 Hotel in the area
listed by Traveler magazine. Free WiFi, Flexible check in/out, Fitness Center & espresso
in room. Offers continental breakfast.
- **Address:** 2211 Elliott Ave, Seattle, WA 98121, USA
- **Tags:** View, pool, restaurant, bar, continental breakfast
- **Room for 4:** Suite, 2 Queen Beds (Amenities) - $254.99
3. **Swan Bird Lake Inn**
- **Description:** Continental-style breakfast featuring a variety of food and drinks.
Locally made caramel cinnamon rolls are a favorite.
- **Address:** 1 Memorial Dr, Cambridge, MA 02142, USA
- **Tags:** Continental breakfast, free Wi-Fi, 24-hour front desk service
- **Room for 4:** Budget Room, 2 Queen Beds (City View) - $85.99
4. **Gastronomic Landscape Hotel**
- **Description:** Known for its culinary excellence under the management of William Dough,
offers continental breakfast.
- **Address:** 3393 Peachtree Rd, Atlanta, GA 30326, USA
- **Tags:** Restaurant, bar, continental breakfast
- **Room for 4:** Budget Room, 2 Queen Beds (Amenities) - $66.99
...
- **Tags:** Pool, continental breakfast, free parking
- **Room for 4:** Budget Room, 2 Queen Beds (Amenities) - $60.99
Enjoy your stay! Let me know if you need any more information.
Chyby při řešení problémů
Pokud chcete ladit chyby ověřování, vložte následující kód před krok, který volá vyhledávací modul a LLM.
import sys
import logging # Set the logging level for all azure-storage-* libraries
logger = logging.getLogger('azure.identity')
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler(stream=sys.stdout)
formatter = logging.Formatter('[%(levelname)s %(name)s] %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
Znovu spusťte skript dotazu. Ve výstupu byste teď měli získat příkazy INFO a DEBUG, které poskytují podrobnější informace o problému.
Pokud se zobrazí výstupní zprávy související se selháním získání spravované identityCredential a tokenu, může to být to, že máte více tenantů a vaše přihlášení k Azure používá tenanta, který nemá vaši vyhledávací službu. Pokud chcete získat ID tenanta, vyhledejte na webu Azure Portal "vlastnosti tenanta" nebo spusťte az login tenant list
.
Jakmile budete mít ID tenanta, spusťte az login --tenant <YOUR-TENANT-ID>
ho na příkazovém řádku a spusťte skript znovu.
Vyčištění
Pokud pracujete s vlastním předplatným, je vhodné vždy na konci projektu zkontrolovat, jestli budete vytvořené prostředky ještě potřebovat. Prostředky, které necháte spuštěné, vás stojí peníze. Prostředky můžete odstraňovat jednotlivě nebo můžete odstranit skupinu prostředků, a odstranit tak celou sadu prostředků najednou.
Prostředky můžete najít a spravovat na webu Azure Portal pomocí odkazu Všechny prostředky nebo skupiny prostředků v levém podokně.