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


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

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

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

Чтобы удовлетворить требование одного региона, начните с просмотра регионов для модели чата, которую вы хотите использовать. После идентификации региона убедитесь, что служба "Поиск ИИ Azure" доступна в том же регионе.

Убедитесь, что вы знаете имя развернутой модели и укажите конечные точки для обоих ресурсов Azure. Эти сведения приведены в следующих шагах.

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

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

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

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

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

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

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

Azure OpenAI получает запрос и результаты поиска из локальной системы. Назначьте себе роль пользователя OpenAI в Cognitive Services в Azure OpenAI.

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

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

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

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

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

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

    2. В службе "Поиск ИИ Azure" выберите эти роли для создания, загрузки и запроса индекса поиска, а затем назначьте их идентификатору пользователя Microsoft Entra ID:

      • Участник данных индекса поиска
      • Участник службы поиска
    3. В Azure OpenAI выберите элемент управления доступом (IAM), чтобы назначить эту роль себе в Azure OpenAI:

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

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

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

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

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

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

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

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

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

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

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

  8. Прокрутите страницу до конца индекса, где можно найти заполнители для конструкций, которые можно добавить в индекс.

    "analyzers": [],
    "tokenizers": [],
    "tokenFilters": [],
    "charFilters": [],
    "normalizers": [],
    
  9. В новой строке после "нормализаторов" вставьте следующую семантику конфигурации. В этом примере указывается , "defaultConfiguration"что важно для выполнения этого краткого руководства.

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

  11. Выполните следующий запрос в обозревателе поиска, чтобы проверить индекс: 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. Рекомендуется создать виртуальную среду, чтобы можно было установить зависимости в изоляции.

  1. В Visual Studio Code откройте папку, содержащую quickstart-RAG.ipynb.

  2. Нажмите клавиши CTRL-SHIFT-P, чтобы открыть палитру команд, найдите "Python: Создать среду", а затем выберите Venv , чтобы создать виртуальную среду в текущей рабочей области.

  3. Выберите quickstart-RAG\requirements.txt для зависимостей.

Создание среды занимает несколько минут. Когда среда будет готова, перейдите к следующему шагу.

Вход в Azure

Для подключения используется идентификатор Microsoft Entra и назначения ролей. Убедитесь, что вы вошли в тот же клиент и подписку, что и поиск ИИ Azure и Azure OpenAI. Azure CLI можно использовать в командной строке для отображения текущих свойств, изменения свойств и входа. Дополнительные сведения см. в разделе "Подключение без ключей".

Выполните каждую из следующих команд в последовательности.

az account show

az account set --subscription <PUT YOUR SUBSCRIPTION ID HERE>

az login --tenant <PUT YOUR TENANT ID HERE>

Теперь вы должны войти в Azure с локального устройства.

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

В этом разделе используется 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. Настройте клиенты, запрос, запрос и ответ.

    Для облака Azure для государственных организаций измените конечную точку API в поставщике "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)
    

    Выходные данные из 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, чтобы убедиться, что доступ на основе ролей включен.

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

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

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

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

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

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

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

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

Очистка

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

Ресурсы и управление ими можно найти в портал Azure с помощью ссылки "Все ресурсы" или "Группы ресурсов" в левой области.

См. также