Aracılığıyla paylaş


Öğ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.

  1. 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:

    1. AI Studio'da projenize gidin ve sol bölmeden Ayarlar'ı seçin.
    2. Proje özellikleri bölümünde Abonelik Kimliği ve Kaynak grubunu bulun. Ad alanı<your project name>
  • 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.

    Uç nokta ve bağlantı adlarını gösteren ekran görüntüsü.

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:

  1. AI Studio'da oturum açın ve Giriş sayfasına gidin.

  2. Sol kenar çubuğundan Model kataloğu'nu seçin.

  3. Koleksiyonlar filtresinde Azure OpenAI'yi seçin.

    Katalogda Azure OpenAI modellerine göre filtrelemeyi gösteren ekran görüntüsü.

  4. Azure OpenAI koleksiyonundan modeli seçin. İlk kez modeli seçin gpt-3.5-turbo . İkinci kez modeli seçin text-embedding-ada-002 .

  5. Dağıtım penceresini açmak için Dağıt'ı seçin.

  6. Modeli dağıtmak istediğiniz hub'ı seçin. Projenizle aynı hub'ı kullanın.

  7. Dağıtım adını belirtin ve gereksinimlerinize bağlı olarak diğer varsayılan ayarları değiştirin.

  8. Dağıt'ı seçin.

  9. Dağıtım ayrıntıları sayfasına gidin. Oyun alanında aç'ı seçin.

  10. 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:

winget install -e --id Microsoft.AzureCLI

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:

py -3 -m venv .venv
.venv\scripts\activate

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çerir
  • promptflow-tracing: Standartlarda OpenTelemetry izlemeleri yaymada kullanılan basit kitaplık
  • promptflow-devkit: yerel geliştirme ortamları için istem akışı test yatağı ve izleme görüntüleyici araçlarını içerir
  • openai: 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.

  1. 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.

  2. İ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
    
  3. build_index.py dosyasını rag-tutorial klasörünüzde oluşturun.

  4. 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 indirilen product-info klasörle aynı düzeyde olmalıdır.

  5. Dizininizi yerel olarak oluşturmak ve bulut projesine kaydetmek için konsolunuzdan kodu çalıştırın:

    python build_index.py
    
  6. 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.

  7. 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:

  1. Kullanıcı sorgusu amacını ve sohbet geçmişini temel alan bir arama sorgusu oluşturma
  2. Sorguyu eklemek için ekleme modeli kullanma
  3. Sorgu göz önünde bulundurulduğunda arama dizininden ilgili belgeleri alma
  4. İlgili bağlamı Azure OpenAI sohbet tamamlama modeline geçirme
  5. 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.

  1. Rag-tutorial klasöründe copilot_flow adlı bir klasör oluşturun.

  2. Ardından copilot_flow klasöründe copilot.py adlı bir dosya oluşturun.

  3. 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.

  1. Arama sorgusunu ve alınacak belge sayısını alır.
  2. Ekleme modeli kullanarak arama sorgusunu ekler.
  3. Sorguyla ilgili belgeleri almak için Azure Search dizinini sorgular.
  4. Belgelerin bağlamını döndürür.

İşlev, get_chat_response() chat.py dosyanızdaki önceki mantıktan derlenmektedir:

  1. chat_input ve içindekileri chat_historyalır.
  2. Arama sorgusunu amacına ve chat_historyöğesine göre chat_input oluşturur.
  3. İlgili belgeleri almak için çağrılar get_documents() .
  4. Sorguya temel bir yanıt almak için bağlamı olan sohbet tamamlama modelini çağırır.
  5. 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.

  1. 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.

  2. 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.

  1. copilot_flow klasöründe queryIntent.prompty dosyasını oluşturun.

  2. İ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.pytanı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.

Örnek sohbet deneyimini gösteren ekran görüntüsü.

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 --uitest 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.

ekran görüntüsü, istem akışının konsol çıkışını gösterir.

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.

Sonraki adım