Snabbstart: Generativ sökning (RAG) med grunddata från Azure AI Search
Den här snabbstarten visar hur du skickar grundläggande och komplexa frågor till en stor språkmodell (LLM) för en konversationssökning ö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
En Azure-prenumeration. Skapa en kostnadsfritt.
Azure AI Search, Basic-nivå eller högre så att du kan aktivera semantisk rankning. Regionen måste vara samma som används för Azure OpenAI.
Azure OpenAI-resurs med en distribution av
gpt-4o
,gpt-4o-mini
eller motsvarande LLM, i samma region som Azure AI Search.Visual Studio Code med Python-tillägget och Jupyter-paketet. Mer information finns i Python i Visual Studio Code.
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 för den uppgiften. Om du också skapar och läser in hotellexempelindexet lägger du även till roller som Söktjänstdeltagare och Datadeltagare för sökindex.
Azure OpenAI tar emot (frågan) "Kan du rekommendera några hotell" från ditt lokala system, plus att det tar emot sökresultaten (källan) från söktjänsten. Tilldela dig själv och söktjänsten rollen Cognitive Services OpenAI-användare .
Logga in på Azure-portalen.
Konfigurera Azure AI Search för att använda en systemtilldelad hanterad identitet så att du kan ge den rolltilldelningar:
Leta reda på söktjänsten i Azure Portal.
På den vänstra menyn väljer du Inställningar>Identitet.
På fliken Systemtilldelat anger du status till På.
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 kontrollerar du att du har behörighet att skapa, läsa in och köra frågor mot ett sökindex:
- Dataläsare för sökindex
- Search Index Data Contributor
- Söktjänstdeltagare
I Azure OpenAI väljer du Åtkomstkontroll (IAM) för att tilldela dig själv och identitetsbehörigheterna för söktjänsten i Azure OpenAI. Koden för den här snabbstarten körs lokalt. Begäranden till Azure OpenAI kommer från systemet. Dessutom skickas sökresultat från sökmotorn till Azure OpenAI. Därför behöver både du och söktjänsten behörigheter för Azure OpenAI.
- Cognitive Services OpenAI-användare
Det kan ta flera minuter innan behörigheterna börjar gälla.
Skapa ett index
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.
Sök efter "semantisk" för att hitta avsnittet i indexet efter en semantisk konfiguration. Ersätt den tomma
"semantic": {}
raden med 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/
.
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.
# 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 LLM. query="Can you recommend a few hotels with complimentary breakfast?" # Set up the search results and the chat thread. # Retrieve the selected fields from the search index related to the question. 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]) 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 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.
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ökresultatets utdata till JSON och sedan skickar JSON till LLM. 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 portalen med hjälp av länken Alla resurser eller Resursgrupper i det vänstra fönstret.