Snabbstart: Generativ sökning (RAG) med grunddata från Azure AI Search
Den här snabbstarten visar hur du skickar frågor till en modell för att slutföra chatten för en konversationssökningsupplevelse över ditt indexerade innehåll i Azure AI Search. Du använder Azure Portal för att konfigurera resurserna och kör sedan Python-kod för att anropa API:erna.
Förutsättningar
Visual Studio Code med Python-tilläggetoch Jupyter-paketet. Mer information finns i Python i Visual Studio Code.
En Azure-prenumeration med behörighet att tilldela roller. Skapa en kostnadsfritt.
-
- Välj en region som stöder den modell för chattavslut som du vill använda (gpt-4o, gpt-4o-mini eller motsvarande modell).
- Distribuera modellen för chattens slutförande i Azure AI Foundry eller använd en annan metod.
-
- Samma region som Azure OpenAI.
- Grundläggande nivå eller högre rekommenderas.
- Aktivera semantisk rangordning.
- Aktivera rollbaserad åtkomstkontroll (se nedan).
Om du vill uppfylla kravet för samma region börjar du med att granska regionerna för den chattmodell som du vill använda. När du har identifierat en region bekräftar du att Azure AI Search är tillgängligt i samma region.
Kontrollera att du känner till namnet på den distribuerade modellen och har slutpunkterna för båda Azure-resurserna till hands. Du anger den här informationen i de steg som följer.
Ladda ned fil
Ladda ned en Jupyter-anteckningsbok från GitHub för att skicka begäranden i den här snabbstarten. Mer information finns i Ladda ned filer från GitHub.
Du kan också starta en ny fil i det lokala systemet och skapa begäranden manuellt med hjälp av anvisningarna i den här artikeln.
Konfigurera åtkomst
Begäranden till sökslutpunkten måste autentiseras och auktoriseras. Du kan använda API-nycklar eller roller för den här uppgiften. Nycklar är enklare att börja med, men rollerna är säkrare. Den här snabbstarten förutsätter roller.
Du konfigurerar två klienter, så du behöver behörigheter för båda resurserna.
Azure AI Search tar emot frågebegäran från ditt lokala system. Tilldela dig själv rolltilldelningen Search Index Data Reader om hotellexempelindexet redan finns. Om den inte finns tilldelar du själv rollerna Search Service-deltagare och Search Index Data Contributor så att du kan skapa och köra frågor mot indexet.
Azure OpenAI tar emot frågan och sökresultaten från ditt lokala system. Tilldela dig själv rollen Cognitive Services OpenAI-användare i Azure OpenAI.
Logga in på Azure-portalen.
Konfigurera Azure AI Search för rollbaserad åtkomst:
I Azure Portal hittar du din Azure AI-tjänsten Search.
På den vänstra menyn väljer du Inställningar>Nycklar och väljer sedan antingen Rollbaserad åtkomstkontroll eller Båda.
Tilldela roller:
Välj Åtkomstkontroll (IAM) på den vänstra menyn.
I Azure AI Search väljer du de här rollerna för att skapa, läsa in och köra frågor mot ett sökindex och tilldela dem sedan till din Användaridentitet för Microsoft Entra-ID:
- Search Index Data Contributor
- Söktjänstdeltagare
I Azure OpenAI väljer du Åtkomstkontroll (IAM) för att tilldela den här rollen till dig själv i Azure OpenAI:
- Cognitive Services OpenAI-användare
Det kan ta flera minuter innan behörigheterna börjar gälla.
Skapa ett index
Ett sökindex tillhandahåller grunddata för chattmodellen. Vi rekommenderar hotels-sample-index, som kan skapas på några minuter och körs på valfri söktjänstnivå. Det här indexet skapas med hjälp av inbyggda exempeldata.
Leta reda på söktjänsten i Azure Portal.
På startsidan Översikt väljer du Importera data för att starta guiden.
På sidan Anslut till dina data väljer du Exempel i listrutan.
Välj hotellexemplet.
Välj Nästa via de återstående sidorna och acceptera standardvärdena.
När indexet har skapats väljer du Sökhanteringsindex> på den vänstra menyn för att öppna indexet.
Välj Redigera JSON.
Rulla till slutet av indexet, där du hittar platshållare för konstruktioner som kan läggas till i ett index.
"analyzers": [], "tokenizers": [], "tokenFilters": [], "charFilters": [], "normalizers": [],
På en ny rad efter "normalizers" klistrar du in följande semantiska konfiguration. Det här exemplet anger en
"defaultConfiguration"
, vilket är viktigt för körningen av den här snabbstarten."semantic":{ "defaultConfiguration":"semantic-config", "configurations":[ { "name":"semantic-config", "prioritizedFields":{ "titleField":{ "fieldName":"HotelName" }, "prioritizedContentFields":[ { "fieldName":"Description" } ], "prioritizedKeywordsFields":[ { "fieldName":"Category" }, { "fieldName":"Tags" } ] } } ] },
Spara dina ändringar.
Kör följande fråga i Search Explorer för att testa ditt index:
complimentary breakfast
.Utdata bör se ut ungefär som i följande exempel. Resultat som returneras direkt från sökmotorn består av fält och deras ordagranna värden, tillsammans med metadata som en sökpoäng och en semantisk rangordningspoäng och bildtext om du använder semantisk rankning. Vi använde en select-instruktion för att bara returnera fälten HotelName, Description och 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" ] }, . . . ]}
Hämta tjänstslutpunkter
I de återstående avsnitten konfigurerar du API-anrop till Azure OpenAI och Azure AI Search. Hämta tjänstslutpunkterna så att du kan ange dem som variabler i koden.
Logga in på Azure-portalen.
På startsidan Översikt kopierar du URL:en. Här följer ett exempel på hur en slutpunkt kan se ut:
https://example.search.windows.net
.På startsidan Översikt väljer du länken för att visa slutpunkterna. Kopiera URL. Här följer ett exempel på hur en slutpunkt kan se ut:
https://example.openai.azure.com/
.
Skapa en virtuell miljö
I det här steget växlar du tillbaka till ditt lokala system och Visual Studio Code. Vi rekommenderar att du skapar en virtuell miljö så att du kan installera beroendena isolerat.
Öppna mappen som innehåller Quickstart-RAG.ipynb i Visual Studio Code.
Tryck på Ctrl-shift-P för att öppna kommandopaletten, sök efter "Python: Skapa miljö" och välj
Venv
sedan för att skapa en virtuell miljö på den aktuella arbetsytan.Välj Snabbstart-RAG\requirements.txt för beroendena.
Det tar flera minuter att skapa miljön. När miljön är klar fortsätter du till nästa steg.
Logga in på Azure
Du använder Microsoft Entra-ID och rolltilldelningar för anslutningen. Kontrollera att du är inloggad på samma klientorganisation och prenumeration som Azure AI Search och Azure OpenAI. Du kan använda Azure CLI på kommandoraden för att visa aktuella egenskaper, ändra egenskaper och logga in. Mer information finns i Ansluta utan nycklar.
Kör vart och ett av följande kommandon i följd.
az account show
az account set --subscription <PUT YOUR SUBSCRIPTION ID HERE>
az login --tenant <PUT YOUR TENANT ID HERE>
Du bör nu vara inloggad på Azure från din lokala enhet.
Konfigurera frågan och chatttråden
Det här avsnittet använder Visual Studio Code och Python för att anropa API:erna för chattens slutförande i Azure OpenAI.
Starta Visual Studio Code och öppna .ipynb-filen eller skapa en ny Python-fil.
Installera följande Python-paket.
! 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
Ange följande variabler och ersätt platshållarna med slutpunkterna som du samlade in i föregående steg.
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"
Konfigurera klienter, prompten, frågan och svaret.
För Azure Government-molnet ändrar du API-slutpunkten på tokenprovidern till
"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)
Utdata kommer från Azure OpenAI och består av rekommendationer för flera hotell. Här är ett exempel på hur utdata kan se ut:
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
Om du får ett felmeddelande om förbjudet kontrollerar du azure AI Search-konfigurationen för att se till att rollbaserad åtkomst är aktiverad.
Om du får felmeddelandet Auktorisering misslyckades väntar du några minuter och försöker igen. Det kan ta flera minuter innan rolltilldelningar tas i drift.
Om du får felmeddelandet Resurs hittades inte kontrollerar du resurs-URI:erna och kontrollerar att API-versionen för chattmodellen är giltig.
Annars kan du experimentera ytterligare genom att ändra frågan och köra det sista steget igen för att bättre förstå hur modellen fungerar med grunddata.
Du kan också ändra kommandotolken för att ändra tonen eller strukturen för utdata.
Du kan också prova frågan utan semantisk rangordning genom att ange
use_semantic_reranker=False
i steget frågeparametrar. Semantisk rangordning kan märkbart förbättra relevansen av frågeresultat och LLM:s förmåga att returnera användbar information. Experimentering kan hjälpa dig att avgöra om det gör skillnad för ditt innehåll.
Skicka en komplex RAG-fråga
Azure AI Search stöder komplexa typer för kapslade JSON-strukturer. I hotels-sample-index Address
är ett exempel på en komplex typ som består av Address.StreetAddress
, Address.City
, Address.StateProvince
, Address.PostalCode
och Address.Country
. Indexet har också en komplex samling av Rooms
för varje hotell.
Om ditt index har komplexa typer kan frågan ange dessa fält om du först konverterar sökresultatutdata till JSON och sedan skickar JSON till chattmodellen. I följande exempel läggs komplexa typer till i begäran. Formateringsinstruktionerna innehåller en JSON-specifikation.
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)
Utdata kommer från Azure OpenAI och lägger till innehåll från komplexa typer.
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.
Felsökningsfel
Om du vill felsöka autentiseringsfel infogar du följande kod före steget som anropar sökmotorn och 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)
Kör frågeskriptet igen. Nu bör du få INFO- och DEBUG-instruktioner i utdata som ger mer information om problemet.
Om du ser utdatameddelanden relaterade till managedIdentityCredential- och tokeninsamlingsfel kan det bero på att du har flera klienter och att din Azure-inloggning använder en klientorganisation som inte har söktjänsten. Om du vill hämta ditt klientorganisations-ID söker du i Azure Portal efter "klientegenskaper" eller kör az login tenant list
.
När du har ditt klient-ID kör az login --tenant <YOUR-TENANT-ID>
du i en kommandotolk och kör sedan skriptet igen.
Rensa
När du arbetar i din egen prenumeration kan det dock vara klokt att i slutet av ett projekt kontrollera om du fortfarande behöver de resurser som du skapade. Resurser som fortsätter att köras kostar pengar. Du kan ta bort enstaka resurser eller hela resursgruppen om du vill ta bort alla resurser.
Du kan hitta och hantera resurser i Azure Portal med hjälp av länken Alla resurser eller Resursgrupper i den vänstra rutan.