Поделиться через


Краткое руководство. Создание поиска (RAG) с базированием данных из поиска ИИ Azure

В этом кратком руководстве показано, как отправлять базовые и сложные запросы в модель большого языка (LLM) для взаимодействия с диалогом по индексируемой содержимой в службе "Поиск ИИ Azure". Вы используете портал Azure для настройки ресурсов, а затем запустите код Python для вызова API.

Необходимые компоненты

Загрузить файл

Скачайте записную книжку Jupyter из GitHub, чтобы отправить запросы в этом кратком руководстве. Дополнительные сведения см. в статье "Скачивание файлов с GitHub".

Вы также можете запустить новый файл в локальной системе и вручную создать запросы, выполнив инструкции в этой статье.

Настройка доступа

Запросы к конечной точке поиска должны проходить проверку подлинности и авторизованы. Для этой задачи можно использовать ключи ИЛИ роли API. Ключи проще начать с, но роли более безопасны. В этом кратком руководстве предполагается, что роли.

Вы настраиваете два клиента, поэтому вам нужны разрешения для обоих ресурсов.

Поиск по искусственному интеллекту Azure получает запрос из локальной системы. Назначьте себе назначение роли чтения данных индекса поиска для этой задачи. Если вы также создаете и загружаете пример индекса отеля, добавьте участника службы поиска и роли участника индекса поиска.

Azure OpenAI получает (запрос) "Можно ли рекомендовать несколько отелей" из локальной системы, а также получение результатов поиска (источник) из службы поиска. Назначьте себя и службу поиска роли пользователя OpenAI Cognitive Services.

  1. Войдите на портал Azure.

  2. Настройте поиск azure AI для использования управляемого удостоверения, назначаемого системой, чтобы вы могли предоставить ему назначения ролей:

    1. В портал Azure найдите службу поиска.

    2. В меню слева выберите "Параметры>удостоверения".

    3. На вкладке "Назначаемая системой" установите значение " Вкл.".

  3. Настройка azure AI Search для доступа на основе ролей:

    1. В портал Azure найдите служба ИИ Azure.

    2. В меню слева выберите "Ключи>параметров", а затем выберите управление доступом на основе ролей или оба.

  4. Назначение ролей:

    1. В меню слева выберите элемент управления доступом (IAM).

    2. В службе "Поиск ИИ Azure" убедитесь, что у вас есть разрешения на создание, загрузку и запрос индекса поиска:

      • Читатель данных индекса поиска
      • Участник данных индекса поиска
      • Участник службы поиска
    3. В Azure OpenAI выберите элемент управления доступом (IAM), чтобы назначить себя и разрешения удостоверения службы поиска в Azure OpenAI. Код для этого краткого руководства выполняется локально. Запросы к Azure OpenAI исходят из вашей системы. Кроме того, результаты поиска из поисковой системы передаются в Azure OpenAI. По этим причинам вам и службе поиска требуются разрешения на Azure OpenAI.

      • Пользователь службы OpenAI в Cognitive Services

Для принятия в силу разрешений может потребоваться несколько минут.

Создание индекса

Мы рекомендуем использовать индекс hotels-sample-index, который можно создать в минутах и запустить на любом уровне служб поиска. Этот индекс создается с помощью встроенных примеров данных.

  1. В портал Azure найдите службу поиска.

  2. На домашней странице обзора выберите "Импорт данных", чтобы запустить мастер.

  3. На странице подключения к данным выберите примеры из раскрывающегося списка.

  4. Выберите пример отелей.

  5. Нажмите кнопку "Далее" на оставшихся страницах, принимая значения по умолчанию.

  6. После создания индекса выберите индексы управления>поиском в меню слева, чтобы открыть индекс.

  7. Выберите "Изменить JSON".

  8. Выполните поиск "семантики", чтобы найти раздел в индексе для семантической конфигурации. Замените пустую "semantic": {} строку следующей семантической конфигурацией. В этом примере указывается , "defaultConfiguration"что важно для выполнения этого краткого руководства.

    "semantic":{
       "defaultConfiguration":"semantic-config",
       "configurations":[
          {
             "name":"semantic-config",
             "prioritizedFields":{
                "titleField":{
                   "fieldName":"HotelName"
                },
                "prioritizedContentFields":[
                   {
                      "fieldName":"Description"
                   }
                ],
                "prioritizedKeywordsFields":[
                   {
                      "fieldName":"Category"
                   },
                   {
                      "fieldName":"Tags"
                   }
                ]
             }
          }
       ]
    },
    
  9. Сохраните свои изменения.

  10. Выполните следующий запрос в обозревателе поиска, чтобы проверить индекс: complimentary breakfast

    Выходные данные должны выглядеть примерно так, как показано в следующем примере. Результаты, возвращаемые непосредственно из поисковой системы, состоят из полей и их подробных значений, а также метаданных, таких как оценка поиска и семантическая оценка ранжирования и подпись при использовании семантического ранга. Мы использовали инструкцию select, чтобы вернуть только поля HotelName, Description и 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"
          ]
       },
       . . .
    ]}
    

Получение конечных точек службы

В оставшихся разделах вы настроили вызовы API к Azure OpenAI и поиску ИИ Azure. Получите конечные точки службы, чтобы предоставить их в виде переменных в коде.

  1. Войдите на портал Azure.

  2. Найдите службу поиска.

  3. Скопируйте URL-адрес на домашней странице обзора. Пример конечной точки может выглядеть так: https://example.search.windows.net.

  4. Найдите службу Azure OpenAI.

  5. На домашней странице обзора выберите ссылку для просмотра конечных точек. Скопируйте URL-адрес. Пример конечной точки может выглядеть так: https://example.openai.azure.com/.

Настройка потока запроса и чата

В этом разделе используется Visual Studio Code и Python для вызова API завершения чата в Azure OpenAI.

  1. Запустите Visual Studio Code и откройте IPYNB-файл или создайте новый файл Python.

  2. Установите следующие пакеты Python.

    ! 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
    
  3. Задайте следующие переменные, заменив заполнители конечными точками, собранными на предыдущем шаге.

     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"
    
  4. Настройте клиенты, запрос, запрос и ответ.

    # 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)
    

    Выходные данные из Azure OpenAI состоят из рекомендаций для нескольких отелей. Ниже приведен пример того, как выглядят выходные данные:

    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
    

    Если вы получаете сообщение об ошибке "Запрещено" , проверьте конфигурацию поиска ИИ Azure, чтобы убедиться, что доступ на основе ролей включен.

    Если вы получите сообщение об ошибке авторизации, подождите несколько минут и повторите попытку. Выполнение назначений ролей может занять несколько минут.

    В противном случае для дальнейшего эксперимента измените запрос и выполните последний шаг, чтобы лучше понять, как модель работает с данными о заземления.

    Вы также можете изменить запрос, чтобы изменить тон или структуру выходных данных.

    Вы также можете попробовать запрос без семантического ранжирования, установив на use_semantic_reranker=False шаге параметров запроса. Семантический ранжирование может значительно повысить релевантность результатов запроса и возможность LLM возвращать полезную информацию. Экспериментирование может помочь вам решить, имеет ли это значение для вашего содержимого.

Отправка сложного запроса RAG

Поиск ИИ Azure поддерживает сложные типы для вложенных структур JSON. В индексе hotels-sample-index Address является примером сложного типа, состоящего из Address.StreetAddress, , Address.City, Address.StateProvinceAddress.PostalCodeи Address.Country. Индекс также имеет сложную коллекцию Rooms для каждого отеля.

Если индекс имеет сложные типы, запрос может предоставить эти поля, если сначала преобразовать выходные данные результатов поиска в JSON, а затем передать JSON в LLM. В следующем примере в запрос добавляются сложные типы. Инструкции по форматированию включают спецификацию 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)

Выходные данные из Azure OpenAI и добавляют содержимое из сложных типов.

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.

Устранение ошибок

Чтобы выполнить отладку ошибок проверки подлинности, вставьте следующий код перед шагом, который вызывает поисковую систему и 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)

Повторно запустите скрипт запроса. Теперь вы должны получить инструкции INFO и DEBUG в выходных данных, которые содержат дополнительные сведения о проблеме.

Если вы видите выходные сообщения, связанные с ошибками получения управляемых данных ManagedIdentityCredential и маркерами, возможно, у вас несколько клиентов, и вход Azure использует клиент, который не имеет службы поиска. Чтобы получить идентификатор клиента, выполните поиск портал Azure в поле "Свойства клиента" или выполните командуaz login tenant list.

После получения идентификатора клиента запустите az login --tenant <YOUR-TENANT-ID> в командной строке и повторно запустите скрипт.

Очистка

Если вы работаете в собственной подписке, в конце проекта следует решить, нужны ли вам созданные ресурсы. Ресурсы, которые продолжат работать, могут быть платными. Вы можете удалить ресурсы по отдельности либо удалить всю группу ресурсов.

Вы можете найти ресурсы на портале и управлять ими, используя ссылку "Все ресурсы" или "Группы ресурсов" в левой области.

См. также