Hızlı Başlangıç: Azure AI Search'ten veri topraklama ile oluşturmalı arama (RAG)
Bu hızlı başlangıçta, Azure AI Search'te dizine alınan içeriğiniz üzerinden konuşma arama deneyimi için Büyük Dil Modeli'ne (LLM) temel ve karmaşık sorgular gönderme işlemi gösterilmektedir. Kaynakları ayarlamak için Azure portalını kullanır ve ardından API'leri çağırmak için Python kodunu çalıştırırsınız.
Önkoşullar
Azure aboneliği. Ücretsiz bir tane oluşturun.
Anlam derecesini etkinleştirebilmeniz için Azure AI Search, Temel katman veya üzeri. Bölge, Azure OpenAI için kullanılan bölgeyle aynı olmalıdır.
Azure AI Search ile aynı bölgede ,
gpt-4o-mini
veya eşdeğer LLM dağıtımınagpt-4o
sahip Azure OpenAI kaynağı.Python uzantısı ve Jupyter paketi ile Visual Studio Code. Daha fazla bilgi için bkz . Visual Studio Code'da Python.
Dosya indirme
Bu hızlı başlangıçta istekleri göndermek için GitHub'dan bir Jupyter not defteri indirin. Daha fazla bilgi için bkz . GitHub'dan dosya indirme.
Ayrıca, bu makaledeki yönergeleri kullanarak yerel sisteminizde yeni bir dosya başlatabilir ve istekleri el ile oluşturabilirsiniz.
Erişimi yapılandırma
Arama uç noktasına yönelik isteklerin kimliği doğrulanmış ve yetkilendirilmiş olmalıdır. Bu görev için API anahtarlarını veya rollerini kullanabilirsiniz. Anahtarları kullanmaya başlamak daha kolaydır, ancak roller daha güvenlidir. Bu hızlı başlangıçta roller varsayılır.
İki istemci ayarladığınızdan her iki kaynakta da izinlere ihtiyacınız vardır.
Azure AI Search sorgu isteğini yerel sisteminizden alıyor. Bu görev için kendinize Arama Dizini Veri Okuyucusu rol atamasını atayın. Ayrıca otel örnek dizinini oluşturup yüklüyorsanız Arama Hizmeti Katkıda Bulunanı ve Arama Dizini Veri Katkıda Bulunanı rollerini de ekleyin.
Azure OpenAI, yerel sisteminizden "Birkaç otel önerebilir misiniz" (sorgusunu) ve arama hizmetinden arama sonuçlarını (kaynak) alıyor. Kendinizi ve arama hizmetini Bilişsel Hizmetler OpenAI Kullanıcı rolüne atayın.
Azure Portal’ında oturum açın.
Azure AI Arama'yı sistem tarafından atanan yönetilen kimliği kullanacak şekilde yapılandırın; böylece rol atamaları verebilirsiniz:
Azure portalında arama hizmetinizi bulun.
Soldaki menüde Ayarlar>Kimliği'ni seçin.
Sistem tarafından atanan sekmesinde durumu Açık olarak ayarlayın.
Rol tabanlı erişim için Azure AI Arama'yı yapılandırın:
Azure portalında Azure yapay zeka Arama hizmeti bulun.
Sol menüde Ayarlar>Anahtarları'nı ve ardından Rol tabanlı erişim denetimi veya Her İkisi'ni seçin.
Rol atama:
Sol menüde Erişim denetimi (IAM) öğesini seçin.
Azure AI Search'te arama dizini oluşturma, yükleme ve sorgulama izinlerinizin olduğundan emin olun:
- Arama Dizini Veri Okuyucusu
- Arama Dizini Veri Katkıda Bulunanı
- Arama Hizmeti Katkıda Bulunanı
Azure OpenAI'de, kendinizi ve Azure OpenAI'de arama hizmeti kimlik izinlerini atamak için Erişim denetimi (IAM) seçeneğini belirleyin. Bu hızlı başlangıcın kodu yerel olarak çalışır. Azure OpenAI istekleri sisteminizden kaynaklanır. Ayrıca, arama altyapısındaki arama sonuçları Azure OpenAI'ye geçirilir. Bu nedenlerden dolayı hem sizin hem de arama hizmetinin Azure OpenAI üzerinde izinlere sahip olması gerekir.
- Bilişsel Hizmetler OpenAI Kullanıcısı
İzinlerin geçerlilik kazanması birkaç dakika sürebilir.
Dizin oluşturma
Dakikalar içinde oluşturulabilen ve herhangi bir arama hizmeti katmanında çalıştırılan hotels-sample-index'i öneririz. Bu dizin, yerleşik örnek veriler kullanılarak oluşturulur.
Azure portalında arama hizmetinizi bulun.
Sihirbazı başlatmak için Genel Bakış giriş sayfasında Verileri içeri aktar'ı seçin.
Verilerinize bağlan sayfasında, açılan listeden Örnekler'i seçin.
Hotels-sample öğesini seçin.
Varsayılan değerleri kabul ederek kalan sayfalarda İleri'yi seçin.
Dizin oluşturulduktan sonra soldaki menüden Arama yönetimi>Dizinleri'ni seçerek dizini açın.
JSON Düzenle'yi seçin.
Dizinde anlamsal yapılandırma bölümünü bulmak için "semantik" araması yapın. Boş
"semantic": {}
satırı aşağıdaki anlamsal yapılandırmayla değiştirin. Bu örnek, bu hızlı başlangıcın çalıştırılması için önemli olan bir"defaultConfiguration"
belirtir."semantic":{ "defaultConfiguration":"semantic-config", "configurations":[ { "name":"semantic-config", "prioritizedFields":{ "titleField":{ "fieldName":"HotelName" }, "prioritizedContentFields":[ { "fieldName":"Description" } ], "prioritizedKeywordsFields":[ { "fieldName":"Category" }, { "fieldName":"Tags" } ] } } ] },
Değişikliklerinizi kaydedin.
Dizininizi test etmek için Arama Gezgini'nde aşağıdaki sorguyu çalıştırın:
complimentary breakfast
.Çıktı aşağıdaki örneğe benzer görünmelidir. Doğrudan arama altyapısından döndürülen sonuçlar, alanlar ve bunların ayrıntılı değerlerinin yanı sıra anlam derecesini kullanırsanız arama puanı ve anlam derecelendirme puanı ve resim yazısı gibi meta verilerden oluşur. Yalnızca HotelName, Description ve Tags alanlarını döndürmek için select deyimini kullandık.
{ "@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" ] }, . . . ]}
Hizmet uç noktalarını alma
Kalan bölümlerde Azure OpenAI ve Azure AI Search'e API çağrıları ayarlarsınız. Kodunuzda değişken olarak sağlayabilmeniz için hizmet uç noktalarını alın.
Azure Portal’ında oturum açın.
Arama hizmetinizi bulun.
Genel Bakış giriş sayfasında URL'yi kopyalayın. Örnek uç nokta
https://example.search.windows.net
şeklinde görünebilir.Azure OpenAI hizmetinizi bulun.
Genel Bakış giriş sayfasında uç noktaları görüntülemek için bağlantıyı seçin. URL'yi kopyalayın. Örnek uç nokta
https://example.openai.azure.com/
şeklinde görünebilir.
Sorguyu ve sohbet yazışmasını ayarlama
Bu bölümde, Azure OpenAI üzerinde sohbet tamamlama API'lerini çağırmak için Visual Studio Code ve Python kullanılmaktadır.
Visual Studio Code'u başlatın ve .ipynb dosyasını açın veya yeni bir Python dosyası oluşturun.
Aşağıdaki Python paketlerini yükleyin.
! 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
Önceki adımda topladığınız uç noktaların yerine yer tutucular koyarak aşağıdaki değişkenleri ayarlayın.
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"
İstemcileri, istemi, sorguyu ve yanıtı ayarlayın.
# 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)
Çıktı Azure OpenAI'den alınıyor ve birkaç otel için önerilerden oluşuyor. Çıktının nasıl görünebileceğine ilişkin bir örnek aşağıda verilmişti:
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
Yasak hata iletisi alırsanız rol tabanlı erişimin etkinleştirildiğinden emin olmak için Azure AI Search yapılandırmasını denetleyin.
Yetkilendirme başarısız oldu hata iletisi alırsanız, birkaç dakika bekleyin ve yeniden deneyin. Rol atamalarının çalışır duruma gelmesi birkaç dakika sürebilir.
Aksi takdirde, daha fazla deneme yapmak için sorguyu değiştirin ve modelin topraklama verileriyle nasıl çalıştığını daha iyi anlamak için son adımı yeniden çalıştırın.
Çıkışın tonunu veya yapısını değiştirmek için istemi de değiştirebilirsiniz.
Sorgu parametreleri adımında ayar yaparak
use_semantic_reranker=False
semantik derecelendirme olmadan sorguyu da deneyebilirsiniz. Anlamsal derecelendirme, sorgu sonuçlarının ilgi düzeyini ve LLM'nin yararlı bilgiler döndürme becerisini önemli ölçüde geliştirebilir. Denemeler, içeriğiniz için fark yaratıp oluşturmadığına karar vermenize yardımcı olabilir.
Karmaşık bir RAG sorgusu gönderme
Azure AI Search iç içe JSON yapıları için karmaşık türleri destekler. hotels-sample-index içinde , Address
, , Address.StateProvince
Address.PostalCode
ve Address.Country
'lerden Address.StreetAddress
Address.City
oluşan karmaşık bir tür örneğidir. Dizinde ayrıca her otel için karmaşık koleksiyonu Rooms
vardır.
Dizininizde karmaşık türler varsa, arama sonuçları çıkışını önce JSON'a dönüştürdüğünüzde ve ardından JSON'yi LLM'ye geçirirseniz sorgunuz bu alanları sağlayabilir. Aşağıdaki örnek isteğe karmaşık türler ekler. Biçimlendirme yönergeleri bir JSON belirtimi içerir.
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)
Çıktı Azure OpenAI'den alınıyor ve karmaşık türlerden içerik ekliyor.
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.
Hataları giderme
Kimlik doğrulama hatalarını ayıklamak için, arama altyapısını ve LLM'yi çağıran adımdan önce aşağıdaki kodu ekleyin.
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)
Sorgu betiğini yeniden çalıştırın. Şimdi çıkışta sorunla ilgili daha fazla ayrıntı sağlayan BİlGİ ve HATA AYıKLAMA deyimlerini almanız gerekir.
ManagedIdentityCredential ve belirteç alma hatalarıyla ilgili çıkış iletileri görüyorsanız, birden çok kiracınız olabilir ve Azure oturum açma işleminizde arama hizmetiniz olmayan bir kiracı kullanılıyor olabilir. Kiracı kimliğinizi almak için Azure portalında "kiracı özellikleri" araması yapın veya komutunu çalıştırın az login tenant list
.
Kiracı kimliğinizi aldıktan sonra komut isteminde komutunu çalıştırın az login --tenant <YOUR-TENANT-ID>
ve ardından betiği yeniden çalıştırın.
Temizleme
Kendi aboneliğinizde çalışırken, projenin sonunda oluşturduğunuz kaynaklara hala ihtiyacınız olup olmadığını belirlemek iyi bir fikirdir. Çalışır durumda bırakılan kaynaklar maliyetlerin artmasına neden olabilir. Kaynakları teker teker silebilir veya tüm kaynak grubunu silerek kaynak kümesinin tamamını kaldırabilirsiniz.
En soldaki bölmedeki Tüm kaynaklar veya Kaynak grupları bağlantısını kullanarak portaldaki kaynakları bulabilir ve yönetebilirsiniz.