Руководство. Часть 2. Создание пользовательского приложения чата с помощью пакета SDK для потока запросов
В этом руководстве вы используете пакет SDK потока запросов (и другие библиотеки) для создания, настройки, оценки и развертывания приложения чата для вашей розничной компании с именем Contoso Trek. Ваша розничная компания специализируется на открытом кемпинге шестеренки и одежды. Приложение чата должно отвечать на вопросы о продуктах и службах. Например, приложение чата может ответить на такие вопросы, как "какая палатка является самой водонепроницаемой?" или "что является лучшим спящим мешком для холодной погоды?".
В этой части показано, как улучшить базовое приложение чата путем добавления расширенного поколения (RAG) на основе ответов в пользовательских данных. Получение дополненного поколения (RAG) — это шаблон, который использует данные с большой языковой моделью (LLM) для создания ответов, характерных для ваших данных. В этой части 2 вы узнаете, как:
- Развертывание моделей ИИ в Azure AI Studio для использования в приложении
- Разработка пользовательского кода RAG
- Использование потока запросов для тестирования приложения чата
Это руководство является частью двух из трех частей учебника.
Необходимые компоненты
Полное руководство. Часть 1. Создание ресурсов для создания пользовательского приложения чата с помощью пакета SDK потока запросов.
Вам нужна локальная копия данных продукта. Репозиторий Azure-Samples/rag-data-openai-python-promptflow на GitHub содержит примеры сведений о розничном продукте, которые относятся к этому сценарию руководства. Скачайте пример данных о розничных продуктах Contoso Trek в ZIP-файле на локальный компьютер.
Структура кода приложения
Создайте папку с именем rag-tutorial на локальном компьютере. В этой серии учебников описывается создание содержимого каждого файла. После завершения серии учебников структура папок выглядит следующим образом:
rag-tutorial/
│ .env
│ build_index.py
│ deploy.py
│ evaluate.py
│ eval_dataset.jsonl
| invoke-local.py
│
├───copilot_flow
│ └─── chat.prompty
| └─── copilot.py
| └─── Dockerfile
│ └─── flow.flex.yaml
│ └─── input_with_chat_history.json
│ └─── queryIntent.prompty
│ └─── requirements.txt
│
├───data
| └─── product-info/
| └─── [Your own data or sample data as described in the prerequisites.]
Реализация в этом руководстве использует гибкий поток потока запроса, который является первым подходом к реализации потоков. Вы указываете функцию входа (которая находится в copilot.py), а затем используете возможности тестирования, оценки и трассировки потока запроса для потока. Этот поток находится в коде и не имеет DAG (направленный Ациклический граф) или другой визуальный компонент. Узнайте больше о том, как разработать гибкий поток в документации по потоку запросов на сайте GitHub.
Задание начальных переменных среды
Существует коллекция переменных среды, используемых в разных фрагментах кода. Добавьте их все в env-файл .
Внимание
Если вы создаете это в репозитории Git, убедитесь, что .env
он находится в .gitignore
файле, чтобы не случайно проверить его в репозитории.
Начните с этих значений. Вы добавите несколько дополнительных значений по мере выполнения руководства.
Создайте env-файл в папку rag-tutorial. Добавьте следующие переменные.
AZURE_SUBSCRIPTION_ID=<your subscription id> AZURE_RESOURCE_GROUP=<your resource group> AZUREAI_PROJECT_NAME=<your project name> AZURE_OPENAI_CONNECTION_NAME=<your AIServices or Azure OpenAI connection name> AZURE_SEARCH_ENDPOINT=<your Azure Search endpoint> AZURE_SEARCH_CONNECTION_NAME=<your Azure Search connection name>
Замените значения заполнителей следующими значениями:
Найдите и
<your resource group>
<your project name>
в представлении<your subscription id>
проекта в AI Studio:- В AI Studio перейдите в проект и выберите "Параметры " в левой области.
- В разделе свойств проекта найдите идентификатор подписки и группу ресурсов. Поле "Имя" —
<your project name>
По-прежнему в разделе "Параметры проекта" в разделе "Подключенные ресурсы" вы увидите запись для Azure AIServices или Azure OpenAI. Выберите имя, чтобы открыть сведения о подключении. Имя подключения отображается в верхней части страницы сведений о подключении. Скопируйте это имя, чтобы использовать для
<your AIServices or Azure OpenAI connection name>
.Вернитесь на страницу параметров проекта. В разделе "Подключенные ресурсы" выберите ссылку для поиска ИИ Azure.
- Скопируйте целевой URL-адрес для
<your Azure Search endpoint>
. - Скопируйте имя в верхней части страницы
<your Azure Search connection name>
.
- Скопируйте целевой URL-адрес для
Развертывание моделей
Вам потребуется две модели для создания приложения чата на основе RAG: модели чата Azure OpenAI (gpt-3.5-turbo
) и модели внедрения Azure OpenAI (text-embedding-ada-002
). Разверните эти модели в проекте Azure AI Studio, используя этот набор шагов для каждой модели.
Эти шаги по развертыванию модели в конечной точке в режиме реального времени из каталога моделей AI Studio:
Войдите в AI Studio и перейдите на домашнюю страницу.
Выберите каталог моделей на левой боковой панели.
В фильтре коллекций выберите Azure OpenAI.
Выберите модель из коллекции Azure OpenAI. В первый раз выберите
gpt-3.5-turbo
модель. Второй раз выберитеtext-embedding-ada-002
модель.Выберите "Развернуть" , чтобы открыть окно развертывания.
Выберите концентратор, в который нужно развернуть модель. Используйте тот же концентратор, что и проект.
Укажите имя развертывания и измените другие параметры по умолчанию в зависимости от ваших требований.
Выберите Развернуть.
Вы приземлились на странице сведений о развертывании. Выберите "Открыть на площадке".
Выберите представление кода , чтобы получить примеры кода, которые можно использовать для использования развернутой модели в приложении.
При развертывании gpt-3.5-turbo
модели найдите следующие значения в разделе "Код представления" и добавьте их в env-файл:
AZURE_OPENAI_ENDPOINT=<endpoint_value>
AZURE_OPENAI_CHAT_DEPLOYMENT=<chat_model_deployment_name>
AZURE_OPENAI_API_VERSION=<api_version>
При развертывании text-embedding-ada-002
модели добавьте имя в env-файл :
AZURE_OPENAI_EMBEDDING_DEPLOYMENT=<embedding_model_deployment_name>
Установка Azure CLI и вход
Вы устанавливаете Azure CLI и войдите из локальной среды разработки, чтобы использовать учетные данные пользователя для вызова службы Azure OpenAI.
В большинстве случаев azure CLI можно установить из терминала с помощью следующей команды:
Инструкции по установке Azure CLI можно выполнить, если эти команды не работают для конкретной операционной системы или установки.
После установки Azure CLI выполните вход с помощью az login
команды и входа с помощью браузера:
az login
Теперь мы создадим приложение и вызовем Службу Azure OpenAI из кода.
Создание новой среды Python.
Сначала необходимо создать новую среду Python, с помощью которой можно установить пакеты ПАКЕТА SDK для потока запросов. Не устанавливайте пакеты в глобальную установку Python. При установке пакетов Python всегда следует использовать виртуальную или конда-среду, в противном случае можно разорвать глобальную установку Python.
При необходимости установите Python
Рекомендуется использовать Python 3.10 или более поздней версии, но требуется по крайней мере Python 3.8. Если у вас нет подходящей версии Python, вы можете следовать инструкциям в руководстве по Python VS Code для простого способа установки Python в операционной системе.
Создание виртуальной среды
Если у вас уже установлен Python 3.10 или более поздней версии, можно создать виртуальную среду с помощью следующих команд:
Активация среды Python означает, что при запуске python
или pip
из командной строки используется интерпретатор Python, содержащийся в .venv
папке приложения.
Примечание.
Вы можете использовать deactivate
команду для выхода из виртуальной среды Python, а затем повторно активировать ее при необходимости.
Обновление pip
Чтобы убедиться, что у вас установлена последняя версия pip, выполните следующую команду:
python -m pip install --upgrade pip
Установка пакета SDK потока запроса
Поток запросов — это набор средств разработки, предназначенных для упрощения комплексного цикла разработки приложений ИИ на основе LLM, от идеи, прототипирования, тестирования, оценки до развертывания и мониторинга рабочей среды.
Используйте pip для установки пакета SDK потока запроса в виртуальную среду, созданную вами.
pip install promptflow
pip install azure-identity
Пакет SDK потока запросов принимает зависимость от нескольких пакетов, которые можно выбрать отдельно установить, если они не нужны:
promptflow-core
: содержит базовую среду выполнения потока запроса, используемую для выполнения кода LLMpromptflow-tracing
: упрощенная библиотека, используемая для создания трассировок OpenTelemetry в стандартахpromptflow-devkit
: содержит средство проверки потока запроса и средства просмотра трассировки для локальных сред разработкиopenai
: клиентские библиотеки для использования службы Azure OpenAIpython-dotenv
: используется для задания переменных среды, считывая их из.env
файлов
Создание индекса поиска ИИ Azure
Цель этого приложения на основе RAG заключается в том, чтобы заземлить ответы модели в пользовательских данных. Вы используете индекс поиска ИИ Azure, в который хранятся векторизованные данные из модели внедрения. Индекс поиска используется для получения соответствующих документов на основе вопроса пользователя.
Если у вас еще нет созданного индекса поиска ИИ Azure, мы рассмотрим, как создать его. Если у вас уже есть индекс, можно перейти к разделу переменной среды поиска. Индекс поиска создается на служба ИИ Azure, который был создан или указан на предыдущем шаге.
Используйте собственные данные или скачайте пример данных розничной продукции Contoso Trek в ZIP-файле на локальный компьютер. Распакуйте файл в папку rag-tutorial/data . Эти данные представляют собой коллекцию файлов markdown, представляющих сведения о продукте. Данные структурированы таким образом, что их легко принять в индекс поиска. Вы создаете индекс поиска из этих данных.
Пакет RAG потока запроса позволяет принять файлы markdown, локально создать индекс поиска и зарегистрировать его в облачном проекте. Установите пакет RAG потока запроса:
pip install promptflow-rag
Создайте файл build_index.py в папке rag-tutorial.
Скопируйте и вставьте следующий код в файл build_index.py .
import os from dotenv import load_dotenv load_dotenv() from azure.ai.ml import MLClient from azure.identity import DefaultAzureCredential from azure.ai.ml.entities import Index from promptflow.rag.config import ( LocalSource, AzureAISearchConfig, EmbeddingsModelConfig, ConnectionConfig, ) from promptflow.rag import build_index client = MLClient( DefaultAzureCredential(), os.getenv("AZURE_SUBSCRIPTION_ID"), os.getenv("AZURE_RESOURCE_GROUP"), os.getenv("AZUREAI_PROJECT_NAME"), ) import os # append directory of the current script to data directory script_dir = os.path.dirname(os.path.abspath(__file__)) data_directory = os.path.join(script_dir, "data/product-info/") # Check if the directory exists if os.path.exists(data_directory): files = os.listdir(data_directory) # List all files in the directory if files: print( f"Data directory '{data_directory}' exists and contains {len(files)} files." ) else: print(f"Data directory '{data_directory}' exists but is empty.") exit() else: print(f"Data directory '{data_directory}' does not exist.") exit() index_name = "tutorial-index" # your desired index name index_path = build_index( name=index_name, # name of your index vector_store="azure_ai_search", # the type of vector store - in this case it is Azure AI Search. Users can also use "azure_cognitive search" embeddings_model_config=EmbeddingsModelConfig( model_name=os.getenv("AZURE_OPENAI_EMBEDDING_DEPLOYMENT"), deployment_name=os.getenv("AZURE_OPENAI_EMBEDDING_DEPLOYMENT"), connection_config=ConnectionConfig( subscription_id=client.subscription_id, resource_group_name=client.resource_group_name, workspace_name=client.workspace_name, connection_name=os.getenv("AZURE_OPENAI_CONNECTION_NAME"), ), ), input_source=LocalSource(input_data=data_directory), # the location of your files index_config=AzureAISearchConfig( ai_search_index_name=index_name, # the name of the index store inside the azure ai search service ai_search_connection_config=ConnectionConfig( subscription_id=client.subscription_id, resource_group_name=client.resource_group_name, workspace_name=client.workspace_name, connection_name=os.getenv("AZURE_SEARCH_CONNECTION_NAME"), ), ), 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 ) # register the index so that it shows up in the cloud project client.indexes.create_or_update(Index(name=index_name, path=index_path))
index_name
Задайте для переменной имя нужного индекса.- При необходимости можно обновить
path_to_data
переменную до пути, в котором хранятся файлы данных.
Внимание
По умолчанию пример кода ожидает структуру кода приложения, как описано ранее в этом руководстве. Папка
data
должна находиться на том же уровне, что и build_index.py и скачаемуюproduct-info
папку с md-файлами в ней.В консоли запустите код, чтобы создать индекс локально и зарегистрировать его в облачном проекте:
python build_index.py
После запуска скрипта вы можете просмотреть созданный индекс на странице индексов проекта Azure AI Studio. Дополнительные сведения см. в статье о создании и использовании векторных индексов в Azure AI Studio.
При повторном запуске скрипта с тем же именем индекса создается новая версия того же индекса.
Установка переменной среды индекса поиска
После получения имени индекса, который вы хотите использовать (создав новый или ссылаясь на существующий), добавьте его в env-файл , как показано ниже.
AZUREAI_SEARCH_INDEX_NAME=<index-name>
Разработка пользовательского кода RAG
Затем вы создадите пользовательский код для добавления возможностей расширенного создания (RAG) в базовое приложение чата. В кратком руководстве вы создали файлы chat.py и chat.prompty . Здесь вы разверните этот код, чтобы включить возможности RAG.
Приложение чата с RAG реализует следующую общую логику:
- Создание поискового запроса на основе намерения пользовательского запроса и журнала чата
- Использование модели внедрения для внедрения запроса
- Получение соответствующих документов из индекса поиска с учетом запроса
- Передача соответствующего контекста модели завершения чата Azure OpenAI
- Возврат ответа из модели Azure OpenAI
Логика реализации приложения чата
Логика реализации приложения чата находится в файле copilot.py . Этот файл содержит основную логику для приложения чата на основе RAG.
Создайте папку с именем copilot_flow в папке rag-tutorial .
Затем создайте файл с именем copilot.py в папке copilot_flow .
Добавьте следующий код в файл copilot.py :
import os from dotenv import load_dotenv load_dotenv() from promptflow.core import Prompty, AzureOpenAIModelConfiguration from promptflow.tracing import trace from openai import AzureOpenAI # <get_documents> @trace def get_documents(search_query: str, num_docs=3): from azure.identity import DefaultAzureCredential, get_bearer_token_provider from azure.search.documents import SearchClient from azure.search.documents.models import VectorizedQuery token_provider = get_bearer_token_provider( DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default" ) index_name = os.getenv("AZUREAI_SEARCH_INDEX_NAME") # retrieve documents relevant to the user's question from Cognitive Search search_client = SearchClient( endpoint=os.getenv("AZURE_SEARCH_ENDPOINT"), credential=DefaultAzureCredential(), index_name=index_name, ) aoai_client = AzureOpenAI( azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"), azure_ad_token_provider=token_provider, api_version=os.getenv("AZURE_OPENAI_API_VERSION"), ) # generate a vector embedding of the user's question embedding = aoai_client.embeddings.create( input=search_query, model=os.getenv("AZURE_OPENAI_EMBEDDING_DEPLOYMENT") ) embedding_to_query = embedding.data[0].embedding context = "" # use the vector embedding to do a vector search on the index vector_query = VectorizedQuery( vector=embedding_to_query, k_nearest_neighbors=num_docs, fields="contentVector" ) results = trace(search_client.search)( search_text="", vector_queries=[vector_query], select=["id", "content"] ) for result in results: context += f"\n>>> From: {result['id']}\n{result['content']}" return context # <get_documents> from promptflow.core import Prompty, AzureOpenAIModelConfiguration from pathlib import Path from typing import TypedDict class ChatResponse(TypedDict): context: dict reply: str def get_chat_response(chat_input: str, chat_history: list = []) -> ChatResponse: model_config = AzureOpenAIModelConfiguration( azure_deployment=os.getenv("AZURE_OPENAI_CHAT_DEPLOYMENT"), api_version=os.getenv("AZURE_OPENAI_API_VERSION"), azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"), ) searchQuery = chat_input # Only extract intent if there is chat_history if len(chat_history) > 0: # extract current query intent given chat_history path_to_prompty = f"{Path(__file__).parent.absolute().as_posix()}/queryIntent.prompty" # pass absolute file path to prompty intentPrompty = Prompty.load( path_to_prompty, model={ "configuration": model_config, "parameters": { "max_tokens": 256, }, }, ) searchQuery = intentPrompty(query=chat_input, chat_history=chat_history) # retrieve relevant documents and context given chat_history and current user query (chat_input) documents = get_documents(searchQuery, 3) # send query + document context to chat completion for a response path_to_prompty = f"{Path(__file__).parent.absolute().as_posix()}/chat.prompty" chatPrompty = Prompty.load( path_to_prompty, model={ "configuration": model_config, "parameters": {"max_tokens": 256, "temperature": 0.2}, }, ) result = chatPrompty( chat_history=chat_history, chat_input=chat_input, documents=documents ) return dict(reply=result, context=documents)
Файл copilot.py содержит две ключевые функции: get_documents()
и get_chat_response()
.
Обратите внимание, что эти две функции имеют @trace
декоратор, который позволяет просматривать журналы трассировки потока запроса для каждого вызова функции входных и выходных данных. @trace
— это альтернативный и расширенный подход к тому, как краткое руководство показало возможности трассировки.
Функция get_documents()
является ядром логики RAG.
- Принимает запрос поиска и количество документов для извлечения.
- Внедряет поисковый запрос с помощью модели внедрения.
- Запрашивает индекс поиска Azure, чтобы получить документы, относящиеся к запросу.
- Возвращает контекст документов.
Функция get_chat_response()
создается из предыдущей логики в файле chat.py :
- Принимает в себя и любой
chat_input
chat_history
. - Создает поисковый запрос на
chat_input
основе намерений иchat_history
. - Вызовы
get_documents()
для получения соответствующих документов. - Вызывает модель завершения чата с контекстом, чтобы получить заземленный ответ на запрос.
- Возвращает ответ и контекст. Мы устанавливаем типизированный словарь в качестве возвращаемого объекта для нашей
get_chat_response()
функции. Вы можете выбрать, как код возвращает ответ в соответствии с вариантом использования.
Функция get_chat_response()
использует два Prompty
файла для выполнения необходимых вызовов большой языковой модели (LLM), которые мы рассмотрим далее.
Шаблон запроса для чата
Файл chat.prompty прост и похож на chat.prompty в кратком руководстве. Системный запрос обновляется, чтобы отразить наш продукт, и шаблоны запросов включают контекст документа.
Добавьте файл chat.prompty в каталог copilot_flow . Файл представляет вызов модели завершения чата с помощью системного запроса, журнала чата и контекста документа.
Добавьте этот код в файл chat.prompty :
--- name: Chat Prompt description: A prompty that uses the chat API to respond to queries grounded in relevant documents model: api: chat configuration: type: azure_openai inputs: chat_input: type: string chat_history: type: list is_chat_history: true default: [] documents: type: object --- system: You are an AI assistant helping users with queries related to outdoor outdooor/camping gear and clothing. If the question is not related to outdoor/camping gear and clothing, just say 'Sorry, I only can answer queries related to outdoor/camping gear and clothing. So, how can I help?' Don't try to make up any answers. If the question is related to outdoor/camping gear and clothing but vague, ask for clarifying questions instead of referencing documents. If the question is general, for example it uses "it" or "they", ask the user to specify what product they are asking about. Use the following pieces of context to answer the questions about outdoor/camping gear and clothing as completely, correctly, and concisely as possible. Do not add documentation reference in the response. # Documents {{documents}} {% for item in chat_history %} {{item.role}} {{item.content}} {% endfor %} user: {{chat_input}}
Шаблон запроса для журнала чата
Так как мы реализуем приложение на основе RAG, существует дополнительная логика, необходимая для получения релевантных документов не только для текущего запроса пользователя, но и учета журнала чата. Без этой дополнительной логики вызов LLM будет учитывать журнал чата. Но вы не получите правильные документы для этого контекста, поэтому вы не получите ожидаемый ответ.
Например, если пользователь задает вопрос "является ли он водонепроницаемым?", нам нужна система, чтобы посмотреть историю чата, чтобы определить, к чему относится слово "он", и включить этот контекст в поисковый запрос для внедрения. Таким образом, мы извлекаем правильные документы для "его" (возможно, альпийского обозревателя палатки) и его "стоимость".
Вместо передачи только внедренного запроса пользователя необходимо создать новый поисковый запрос, который учитывает любой журнал чата. Мы используем другой (который является другим Prompty
вызовом LLM) с конкретным запросом для интерпретации намерения пользовательского запроса, заданного журналом чата, и создадим поисковый запрос с необходимым контекстом.
Создайте файл queryIntent.prompty в папке copilot_flow .
Введите этот код для конкретных сведений о формате запроса и примерах с несколькими выстрелами.
--- name: Chat Prompt description: A prompty that extract users query intent based on the current_query and chat_history of the conversation model: api: chat configuration: type: azure_openai inputs: query: type: string chat_history: type: list is_chat_history: true default: [] --- system: - You are an AI assistant reading a current user query and chat_history. - Given the chat_history, and current user's query, infer the user's intent expressed in the current user query. - Once you infer the intent, respond with a search query that can be used to retrieve relevant documents for the current user's query based on the intent - Be specific in what the user is asking about, but disregard parts of the chat history that are not relevant to the user's intent. Example 1: With a chat_history like below: \``` chat_history: [ { "role": "user", "content": "are the trailwalker shoes waterproof?" }, { "role": "assistant", "content": "Yes, the TrailWalker Hiking Shoes are waterproof. They are designed with a durable and waterproof construction to withstand various terrains and weather conditions." } ] \``` User query: "how much do they cost?" Intent: "The user wants to know how much the Trailwalker Hiking Shoes cost." Search query: "price of Trailwalker Hiking Shoes" Example 2: With a chat_history like below: \``` chat_history: [ { "role": "user", "content": "are the trailwalker shoes waterproof?" }, { "role": "assistant", "content": "Yes, the TrailWalker Hiking Shoes are waterproof. They are designed with a durable and waterproof construction to withstand various terrains and weather conditions." }, { "role": "user", "content": "how much do they cost?" }, { "role": "assistant", "content": "The TrailWalker Hiking Shoes are priced at $110." }, { "role": "user", "content": "do you have waterproof tents?" }, { "role": "assistant", "content": "Yes, we have waterproof tents available. Can you please provide more information about the type or size of tent you are looking for?" }, { "role": "user", "content": "which is your most waterproof tent?" }, { "role": "assistant", "content": "Our most waterproof tent is the Alpine Explorer Tent. It is designed with a waterproof material and has a rainfly with a waterproof rating of 3000mm. This tent provides reliable protection against rain and moisture." } ] \``` User query: "how much does it cost?" Intent: "the user would like to know how much the Alpine Explorer Tent costs" Search query: "price of Alpine Explorer Tent" {% for item in chat_history %} {{item.role}} {{item.content}} {% endfor %} Current user query: {{query}} Search query:
Простое системное сообщение в файле queryIntent.prompty обеспечивает минимальное значение, необходимое для решения RAG для работы с журналом чата.
Настройка обязательных пакетов
Создайте файл requirements.txt в папке copilot_flow . Добавьте это содержимое:
openai
azure-identity
azure-search-documents==11.4.0
promptflow[azure]==1.11.0
promptflow-tracing==1.11.0
promptflow-tools==1.4.0
promptflow-evals==0.3.0
jinja2
aiohttp
python-dotenv
Эти пакеты необходимы для локального выполнения потока и в развернутой среде.
Использование гибкого потока
Как упоминалось ранее, эта реализация использует гибкий поток потока запроса, который является подходом к реализации потоков в коде. Вы указываете функцию записи (которая определена в copilot.py). Узнайте больше о разработке гибкого потока.
Этот yaml задает функцию входа, которая является функцией, определенной get_chat_response
в copilot.py
. Он также указывает требования, необходимые для выполнения потока.
Создайте файл flow.flex.yaml в папке copilot_flow . Добавьте это содержимое:
entry: copilot:get_chat_response
environment:
python_requirements_txt: requirements.txt
Использование потока запросов для тестирования приложения чата
Используйте возможность тестирования потока запросов, чтобы узнать, как приложение чата выполняется должным образом при выборке входных данных. С помощью файла flow.flex.yaml можно использовать поток запроса для тестирования с указанными входными данными.
Запустите поток с помощью этой команды потока командной строки:
pf flow test --flow ./copilot_flow --inputs chat_input="how much do the Trailwalker shoes cost?"
Кроме того, можно интерактивно запустить поток с помощью флага --ui
.
pf flow test --flow ./copilot_flow --ui
При использовании --ui
интерактивный пример чата открывает окно в локальном браузере.
- При первом запуске с флагом
--ui
необходимо вручную выбрать входные и выходные данные чата из параметров. При первом создании этого сеанса выберите параметры конфигурации поля ввода и вывода чата, а затем запустите чат. - При следующем запуске с флагом
--ui
сеанс будет запоминать параметры.
После завершения интерактивного сеанса введите CTRL+C в окне терминала, чтобы остановить сервер.
Тестирование с помощью журнала чата
Как правило, поток запросов и Prompty
журнал чатов поддержки. Если вы тестируете флаг --ui
в локально обслуживаемом интерфейсе, поток запросов управляет журналом чата. При тестировании без --ui
этого можно указать входной файл, включающий журнал чата.
Так как приложение реализует RAG, нам пришлось добавить дополнительную логику для обработки журнала чата в файле queryIntent.prompty .
Чтобы проверить журнал чата, создайте файл с именем input_with_chat_history.json в папке copilot_flow и вставьте его в следующее содержимое:
{
"chat_input": "how much does it cost?",
"chat_history": [
{
"role": "user",
"content": "are the trailwalker shoes waterproof?"
},
{
"role": "assistant",
"content": "Yes, the TrailWalker Hiking Shoes are waterproof. They are designed with a durable and waterproof construction to withstand various terrains and weather conditions."
},
{
"role": "user",
"content": "how much do they cost?"
},
{
"role": "assistant",
"content": "The TrailWalker Hiking Shoes are priced at $110."
},
{
"role": "user",
"content": "do you have waterproof tents?"
},
{
"role": "assistant",
"content": "Yes, we have waterproof tents available. Can you please provide more information about the type or size of tent you are looking for?"
},
{
"role": "user",
"content": "which is your most waterproof tent?"
},
{
"role": "assistant",
"content": "Our most waterproof tent is the Alpine Explorer Tent. It is designed with a waterproof material and has a rainfly with a waterproof rating of 3000mm. This tent provides reliable protection against rain and moisture."
}
]
}
Чтобы протестировать этот файл, выполните следующую команду:
pf flow test --flow ./copilot_flow --inputs ./copilot_flow/input_with_chat_history.json
Ожидаемые выходные данные примерно такие: "Палатка Альпийского обозревателя стоит на $ 350".
Эта система может интерпретировать намерение запроса "сколько это стоит?", чтобы знать, что "это" относится к палатке Alpine Explorer, которая была последним контекстом в истории чата. Затем система создает поисковый запрос цены на палатку Alpine Explorer, чтобы получить соответствующие документы для стоимости альпийского обозревателя, и мы получаем ответ.
Если перейти к трассировке из этого потока, вы увидите беседу в действии. Ссылка на локальные трассировки отображается в выходных данных консоли перед результатом выполнения теста потока.
Очистка ресурсов
Чтобы избежать ненужных затрат Azure, следует удалить ресурсы, созданные в этом руководстве, если они больше не нужны. Для управления ресурсами можно использовать портал Azure.
Но не удаляйте их, если вы хотите развернуть приложение чата в Azure в следующей части этого руководства.