Öğretici: Bölüm 2 - İstem akışı SDK'sı ile özel bir sohbet uygulaması oluşturma
Bu öğreticide, perakende şirketiniz için Contoso Trek adlı bir sohbet uygulaması oluşturmak, yapılandırmak, değerlendirmek ve dağıtmak için istem akışı SDK'sını (ve diğer kitaplıkları) kullanacaksınız. Perakende şirketiniz açık hava kamp malzemeleri ve giyim konusunda uzmanlaşmıştır. Sohbet uygulaması, ürünleriniz ve hizmetleriniz hakkındaki soruları yanıtlamalıdır. Örneğin, sohbet uygulaması "hangi çadır en su geçirmez?" veya "soğuk hava için en iyi uyku tulumu hangisidir?" gibi soruları yanıtlayabilir.
Bu ikinci bölümde, özel verilerinizdeki yanıtların temellerini belirlemek için alma artırılmış oluşturma (RAG) ekleyerek temel bir sohbet uygulamasını nasıl geliştirebilirsiniz gösterilmektedir. Alma Artırılmış Nesil (RAG), verilerinize özgü yanıtlar oluşturmak için büyük bir dil modeliyle (LLM) verilerinizi kullanan bir desendir. bu ikinci bölümde şunların nasıl yapılacağını öğreneceksiniz:
- Uygulamanızda kullanmak için Azure AI Studio'da yapay zeka modelleri dağıtma
- Özel RAG kodu geliştirme
- Sohbet uygulamanızı test etmek için istem akışını kullanma
Bu öğretici, üç bölümden oluşan bir öğreticinin ikinci bölümüdür.
Önkoşullar
Öğreticiyi Tamamlama : 1. Bölüm - İstem akışı SDK'sı ile özel bir sohbet uygulaması oluşturmak için kaynaklar oluşturun.
Ürün verilerinin yerel bir kopyasına ihtiyacınız vardır. GitHub'daki Azure-Samples/rag-data-openai-python-promptflow deposu, bu öğretici senaryosuyla ilgili örnek perakende ürün bilgilerini içerir. Zip dosyasındaki Contoso Trek perakende ürün verilerini yerel makinenize indirin.
Uygulama kodu yapısı
Yerel makinenizde rag-tutorial adlı bir klasör oluşturun. Bu öğretici serisi, her dosyanın içeriğinin oluşturulmasında yol gösterir. Öğretici serisini tamamladığınızda klasör yapınız şu şekilde görünür:
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.]
Bu öğreticideki uygulama, akışları uygulamaya yönelik kod öncelikli yaklaşım olan istem akışının esnek akışını kullanır. Bir giriş işlevi (copilot.py) belirtir ve ardından akışınız için istem akışının test, değerlendirme ve izleme özelliklerini kullanırsınız. Bu akış koddadır ve DAG (Yönlendirilmiş Acyclic Graph) veya başka bir görsel bileşeni yoktur. GitHub'daki istem akışı belgelerinde esnek akış geliştirme hakkında daha fazla bilgi edinin.
İlk ortam değişkenlerini ayarlama
Farklı kod parçacıklarında kullanılan ortam değişkenlerinden oluşan bir koleksiyon vardır. Tümünü bir .env dosyasına ekleyin.
Önemli
Bunu bir git deposunda oluşturursanız, yanlışlıkla depoya iade etmemesi için dosyanızda .gitignore
olduğundan emin olun.env
.
Bu değerlerle başlayın. Öğreticide ilerledikçe birkaç değer daha ekleyeceksiniz.
Rag-tutorial klasörünüzde bir .env dosyası oluşturun. Şu değişkenleri ekleyin:
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>
Yer tutucuları aşağıdaki değerlerle değiştirin:
AI Studio'da
<your subscription id>
proje görünümünüzde ,<your resource group>
ve<your project name>
öğesini bulun:Yine proje ayarlarınızda, Bağlı kaynaklar bölümünde Azure AIServices veya Azure OpenAI için bir giriş görürsünüz. Bağlantı Ayrıntıları'nı açmak için adı seçin. Bağlantı adı, Bağlantı Ayrıntıları sayfasının en üstünde görünür. için kullanmak
<your AIServices or Azure OpenAI connection name>
üzere bu adı kopyalayın.Proje Ayarları sayfasına geri dönün. Bağlı kaynaklar bölümünde Azure AI Arama bağlantısını seçin.
- hedef
<your Azure Search endpoint>
URL'sini kopyalayın. - için
<your Azure Search connection name>
üstteki adı kopyalayın.
- hedef
Modelleri dağıtma
RAG tabanlı sohbet uygulaması oluşturmak için iki model gerekir: Azure OpenAI sohbet modeli (gpt-3.5-turbo
) ve Azure OpenAI ekleme modeli (text-embedding-ada-002
). Her model için bu adım kümesini kullanarak bu modelleri Azure AI Studio projenize dağıtın.
Bu adımlar, modeli AI Studio model kataloğundan gerçek zamanlı bir uç noktaya dağıtır:
Sol kenar çubuğundan Model kataloğu'nu seçin.
Koleksiyonlar filtresinde Azure OpenAI'yi seçin.
Azure OpenAI koleksiyonundan modeli seçin. İlk kez modeli seçin
gpt-3.5-turbo
. İkinci kez modeli seçintext-embedding-ada-002
.Dağıtım penceresini açmak için Dağıt'ı seçin.
Modeli dağıtmak istediğiniz hub'ı seçin. Projenizle aynı hub'ı kullanın.
Dağıtım adını belirtin ve gereksinimlerinize bağlı olarak diğer varsayılan ayarları değiştirin.
Dağıt'ı seçin.
Dağıtım ayrıntıları sayfasına gidin. Oyun alanında aç'ı seçin.
Uygulamanızda dağıtılan modeli kullanmak için kullanılabilecek kod örneklerini almak için Kodu Görüntüle'yi seçin.
Modeli dağıttığınızdagpt-3.5-turbo
, Kodu Görüntüle bölümünde aşağıdaki değerleri bulun ve bunları .env dosyanıza ekleyin:
AZURE_OPENAI_ENDPOINT=<endpoint_value>
AZURE_OPENAI_CHAT_DEPLOYMENT=<chat_model_deployment_name>
AZURE_OPENAI_API_VERSION=<api_version>
Modeli dağıtırken text-embedding-ada-002
adı .env dosyanıza ekleyin:
AZURE_OPENAI_EMBEDDING_DEPLOYMENT=<embedding_model_deployment_name>
Azure CLI'yi yükleme ve oturum açma
Azure OpenAI hizmetini çağırmak için kullanıcı kimlik bilgilerinizi kullanabilmek için Azure CLI'yı yükler ve yerel geliştirme ortamınızdan oturum açarsınız.
Çoğu durumda, aşağıdaki komutu kullanarak terminalinizden Azure CLI'yi yükleyebilirsiniz:
Bu komutlar belirli bir işletim sisteminiz veya kurulumunuz için çalışmıyorsa Azure CLI'yı yükleme yönergelerini izleyebilirsiniz.
Azure CLI'yı yükledikten sonra komutunu kullanarak az login
oturum açın ve tarayıcıyı kullanarak oturum açın:
az login
Şimdi uygulamamızı oluşturup koddan Azure OpenAI Hizmeti'ni çağıracağız.
Yeni python ortamı oluşturma
İlk olarak, istem akışı SDK paketlerini yüklemek için kullanabileceğimiz yeni bir Python ortamı oluşturmamız gerekir. Paketleri genel Python yüklemenize YÜKLEMEYİN. Python paketlerini yüklerken her zaman bir sanal veya conda ortamı kullanmanız gerekir, aksi takdirde Python'ın genel yüklemesini bozabilirsiniz.
Gerekirse Python'ı yükleyin
Python 3.10 veya üzerini kullanmanızı öneririz, ancak en az Python 3.8'e sahip olmak gerekir. Python'ın uygun bir sürümü yüklü değilse, işletim sisteminize Python yüklemenin en kolay yolu için VS Code Python Öğreticisi'ndeki yönergeleri izleyebilirsiniz.
Sanal ortam oluşturma
Python 3.10 veya üzeri yüklüyse aşağıdaki komutları kullanarak bir sanal ortam oluşturabilirsiniz:
Python ortamını etkinleştirmek, komut satırını çalıştırdığınızda veya pip
komut satırından çalıştırdığınızda python
uygulamanızın klasöründe bulunan Python yorumlayıcısını .venv
kullanacağınız anlamına gelir.
Not
komutunu kullanarak deactivate
Python sanal ortamından çıkabilirsiniz ve daha sonra gerektiğinde yeniden etkinleştirebilirsiniz.
pip sürümünü yükseltme
Pip'in en son sürümüne sahip olduğunuzdan emin olmak için aşağıdaki komutu çalıştırın:
python -m pip install --upgrade pip
İstem akışı SDK'sını yükleme
İstem akışı , LLM tabanlı yapay zeka uygulamalarının fikir geliştirme, prototip oluşturma, test, değerlendirmeden üretim dağıtımı ve izlemesine kadar uçtan uca geliştirme döngüsünü kolaylaştırmak için tasarlanmış bir geliştirme araçları paketidir.
oluşturduğunuz sanal ortama istem akışı SDK'sını yüklemek için pip kullanın.
pip install promptflow
pip install azure-identity
İstem akışı SDK'sı birden çok pakete bağımlılık alır ve bunların tümünü istemiyorsanız ayrı olarak yüklemeyi seçebilirsiniz:
promptflow-core
: LLM kodunu yürütmek için kullanılan çekirdek istem akışı çalışma zamanını içerirpromptflow-tracing
: Standartlarda OpenTelemetry izlemeleri yaymada kullanılan basit kitaplıkpromptflow-devkit
: yerel geliştirme ortamları için istem akışı test yatağı ve izleme görüntüleyici araçlarını içeriropenai
: Azure OpenAI hizmetini kullanmak için istemci kitaplıklarıpython-dotenv
: ortam değişkenlerini dosyalardan.env
okuyarak ayarlamak için kullanılır
Azure AI Search dizini oluşturma
Bu RAG tabanlı uygulamanın amacı, özel verilerinizdeki model yanıtlarını temel almaktır. Ekleme modelinden vektörleştirilmiş verileri depolayan bir Azure AI Search dizini kullanırsınız. Arama dizini, kullanıcının sorusuna göre ilgili belgeleri almak için kullanılır.
Önceden oluşturulmuş bir Azure AI Search dizininiz yoksa, nasıl oluşturulacağınız konusunda size yol gösteririz. Kullanılacak bir dizininiz zaten varsa, arama ortamı değişkenini ayarlama bölümüne atlayabilirsiniz. Arama dizini, önceki adımda oluşturulan veya başvuruda bulunan Azure AI Arama hizmeti oluşturulur.
Kendi verilerinizi kullanın veya örnek Contoso Trek perakende ürün verilerini bir ZIP dosyasında yerel makinenize indirin. Dosyayı rag-tutorial/data klasörünüzde açın. Bu veriler, ürün bilgilerini temsil eden markdown dosyaları koleksiyonudur. Veriler, arama dizinine kolayca alınabilecek şekilde yapılandırılmıştır. Bu verilerden bir arama dizini oluşturursunuz.
İstem akışı RAG paketi, markdown dosyalarını almanızı, yerel olarak bir arama dizini oluşturmanızı ve bulut projesine kaydetmenizi sağlar. İstem akışı RAG paketini yükleyin:
pip install promptflow-rag
build_index.py dosyasını rag-tutorial klasörünüzde oluşturun.
Aşağıdaki kodu kopyalayıp build_index.py dosyanıza yapıştırın.
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))
- Değişkenini
index_name
istediğiniz dizinin adına ayarlayın. - Gerektiğinde, değişkenini
path_to_data
veri dosyalarınızın depolandığı yola güncelleştirebilirsiniz.
Önemli
Varsayılan olarak kod örneği, bu öğreticide daha önce açıklandığı gibi uygulama kodu yapısını bekler. Klasör,
data
build_index.py ve içinde md dosyaları bulunan indirilenproduct-info
klasörle aynı düzeyde olmalıdır.- Değişkenini
Dizininizi yerel olarak oluşturmak ve bulut projesine kaydetmek için konsolunuzdan kodu çalıştırın:
python build_index.py
Betik çalıştırıldıktan sonra yeni oluşturduğunuz dizini Azure AI Studio projenizin Dizinler sayfasında görüntüleyebilirsiniz. Daha fazla bilgi için bkz . Azure AI Studio'da vektör dizinleri oluşturma ve kullanma.
Betiği aynı dizin adıyla yeniden çalıştırırsanız, aynı dizinin yeni bir sürümünü oluşturur.
Arama dizini ortam değişkenini ayarlama
Kullanmak istediğiniz dizin adına sahip olduktan sonra (yeni bir tane oluşturarak veya var olan bir ada başvurarak) bunu .env dosyanıza ekleyin, örneğin:
AZUREAI_SEARCH_INDEX_NAME=<index-name>
Özel RAG kodu geliştirme
Daha sonra, temel bir sohbet uygulamasına alma artırılmış nesil (RAG) özellikleri eklemek için özel kod oluşturacaksınız. Hızlı başlangıçta chat.py ve chat.prompty dosyalarını oluşturdunuz. Burada bu kodu RAG özelliklerini içerecek şekilde genişletirsiniz.
RAG ile sohbet uygulaması aşağıdaki genel mantığı uygular:
- Kullanıcı sorgusu amacını ve sohbet geçmişini temel alan bir arama sorgusu oluşturma
- Sorguyu eklemek için ekleme modeli kullanma
- Sorgu göz önünde bulundurulduğunda arama dizininden ilgili belgeleri alma
- İlgili bağlamı Azure OpenAI sohbet tamamlama modeline geçirme
- Azure OpenAI modelinden yanıt döndürme
Sohbet uygulaması uygulama mantığı
Sohbet uygulaması uygulama mantığı copilot.py dosyasındadır. Bu dosya, RAG tabanlı sohbet uygulamasının temel mantığını içerir.
Rag-tutorial klasöründe copilot_flow adlı bir klasör oluşturun.
Ardından copilot_flow klasöründe copilot.py adlı bir dosya oluşturun.
copilot.py dosyasına aşağıdaki kodu ekleyin:
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 dosyası iki anahtar işlevi içerir: get_documents()
ve get_chat_response()
.
Bu iki işlevin dekoratöre @trace
sahip olduğunu ve her işlev çağrısı giriş ve çıkışlarının istem akış izleme günlüklerini görmenize olanak sağladığına dikkat edin. @trace
, hızlı başlangıcın izleme özelliklerini gösterme şekline alternatif ve genişletilmiş bir yaklaşımdır.
get_documents()
İşlev, RAG mantığının çekirdeğidir.
- Arama sorgusunu ve alınacak belge sayısını alır.
- Ekleme modeli kullanarak arama sorgusunu ekler.
- Sorguyla ilgili belgeleri almak için Azure Search dizinini sorgular.
- Belgelerin bağlamını döndürür.
İşlev, get_chat_response()
chat.py dosyanızdaki önceki mantıktan derlenmektedir:
chat_input
ve içindekilerichat_history
alır.- Arama sorgusunu amacına ve
chat_history
öğesine görechat_input
oluşturur. - İlgili belgeleri almak için çağrılar
get_documents()
. - Sorguya temel bir yanıt almak için bağlamı olan sohbet tamamlama modelini çağırır.
- Yanıtı ve bağlamı döndürür. Yazılan bir sözlüğü işlevimizin dönüş nesnesi olarak ayarladık
get_chat_response()
. Kodunuzun, kullanım örneğine en uygun yanıtı nasıl döndüreceğini seçebilirsiniz.
get_chat_response()
işlevi, gerekli Büyük Dil Modeli (LLM) çağrılarını yapmak için iki Prompty
dosya kullanır ve bundan sonra bunu ele alacağız.
Sohbet için istem şablonu
Chat.prompty dosyası basittir ve hızlı başlangıçtaki chat.prompty dosyasına benzer. Sistem istemi ürünümüzü yansıtacak şekilde güncelleştirilir ve istem şablonları belge bağlamını içerir.
copilot_flow dizinine chat.prompty dosyasını ekleyin. Dosya, sistem istemi, sohbet geçmişi ve belge bağlamı sağlanan sohbet tamamlama modeli çağrısını temsil eder.
Bu kodu chat.prompty dosyasına ekleyin:
--- 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}}
Sohbet geçmişi için istem şablonu
RAG tabanlı bir uygulama uyguladığımız için, yalnızca geçerli kullanıcı sorgusu için değil, aynı zamanda sohbet geçmişini de dikkate alarak ilgili belgeleri almak için bazı ek mantık gerekir. Bu ek mantık olmadan, LLM çağrınız sohbet geçmişini hesaba ekler. Ancak bu bağlam için doğru belgeleri almadığınızdan beklenen yanıtı alamazsınız.
Örneğin, kullanıcı "su geçirmez mi?" sorusunu sorarsa, sistemin sohbet geçmişine bakarak "it" sözcüğünün ne anlama geldiğini belirlemesi ve bu bağlamı eklemek için arama sorgusuna eklemesi gerekir. Bu şekilde "it" (belki Alp Explorer Tent) ve "maliyeti" için doğru belgeleri alıyoruz.
Yalnızca kullanıcının eklenecek sorgusunu geçirmek yerine, sohbet geçmişini hesaba katıştıran yeni bir arama sorgusu oluşturmamız gerekir. Sohbet geçmişine göre kullanıcı sorgusu amacını yorumlamak ve gerekli bağlama sahip bir arama sorgusu oluşturmak için belirli bir istem içeren başka Prompty
bir (başka bir LLM çağrısıdır) kullanırız.
copilot_flow klasöründe queryIntent.prompty dosyasını oluşturun.
İstem biçimiyle ilgili belirli ayrıntılar ve birkaç çekim örneği için bu kodu girin.
--- 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 dosyamızdaki basit sistem iletisi, RAG çözümünün sohbet geçmişiyle çalışması için gereken minimum değere ulaşır.
Gerekli paketleri yapılandırma
copilot_flow klasöründe dosya requirements.txt oluşturun. Bu içeriği ekleyin:
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
Akışın yerel olarak ve dağıtılan bir ortamda çalışması için bu paketler gereklidir.
Esnek akış kullanma
Daha önce belirtildiği gibi bu uygulama, akışları uygulamaya yönelik kod öncelikli yaklaşım olan istem akışının esnek akışını kullanır. Bir giriş işlevi (copilot.py içinde tanımlanır) belirtirsiniz. Esnek akış geliştirme bölümünde daha fazla bilgi edinin.
Bu yaml, içinde copilot.py
tanımlanan işlev olan get_chat_response
giriş işlevini belirtir. Ayrıca akışın çalışması için gereken gereksinimleri de belirtir.
copilot_flow klasöründe flow.flex.yaml dosyasını oluşturun. Bu içeriği ekleyin:
entry: copilot:get_chat_response
environment:
python_requirements_txt: requirements.txt
Sohbet uygulamanızı test etmek için istem akışını kullanma
Örnek girişlerde sohbet uygulamanızın beklendiği gibi nasıl performans sergilediğini görmek için istem akışının test özelliğini kullanın. flow.flex.yaml dosyanızı kullanarak, belirtilen girişlerinizle test etmek için istem akışını kullanabilirsiniz.
Şu istem akışı komutunu kullanarak akışı çalıştırın:
pf flow test --flow ./copilot_flow --inputs chat_input="how much do the Trailwalker shoes cost?"
Alternatif olarak, akışı bayrağıyla --ui
etkileşimli olarak çalıştırabilirsiniz.
pf flow test --flow ./copilot_flow --ui
kullandığınızda --ui
, etkileşimli örnek sohbet deneyimi yerel tarayıcınızda bir pencere açar.
- bayrakla ilk kez çalıştırdığınızda
--ui
, seçeneklerden sohbet girişlerinizi ve çıkışlarınızı el ile seçmeniz gerekir. Bu oturumu ilk kez oluşturduğunuzda Sohbet giriş/çıkış alanı yapılandırma ayarlarını seçin ve sohbete başlayın. - Bayrakla
--ui
bir sonraki çalıştırmanızda oturum ayarlarınızı anımsar.
Etkileşimli oturumunuzu bitirdiğinizde, sunucuyu durdurmak için terminal penceresine Ctrl + C girin.
Sohbet geçmişiyle test edin
Genel olarak, akışı iste ve Prompty
sohbet geçmişini destekle. Yerel olarak sunulan ön uçta bayrağıyla --ui
test ederseniz, sohbet geçmişinizi istem akışı yönetir. olmadan --ui
test ederseniz, sohbet geçmişini içeren bir giriş dosyası belirtebilirsiniz.
Uygulamamız RAG uyguladığından queryIntent.prompty dosyasında sohbet geçmişini işlemek için ek mantık eklememiz gerekiyordu.
Sohbet geçmişiyle test etmek için, copilot_flow klasöründe input_with_chat_history.json adlı bir dosya oluşturun ve bu içeriği yapıştırın:
{
"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."
}
]
}
Bu dosyayla test etmek için şunu çalıştırın:
pf flow test --flow ./copilot_flow --inputs ./copilot_flow/input_with_chat_history.json
Beklenen çıkış şöyledir: "Alpine Explorer Çadırı 350 ABD doları olarak fiyatlandı."
Bu sistem, "maliyeti nedir?" sorgusunun amacını yorumlayıp "bu" ifadesinin sohbet geçmişindeki en son bağlam olan Alpine Explorer Tent'i ifade ettiğini bilmektedir. Ardından sistem, AlpIne Explorer Tent'in maliyetine ilişkin ilgili belgeleri almak için AlpIne Explorer Tent'in fiyatı için bir arama sorgusu oluşturur ve yanıtı alırız.
Bu akış çalıştırmasından izleme bölümüne giderseniz, konuşmanın çalıştığını görürsünüz. Yerel izlemeler bağlantısı, akış testi çalıştırmasının sonucundan önce konsol çıkışında gösterilir.
Kaynakları temizleme
Gereksiz Azure maliyetlerine maruz kalmamak için, artık gerekli değilse bu öğreticide oluşturduğunuz kaynakları silmeniz gerekir. Kaynakları yönetmek için Azure portalını kullanabilirsiniz.
Ancak bu öğretici serisinin sonraki bölümünde sohbet uygulamanızı Azure'a dağıtmak istiyorsanız bunları henüz silmeyin.