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


Создание и использование индекса с помощью кода

Внимание

Элементы, обозначенные в этой статье как (предварительная версия), сейчас предлагаются в общедоступной предварительной версии. Эта предварительная версия предоставляется без соглашения об уровне обслуживания, и мы не рекомендуем ее для рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Дополнительные сведения см. в статье Дополнительные условия использования Предварительных версий Microsoft Azure.

В этой статье вы узнаете, как создать индекс и использовать его из кода. Для локального promptflow-rag создания индекса мы используем пакет. Чтобы создать удаленный индекс в облаке, мы используем azure-ai-ml пакет. Мы используем индексы с помощью langchain.

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

Вы должны иметь:

  • Центр ИИ Studio и проект.

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

  • Модели внедрения:

    • Вы можете использовать модель внедрения ada-002 из Azure OpenAI. Инструкции по развертыванию см . здесь.
    • ИЛИ вы можете использовать любую другую модель внедрения, развернутую в проекте AI Studio. В этом примере используется многоязычное внедрение Cohere. Инструкции по развертыванию этой модели см . здесь.

Создание и использование индекса локально

Мы можем создать и использовать индекс локально.

Обязательные пакеты для локальных операций индексов

Установите следующие пакеты, необходимые для создания локального индекса.

pip install promptflow-rag langchain langchain-openai

Настройка поиска ИИ для локального использования

Мы используем поиск ИИ Azure в качестве хранилища индексов. Чтобы приступить к работе, можно настроить azure AI служба с помощью следующего кода:

import os
# set credentials to your Azure AI Search instance
os.environ["AZURE_AI_SEARCH_KEY"] = "<your-ai-search-key>"
os.environ["AZURE_AI_SEARCH_ENDPOINT"] = "https://<your-ai-search-service>.search.windows.net"

Создание индекса локально с помощью внедрения Azure OpenAI

Чтобы создать индекс, использующий внедрение Azure OpenAI, мы настраиваем переменные среды для подключения к модели.

import os
# set credentials to your Azure OpenAI instance
os.environ["OPENAI_API_VERSION"] = "2023-07-01-preview"
os.environ["AZURE_OPENAI_API_KEY"] = "<your-azure-openai-api-key>"
os.environ["AZURE_OPENAI_ENDPOINT"] = "https://<your-azure-openai-service>.openai.azure.com/"

Теперь давайте создадим индекс с помощью build_index функции.

from promptflow.rag.config import LocalSource, AzureAISearchConfig, EmbeddingsModelConfig
from promptflow.rag import build_index

local_index_aoai=build_index(
    name="<your-index-name>" + "aoai",  # name of your index
    vector_store="azure_ai_search",  # the type of vector store
    embeddings_model_config=EmbeddingsModelConfig(
        model_name="text-embedding-ada-002",
        deployment_name="text-embedding-ada-002", # verify if your deployment name is same as model name
    ),
    input_source=LocalSource(input_data="<path-to-your-local-files>"),  # the location of your file/folders
    index_config=AzureAISearchConfig(
        ai_search_index_name="<your-index-name>" + "-aoai-store", # the name of the index store inside the azure ai search service
    ),
    tokens_per_chunk = 800, # Optional field - Maximum number of tokens per chunk
    token_overlap_across_chunks = 0, # Optional field - Number of tokens to overlap between chunks
)

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

Создание индекса локально с помощью других моделей внедрения, развернутых в проекте AI Studio

Чтобы создать индекс, использующий модель внедрения, развернутую в проекте AI Studio, мы настраиваем подключение к модели, ConnectionConfig как показано ниже. Объект subscriptionи resource_group workspace ссылается на проект, в котором установлена модель внедрения. Он connection_name ссылается на имя подключения для модели, которую можно найти на странице параметров проекта AI Studio.

from promptflow.rag.config import ConnectionConfig

my_connection_config=ConnectionConfig(
    subscription_id="<subscription_id>",
    resource_group_name="<resource_group_name>",
    workspace_name="<ai_studio_project_name>",
    connection_name="<serverless_connection_name>"
    )

Теперь давайте создадим индекс с помощью build_index функции.

from promptflow.rag.config import LocalSource, AzureAISearchConfig, EmbeddingsModelConfig
from promptflow.rag import build_index

local_index_cohere=build_index(
    name="<your-index-name>" + "cohere",  # name of your index
    vector_store="azure_ai_search",  # the type of vector store
    embeddings_model_config=EmbeddingsModelConfig(
        model_name="cohere-embed-v3-multilingual", # in this example we use cohere multi lingual embedding
        connection_config=my_connection_config # created in previous step
    ),
    input_source=LocalSource(input_data="<path-to-your-local-files>"),  # the location of your file/folders
    index_config=AzureAISearchConfig(
        ai_search_index_name="<your-index-name>" + "cohere-store", # the name of the index store inside the azure ai search service
    ),
    tokens_per_chunk = 800, # Optional field - Maximum number of tokens per chunk
    token_overlap_across_chunks = 0, # Optional field - Number of tokens to overlap between chunks
)

Приведенный выше код создает индекс локально. Он использует переменные среды для получения служба ИИ и конфигурации подключения для подключения к модели внедрения.

Использование локального индекса

Созданный локальный индекс можно использовать в качестве извлекателя langchain, чтобы использовать его для поисковых запросов.

from promptflow.rag import get_langchain_retriever_from_index

# Get the OpenAI embedded Index
retriever=get_langchain_retriever_from_index(local_index_aoai)
retriever.get_relevant_documents("<your search query>")

# Get the Cohere embedded Index
retriever=get_langchain_retriever_from_index(local_index_cohere)
retriever.get_relevant_documents("<your search query>")

Регистрация индекса в проекте AI Studio (необязательно)

При необходимости можно зарегистрировать индекс в проекте AI Studio, чтобы вы или другие пользователи, имеющие доступ к проекту, могли использовать его из облака. Прежде чем продолжить установку необходимых пакетов для удаленных операций.

Подключение к проекту

# connect to the AI Studio project
from azure.identity import DefaultAzureCredential
from azure.ai.ml import MLClient

client=MLClient(
    DefaultAzureCredential(), 
    subscription_id="<subscription_id>",
    resource_group_name="<resource_group_name>",
    workspace_name="<ai_studio_project_name>"
    )

resource_group workspace Приведенный subscriptionвыше код ссылается на проект, к которому требуется подключиться.

Регистрация индекса

from azure.ai.ml.entities import Index

# register the index with Azure OpenAI embeddings
client.indexes.create_or_update(
    Index(name="<your-index-name>" + "aoai", 
          path=local_index_aoai, 
          version="1")
          )

# register the index with cohere embeddings
client.indexes.create_or_update(
    Index(name="<your-index-name>" + "cohere", 
          path=local_index_cohere, 
          version="1")
          )

Примечание.

Переменные среды предназначены для удобства в локальной среде. Однако при регистрации локального индекса, созданного с помощью переменных среды, индекс может не функционировать должным образом, так как секреты из переменных среды не будут передаваться в облачный индекс. Для решения этой проблемы можно использовать ConnectionConfig или connection_id создать локальный индекс перед регистрацией.

Создание индекса (удаленно) в проекте AI Studio

Мы создадим индекс в облаке в проекте AI Studio.

Обязательные пакеты для удаленных операций индексов

Установите следующие пакеты, необходимые для удаленного создания индекса.

pip install azure-ai-ml promptflow-rag langchain langchain-openai

Подключение к проекту AI Studio

Чтобы приступить к работе, мы подключимся к проекту. resource_group workspace В subscriptionприведенном ниже коде приведен проект, к которому требуется подключиться.

# connect to the AI Studio project
from azure.identity import DefaultAzureCredential
from azure.ai.ml import MLClient

client=MLClient(
    DefaultAzureCredential(), 
    subscription_id="<subscription_id>",
    resource_group_name="<resource_group_name>",
    workspace_name="<ai_studio_project_name>"
    )

Получение подключения служба ИИ

Этот проект должен иметь подключение к служба ИИ. Мы извлекаем сведения из проекта.

ai_search_connection = client.connections.get("<ai_search_connection>")

Подключение к моделям внедрения

Вы можете подключиться к Azure OpenAI с помощью подключений идентификатора Microsoft Entra или подключений на основе ключа API.

from azure.ai.ml.entities import IndexModelConfiguration
## aoai connections - entra id
aoai_connection = client.connections.get("<your_aoai_entra_id_connection>")
embeddings_model_config = IndexModelConfiguration.from_connection(
    aoai_connection, 
    model_name="text-embedding-ada-002",
    deployment_name="text-embedding-ada-002") # verify if your deployment name is same as model name

## OR you can connect using API Key based connections 
from azure.ai.ml.entities import IndexModelConfiguration
## aoai connections - API Key
aoai_connection = client.connections.get("<your_aoai_connection>", populate_secrets=True)
embeddings_model_config = IndexModelConfiguration.from_connection(
    aoai_connection, 
    model_name="text-embedding-ada-002",
    deployment_name="text-embedding-ada-002")

Вы можете подключиться к модели внедрения, развернутой в проекте AI Studio (не модели Azure OpenAI) с помощью бессерверного подключения.

from azure.ai.ml.entities import IndexModelConfiguration
serverless_connection = client.connections.get("<my_embedding_model_severless_connection_name>")
embeddings_model_config = IndexModelConfiguration.from_connection(cohere_serverless_connection)

Выбор входных данных для сборки индекса

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

  • Локальные файлы и папки
  • Репозитории GitHub
  • Хранилище Azure

Мы можем использовать следующий пример кода для использования любого из этих источников и настройки наших input_source:

# Local source
from azure.ai.ml.entities import LocalSource

input_source=LocalSource(input_data="<path-to-your-local-files>")

# GitHub repository
from azure.ai.ml.entities import GitSource

input_source=GitSource(
    git_url="https://github.com/rust-lang/book.git", # connecting to the RUST repo as an example
    git_branch_name="main", 
    git_connection_id="")

# Azure Storage
input_source_subscription = "<subscription>"
input_source_resource_group = "<resource_group>"
input_source_workspace = "<workspace>"
input_source_datastore = "<datastore_name>"
input_source_path = "path"

input_source = f"azureml://subscriptions/{input_source_subscription}/resourcegroups/{input_source_resource_group}/workspaces/{input_source_workspace}/datastores/{input_source_datastore}/paths/{input_source_path}"

Создание индекса в облаке

Теперь мы можем создать индекс с помощью ai_search_connectionembeddings_model_config и input_source. Мы используем функцию build_index . Если в качестве источника входных данных используется URL-адрес служба хранилища Azure, необходимо также указать UserIdentityConfiguration.

# from azure.ai.ml.entities.credentials import UserIdentityConfiguration # user specified identity used to access the data. Required when using an azure storage URL
from azure.ai.ml.entities import AzureAISearchConfig

client.indexes.build_index(
    name="<index_name>", # name of your index
    embeddings_model_config=embeddings_model_config, 
    input_source=input_source, 
    # input_source_credential=UserIdentityConfiguration(), # user specified identity used to access the data. Required when using an azure storage URL
    index_config=AzureAISearchConfig(
        ai_search_index_name="<index_name>",  # the name of the index store in AI search service
        ai_search_connection_id=ai_search_connection.id, 
    ),
    tokens_per_chunk = 800, # Optional field - Maximum number of tokens per chunk
    token_overlap_across_chunks = 0, # Optional field - Number of tokens to overlap between chunks
)

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

my_index=client.indexes.get(name="<index_name>", label="latest")

Использование зарегистрированного индекса из проекта

Чтобы использовать зарегистрированный индекс из проекта, необходимо подключиться к проекту и получить индекс. Полученный индекс можно использовать в качестве извлекателя langhcain для его использования. Вы можете подключиться к проекту, client как показано здесь.

from promptflow.rag import get_langchain_retriever_from_index

my_index=client.indexes.get(
    name="<registered_index_name>", 
    label="latest")

index_langchain_retriever=get_langchain_retriever_from_index(my_index.path)
index_langchain_retriever.get_relevant_documents("<your search query>")

Функция вопроса и ответа для использования индекса

Мы видели, как создать индекс локально или в облаке. Используя этот индекс, мы создадим функцию QnA, которая принимает вопрос пользователя и предоставляет ответ из данных индекса. Сначала давайте получим индекс как langchain_retriever, как показано здесь. Теперь мы используем это retriever в нашей функции. Эта функция использует LLM, как определено в конструкторе AzureChatOpenAI . Он использует индекс в качестве langchain_retriever для запроса данных. Мы создадим шаблон запроса, который принимает контекст и вопрос. Мы используем langchain s RetrievalQA.from_chain_type , чтобы собрать все эти вместе и получить нам ответы.

def qna(question: str, temperature: float = 0.0, prompt_template: object = None) -> str:
    from langchain import PromptTemplate
    from langchain.chains import RetrievalQA
    from langchain_openai import AzureChatOpenAI

    llm = AzureChatOpenAI(
        openai_api_version="2023-06-01-preview",
        api_key="<your-azure-openai-api-key>",
        azure_endpoint="https://<your-azure-openai-service>.openai.azure.com/",
        azure_deployment="<your-chat-model-deployment>", # verify the model name and deployment name
        temperature=temperature,
    )

    template = """
    System:
    You are an AI assistant helping users answer questions given a specific context.
    Use the following pieces of context to answer the questions as completely, 
    correctly, and concisely as possible.
    Your answer should only come from the context. Don't try to make up an answer.
    Do not add documentation reference in the response.

    {context}

    ---

    Question: {question}

    Answer:"
    """
    prompt_template = PromptTemplate(template=template, input_variables=["context", "question"])

    qa = RetrievalQA.from_chain_type(
        llm=llm,
        chain_type="stuff",
        retriever=index_langchain_retriever,
        return_source_documents=True,
        chain_type_kwargs={
            "prompt": prompt_template,
        },
    )

    response = qa(question)

    return {
        "question": response["query"],
        "answer": response["result"],
        "context": "\n\n".join([doc.page_content for doc in response["source_documents"]]),
    }

Давайте зададим вопрос, чтобы убедиться, что мы получим ответ.

result = qna("<your question>")
print(result["answer"])