Rychlý start: Chatování s modely Azure OpenAI s využitím vlastních dat

Ukázky balíčku zdrojového kódu | odkazu | (pypi) |

Výše uvedené odkazy odkazují na rozhraní OPENAI API pro Python. Sada OpenAI Python SDK specifická pro Azure neexistuje. Naučte se přepínat mezi službami OpenAI a službami Azure OpenAI.

V tomto rychlém startu můžete používat vlastní data s modely Azure OpenAI. Použití modelů Azure OpenAI na vašich datech vám může poskytnout výkonnou konverzační platformu AI, která umožňuje rychlejší a přesnější komunikaci.

Požadavky

Přidání dat pomocí nástroje Azure OpenAI Studio

Tip

Azure Developer CLI můžete použít k programovému vytvoření prostředků potřebných pro Azure OpenAI ve vašich datech.

Přejděte do Azure OpenAI Studia a přihlaste se pomocí přihlašovacích údajů, které mají přístup k vašemu prostředku Azure OpenAI. Během nebo po přihlášení vyberte příslušný adresář, předplatné Azure a prostředek Azure OpenAI.

  1. Výběr dlaždice Přineste si vlastní data

    Snímek obrazovky s cílovou stránkou Azure OpenAI Studio

  2. V zobrazeném podokně vyberte Nahrát soubory (Preview) v části Vybrat zdroj dat. Azure OpenAI potřebuje prostředek úložiště i vyhledávací prostředek pro přístup k datům a jeho indexování.

    Tip

    1. Aby služba Azure OpenAI přistupovala k vašemu účtu úložiště, budete muset zapnout sdílení prostředků mezi zdroji (CORS). Pokud cors ještě není pro prostředek Azure Blob Storage zapnutý, vyberte Zapnout CORS.

    2. Vyberte prostředek Služby Azure AI Search a vyberte potvrzení, že připojení k němu bude mít na vašem účtu využití. Pak vyberte Další.

    Snímek obrazovky znázorňující možnosti pro výběr zdroje dat v Nástroji Azure OpenAI Studio

  3. V podokně Nahrát soubory vyberte Vyhledat soubor a vyberte soubory, které jste stáhli v části Požadavky, nebo vlastní data. Pak vyberte Nahrát soubory. Pak vyberte Další.

  4. V podokně Správa dat můžete zvolit, jestli chcete povolit sémantické vyhledávání nebo vektorové vyhledávání indexu.

    Důležité

    • Sémantické vyhledávání a vektorové vyhledávání se řídí dalšími cenami. Pokud chcete povolit sémantické vyhledávání nebo vektorové vyhledávání, musíte zvolit skladovou položku Basic nebo vyšší. Další informace najdete v cenových úrovních a omezeních služeb.
    • Pokud chcete zlepšit kvalitu načítání informací a odpovědi modelu, doporučujeme povolit sémantické vyhledávání následujících jazyků zdrojů dat: angličtina, francouzština, španělština, portugalština, italština, Německo, čínština (Zh), japonština, korejština, ruština a arabština.
  5. Zkontrolujte zadané podrobnosti a vyberte Uložit a zavřít. Teď můžete chatovat s modelem a k vytvoření odpovědi budou používat informace z vašich dat.

Chatovací hřiště

Začněte zkoumat funkce Azure OpenAI pomocí přístupu bez kódu prostřednictvím chatovacího hřiště. Jedná se o textové pole, do kterého můžete odeslat výzvu k vygenerování dokončení. Na této stránce můžete rychle iterovat a experimentovat s možnostmi.

Snímek obrazovky se stránkou dětského hřiště v sadě Azure OpenAI Studio se zvýrazněnými oddíly

Dětské hřiště nabízí možnosti pro přizpůsobení chatu. Napravo můžete vybrat Nasazení a určit, který model vygeneruje odpověď pomocí výsledků hledání z indexu. Zvolíte počet minulých zpráv, které se mají zahrnout jako historie konverzací pro budoucí generované odpovědi. Historie konverzací poskytuje kontext pro generování souvisejících odpovědí, ale také využívá využití tokenů. Indikátor průběhu vstupního tokenu sleduje počet tokenů zadané otázky.

Rozšířená nastavení na levé straně jsou parametry modulu runtime, které vám umožňují řídit načítání a vyhledávání relevantních informací z vašich dat. Dobrým případem použití je, když chcete zajistit, aby se odpovědi vygenerovaly jenom na základě vašich dat, nebo když zjistíte, že model nemůže vygenerovat odpověď na základě informací o datech.

  • Striktnost určuje agresivitu systému při filtrování vyhledávacích dokumentů na základě skóre podobnosti. Nastavení striktnosti na hodnotu 5 značí, že systém agresivně odfiltruje dokumenty a použije velmi vysokou prahovou hodnotu podobnosti. Sémantické vyhledávání může být v tomto scénáři užitečné, protože modely řazení dělají lepší úlohu odvození záměru dotazu. Nižší úrovně striktnosti vytvářejí podrobnější odpovědi, ale můžou také obsahovat informace, které nejsou v indexu. Ve výchozím nastavení je tato hodnota nastavená na hodnotu 3.

  • Načtené dokumenty jsou celé číslo, které lze nastavit na 3, 5, 10 nebo 20 a řídí počet bloků dokumentů zadaných pro velký jazykový model pro formulaci konečné odpovědi. Ve výchozím nastavení je nastavená hodnota 5.

  • Pokud je povolená možnost Omezit odpovědi na vaše data , model se pokusí spoléhat jenom na vaše dokumenty pro odpovědi. Ve výchozím nastavení je tato hodnota nastavená na true.

Snímek obrazovky s rozšířeným nastavením

Odešlete první dotaz. Modely chatu fungují nejlépe ve cvičeních pro otázky a odpovědi. Například"Co jsou moje dostupné plány stavu?" nebo "Co je možnost plus stav?".

Dotazy, které vyžadují analýzu dat, pravděpodobně selžou, například "Který plán stavu je nejoblíbenější?". Dotazy, které vyžadují informace o všech datech, pravděpodobně selžou, například "Kolik dokumentů jsem nahrál?". Nezapomeňte, že vyhledávací web hledá bloky dat, které mají přesné nebo podobné termíny, fráze nebo výstavbu dotazu. I když model může otázku pochopit, pokud jsou výsledky hledání bloky dat ze sady dat, nejedná se o správné informace pro odpověď na tento druh otázky.

Chaty jsou omezené počtem dokumentů (bloků dat) vrácených v odpovědi (omezeno na 3–20 v dětském hřišti Azure OpenAI Studio). Jak si můžete představit, pokládání otázky týkající se "všech názvů" vyžaduje úplnou kontrolu celého úložiště vektorů.

Nasazení modelu

Jakmile budete spokojeni s prostředím v nástroji Azure OpenAI Studio, můžete webovou aplikaci nasadit přímo ze studia výběrem tlačítka Nasadit do .

Snímek obrazovky znázorňující tlačítko nasazení modelu v Nástroji Azure OpenAI Studio

To vám dává možnost buď nasadit do samostatné webové aplikace, nebo kopírovat v copilot Studiu (Preview), pokud používáte vlastní data v modelu.

Pokud se například rozhodnete nasadit webovou aplikaci:

Při prvním nasazení webové aplikace byste měli vybrat Vytvořit novou webovou aplikaci. Zvolte název aplikace, který se stane součástí adresy URL aplikace. Například https://<appname>.azurewebsites.net.

Vyberte předplatné, skupinu prostředků, umístění a cenový plán publikované aplikace. Pokud chcete aktualizovat existující aplikaci, vyberte Publikovat do existující webové aplikace a v rozevírací nabídce zvolte název předchozí aplikace.

Pokud se rozhodnete nasadit webovou aplikaci, podívejte se na důležité aspekty jeho použití.

Načtení požadovaných proměnných

K úspěšnému volání azure OpenAI potřebujete následující proměnné. V tomto rychlém startu se předpokládá, že jste data nahráli do účtu služby Azure Blob Storage a vytvořili jste index služby Azure AI Search. Viz Přidání dat pomocí nástroje Azure AI Studio

Název proměnné Hodnota
AZURE_OPENAI_ENDPOINT Tuto hodnotu najdete v části Klíče a koncový bod při zkoumání prostředku Azure OpenAI na webu Azure Portal. Hodnotu najdete také v zobrazení kódu chatovacího hřiště>Azure AI Studio>. Ukázkový koncový bod je: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Tuto hodnotu najdete v části Klíče správy>prostředků a koncový bod při zkoumání prostředku Azure OpenAI na webu Azure Portal. Použít můžete předponu KEY1 nebo KEY2. Vždy mít dva klíče vám umožní bezpečně otáčet a znovu vygenerovat klíče, aniž by to způsobilo přerušení služeb.
AZURE_OPENAI_DEPLOYMENT_ID Tato hodnota odpovídá vlastnímu názvu, který jste zvolili pro vaše nasazení při nasazení modelu. Tuto hodnotu najdete v části Nasazení správy>prostředků na webu Azure Portal nebo v části Nasazení správy>v nástroji Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Tuto hodnotu najdete v části Přehled při zkoumání prostředku Azure AI Search na webu Azure Portal.
AZURE_AI_SEARCH_API_KEY Tuto hodnotu najdete v části Nastavení> Klíče při zkoumání prostředku Azure AI Search z webu Azure Portal. Můžete použít primární klíč správce nebo sekundární klíč správce. Vždy mít dva klíče vám umožní bezpečně otáčet a znovu vygenerovat klíče, aniž by to způsobilo přerušení služeb.
AZURE_AI_SEARCH_INDEX Tato hodnota odpovídá názvu indexu, který jste vytvořili pro ukládání dat. Najdete ho v části Přehled při zkoumání prostředku Azure AI Search na webu Azure Portal.

Proměnné prostředí

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

Vytvoření nové aplikace .NET Core

V okně konzoly (například cmd, PowerShell nebo Bash) pomocí dotnet new příkazu vytvořte novou konzolovou aplikaci s názvem azure-openai-quickstart. Tento příkaz vytvoří jednoduchý projekt Hello World s jedním zdrojovým souborem jazyka C#: Program.cs.

dotnet new console -n azure-openai-quickstart

Změňte adresář na nově vytvořenou složku aplikace. Aplikaci můžete sestavit pomocí následujících:

dotnet build

Výstup sestavení by neměl obsahovat žádná upozornění ani chyby.

...
Build succeeded.
 0 Warning(s)
 0 Error(s)
...

Nainstalujte klientskou knihovnu OpenAI .NET pomocí:

dotnet add package Azure.AI.OpenAI --prerelease

V adresáři projektu otevřete soubor Program.cs a nahraďte jeho obsah následujícím kódem:

Bez streamování odpovědí

using Azure;
using Azure.AI.OpenAI;
using System.Text.Json;
using static System.Environment;

string azureOpenAIEndpoint = GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT");
string azureOpenAIKey = GetEnvironmentVariable("AZURE_OPENAI_API_KEY");
string deploymentName = GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_ID");
string searchEndpoint = GetEnvironmentVariable("AZURE_AI_SEARCH_ENDPOINT");
string searchKey = GetEnvironmentVariable("AZURE_AI_SEARCH_API_KEY");
string searchIndex = GetEnvironmentVariable("AZURE_AI_SEARCH_INDEX");


var client = new OpenAIClient(new Uri(azureOpenAIEndpoint), new AzureKeyCredential(azureOpenAIKey));

var chatCompletionsOptions = new ChatCompletionsOptions()
{
    Messages =
    {
        new ChatRequestUserMessage("What are my available health plans?"),
    },
    AzureExtensionsOptions = new AzureChatExtensionsOptions()
    {
        Extensions =
        {
            new AzureCognitiveSearchChatExtensionConfiguration()
            {
                SearchEndpoint = new Uri(searchEndpoint),
                Key = searchKey,
                IndexName = searchIndex,
            },
        }
    },
    DeploymentName = deploymentName
};

Response<ChatCompletions> response = client.GetChatCompletions(chatCompletionsOptions);

ChatResponseMessage responseMessage = response.Value.Choices[0].Message;

Console.WriteLine($"Message from {responseMessage.Role}:");
Console.WriteLine("===");
Console.WriteLine(responseMessage.Content);
Console.WriteLine("===");

Console.WriteLine($"Context information (e.g. citations) from chat extensions:");
Console.WriteLine("===");
foreach (ChatResponseMessage contextMessage in responseMessage.AzureExtensionsContext.Messages)
{
    string contextContent = contextMessage.Content;
    try
    {
        var contextMessageJson = JsonDocument.Parse(contextMessage.Content);
        contextContent = JsonSerializer.Serialize(contextMessageJson, new JsonSerializerOptions()
        {
            WriteIndented = true,
        });
    }
    catch (JsonException)
    {}
    Console.WriteLine($"{contextMessage.Role}: {contextContent}");
}
Console.WriteLine("===");

Důležité

V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace o zabezpečení přihlašovacích údajů najdete v článku zabezpečení služeb Azure AI.

dotnet run program.cs

Výstup

Answer from assistant:
===
The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans [^1^].
===
Context information (e.g. citations) from chat extensions:
===
tool: {
  "citations": [
    {
      "content": "...",
      "id": null,
      "title": "...",
      "filepath": "...",
      "url": "...",
      "metadata": {
        "chunking": "orignal document size=1011. Scores=3.6390076 and None.Org Highlight count=38."
      },
      "chunk_id": "2"
    },
    ...
  ],
  "intent": "[\u0022What are my available health plans?\u0022]"
}
===

Před tiskem výsledků bude model čekat, až model vygeneruje celou odpověď. Pokud chcete asynchronně streamovat odpověď a vytisknout výsledky, můžete obsah Program.cs nahradit kódem v dalším příkladu.

Asynchronní s využitím streamování

using Azure;
using Azure.AI.OpenAI;
using System.Text.Json;
using static System.Environment;

string azureOpenAIEndpoint = GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT");
string azureOpenAIKey = GetEnvironmentVariable("AZURE_OPENAI_API_KEY");
string deploymentName = GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_ID");
string searchEndpoint = GetEnvironmentVariable("AZURE_AI_SEARCH_ENDPOINT");
string searchKey = GetEnvironmentVariable("AZURE_AI_SEARCH_API_KEY");
string searchIndex = GetEnvironmentVariable("AZURE_AI_SEARCH_INDEX");


var client = new OpenAIClient(new Uri(azureOpenAIEndpoint), new AzureKeyCredential(azureOpenAIKey));

var chatCompletionsOptions = new ChatCompletionsOptions()
{
    DeploymentName = deploymentName,
    Messages =
    {
        new ChatRequestUserMessage("What are my available health plans?"),
    },
    AzureExtensionsOptions = new AzureChatExtensionsOptions()
    {
        Extensions =
        {
            new AzureCognitiveSearchChatExtensionConfiguration()
            {
                SearchEndpoint = new Uri(searchEndpoint),
                Key = searchKey,
                IndexName = searchIndex,
            },
        }
    }
};
await foreach (StreamingChatCompletionsUpdate chatUpdate in client.GetChatCompletionsStreaming(chatCompletionsOptions))
{
    if (chatUpdate.Role.HasValue)
    {
        Console.Write($"{chatUpdate.Role.Value.ToString().ToUpperInvariant()}: ");
    }
    if (!string.IsNullOrEmpty(chatUpdate.ContentUpdate))
    {
        Console.Write(chatUpdate.ContentUpdate);
    }
}

Načtení požadovaných proměnných

K úspěšnému volání azure OpenAI potřebujete následující proměnné. V tomto rychlém startu se předpokládá, že jste data nahráli do účtu služby Azure Blob Storage a vytvořili jste index služby Azure AI Search. Další informace najdete v tématu Přidání dat pomocí nástroje Azure AI Studio.

Název proměnné Hodnota
AZURE_OPENAI_ENDPOINT Tuto hodnotu najdete v části Klíče a koncový bod při zkoumání prostředku Azure OpenAI z webu Azure Portal. Hodnotu najdete také v zobrazení kódu chatovacího hřiště>Azure AI Studio>. Ukázkový koncový bod je: https://my-resource.openai.azure.com.
AZURE_OPENAI_API_KEY Tuto hodnotu najdete v části Klíče správy>prostředků a koncový bod při zkoumání prostředku Azure OpenAI z webu Azure Portal. Použít můžete předponu KEY1 nebo KEY2. Vždy mít dva klíče vám umožní bezpečně otáčet a znovu vygenerovat klíče, aniž by to způsobilo přerušení služeb.
AZURE_OPEN_AI_DEPLOYMENT_ID Tato hodnota odpovídá vlastnímu názvu, který jste zvolili pro vaše nasazení při nasazení modelu. Tuto hodnotu najdete v části Nasazení správy>prostředků na webu Azure Portal nebo v části Nasazení správy>v nástroji Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Tuto hodnotu najdete v části Přehled při zkoumání prostředku Azure AI Search na webu Azure Portal.
AZURE_AI_SEARCH_API_KEY Tuto hodnotu najdete v části Nastavení> Klíče při zkoumání prostředku Azure AI Search na webu Azure Portal. Můžete použít primární klíč správce nebo sekundární klíč správce. Vždy mít dva klíče vám umožní bezpečně otáčet a znovu vygenerovat klíče, aniž by to způsobilo přerušení služeb.
AZURE_AI_SEARCH_INDEX Tato hodnota odpovídá názvu indexu, který jste vytvořili pro ukládání dat. Najdete ho v části Přehled při zkoumání prostředku Azure AI Search na webu Azure Portal.

Proměnné prostředí

Poznámka:

Spring AI ve výchozím nastavení nastaví název modelu na gpt-35-turbo. Hodnotu je nutné zadat SPRING_AI_AZURE_OPENAI_MODEL jenom v případě, že jste nasadili model s jiným názvem.

export SPRING_AI_AZURE_OPENAI_ENDPOINT=REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
export SPRING_AI_AZURE_OPENAI_API_KEY=REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
export SPRING_AI_AZURE_COGNITIVE_SEARCH_ENDPOINT=REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
export SPRING_AI_AZURE_COGNITIVE_SEARCH_API_KEY=REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
export SPRING_AI_AZURE_COGNITIVE_SEARCH_INDEX=REPLACE_WITH_YOUR_INDEX_NAME_HERE
export SPRING_AI_AZURE_OPENAI_MODEL=REPLACE_WITH_YOUR_MODEL_NAME_HERE

Vytvoření nové aplikace Spring

Spring AI v současné době nepodporuje AzureCognitiveSearchChatExtensionConfiguration možnosti, které umožňují dotazu Azure AI zapouzdřit metodu Retrieval Augmented Generation (RAG) a skrýt podrobnosti od uživatele. Jako alternativu můžete metodu RAG vyvolat přímo ve vaší aplikaci k dotazování dat v indexu Azure AI Search a k rozšíření dotazu použít načtené dokumenty.

Spring AI podporuje abstrakci VectorStore a službu Azure AI Search můžete zabalit do implementace Spring AI VectorStore pro dotazování vlastních dat. Následující projekt implementuje vlastní VectorStore zálohovaný službou Azure AI Search a přímo provádí operace RAG.

V okně Bash vytvořte pro aplikaci nový adresář a přejděte na něj.

mkdir ai-custom-data-demo && cd ai-custom-data-demo

spring init Spusťte příkaz z pracovního adresáře. Tento příkaz vytvoří standardní adresářovou strukturu projektu Spring, včetně hlavního zdrojového souboru třídy Java a souboru pom.xml používaného ke správě projektů založených na Mavenu.

spring init -a ai-custom-data-demo -n AICustomData --force --build maven -x

Vygenerované soubory a složky se podobají následující struktuře:

ai-custom-data-demo/
|-- pom.xml
|-- mvn
|-- mvn.cmd
|-- HELP.md
|-- src/
    |-- main/
    |   |-- resources/
    |   |   |-- application.properties
    |   |-- java/
    |       |-- com/
    |           |-- example/
    |               |-- aicustomdatademo/
    |                   |-- AiCustomDataApplication.java
    |-- test/
        |-- java/
            |-- com/
                |-- example/
                    |-- aicustomdatademo/
                        |-- AiCustomDataApplicationTests.java

Upravit aplikaci Spring

  1. Upravte soubor pom.xml.

    V kořenovém adresáři projektu otevřete soubor pom.xml v preferovaném editoru nebo integrovaném vývojovém prostředí (IDE) a přepište soubor následujícím obsahem:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>3.2.0</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.example</groupId>
        <artifactId>ai-custom-data-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>AICustomData</name>
        <description>Demo project for Spring Boot</description>
        <properties>
            <java.version>17</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.experimental.ai</groupId>
                <artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId>
                <version>0.7.0-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>com.azure</groupId>
                <artifactId>azure-search-documents</artifactId>
                <version>11.6.0-beta.10</version>
                <exclusions>
                    <!-- exclude this to avoid changing the default serializer and the null-value behavior -->
                    <exclusion>
                        <groupId>com.azure</groupId>
                        <artifactId>azure-core-serializer-json-jackson</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
        <repositories>
            <repository>
                <id>spring-snapshots</id>
                <name>Spring Snapshots</name>
                <url>https://repo.spring.io/snapshot</url>
                <releases>
                    <enabled>false</enabled>
                </releases>
            </repository>
        </repositories>
    </project>
    
  2. Ve složce src/main/java/com/example/aicustomdatademo otevřete AiCustomDataApplication.java v preferovaném editoru nebo integrovaném vývojovém prostředí a vložte následující kód:

    package com.example.aicustomdatademo;
    
    import java.util.Collections;
    import java.util.List;
    import java.util.Map;
    import java.util.Optional;
    import java.util.stream.Collectors;
    
    import org.springframework.ai.client.AiClient;
    import org.springframework.ai.document.Document;
    import org.springframework.ai.embedding.EmbeddingClient;
    import org.springframework.ai.prompt.Prompt;
    import org.springframework.ai.prompt.SystemPromptTemplate;
    import org.springframework.ai.prompt.messages.MessageType;
    import org.springframework.ai.prompt.messages.UserMessage;
    import org.springframework.ai.vectorstore.VectorStore;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    
    import com.azure.core.credential.AzureKeyCredential;
    import com.azure.core.util.Context;
    import com.azure.search.documents.SearchClient;
    import com.azure.search.documents.SearchClientBuilder;
    import com.azure.search.documents.models.IndexingResult;
    import com.azure.search.documents.models.SearchOptions;
    import com.azure.search.documents.models.RawVectorQuery;
    
    import lombok.AllArgsConstructor;
    import lombok.NoArgsConstructor;
    import lombok.Builder;
    import lombok.Data;
    import lombok.extern.jackson.Jacksonized;
    
    @SpringBootApplication
    public class AiCustomDataApplication implements CommandLineRunner
    {
        private static final String ROLE_INFO_KEY = "role";
    
        private static final String template = """
                You are a helpful assistant. Use the information from the DOCUMENTS section to augment answers.
    
                DOCUMENTS:
                {documents}
                """;
    
        @Value("${spring.ai.azure.cognitive-search.endpoint}")
        private String acsEndpoint;
    
        @Value("${spring.ai.azure.cognitive-search.api-key}")
        private String acsApiKey;
    
        @Value("${spring.ai.azure.cognitive-search.index}")
        private String acsIndexName;
    
        @Autowired
        private AiClient aiClient;
    
        @Autowired
        private EmbeddingClient embeddingClient;
    
        public static void main(String[] args) {
            SpringApplication.run(AiCustomDataApplication.class, args);
        }
    
        @Override
        public void run(String... args) throws Exception
        {
            System.out.println(String.format("Sending custom data prompt to AI service. One moment please...\r\n"));
    
            final var store = vectorStore(embeddingClient);
    
            final String question = "What are my available health plans?";
    
            final var candidateDocs = store.similaritySearch(question);
    
            final var userMessage = new UserMessage(question);
    
            final String docPrompts =
                    candidateDocs.stream().map(entry -> entry.getContent()).collect(Collectors.joining("\n"));
    
            final SystemPromptTemplate promptTemplate = new SystemPromptTemplate(template);
            final var systemMessage = promptTemplate.createMessage(Map.of("documents", docPrompts));
    
            final var prompt = new Prompt(List.of(systemMessage, userMessage));
    
            final var resps = aiClient.generate(prompt);
    
            System.out.println(String.format("Prompt created %d generated response(s).", resps.getGenerations().size()));
    
            resps.getGenerations().stream()
              .forEach(gen -> {
                  final var role = gen.getInfo().getOrDefault(ROLE_INFO_KEY, MessageType.ASSISTANT.getValue());
    
                  System.out.println(String.format("Generated respose from \"%s\": %s", role, gen.getText()));
              });
    
        }
    
        @Bean
        public VectorStore vectorStore(EmbeddingClient embeddingClient)
        {
            final SearchClient searchClient = new SearchClientBuilder()
                    .endpoint(acsEndpoint)
                    .credential(new AzureKeyCredential(acsApiKey))
                    .indexName(acsIndexName)
                    .buildClient();
            return new AzureCognitiveSearchVectorStore(searchClient, embeddingClient);
        }
    
        public static class AzureCognitiveSearchVectorStore implements VectorStore
        {
            private static final int DEFAULT_TOP_K = 4;
    
            private static final Double DEFAULT_SIMILARITY_THRESHOLD = 0.0;
    
            private SearchClient searchClient;
    
            private final EmbeddingClient embeddingClient;
    
            public AzureCognitiveSearchVectorStore(SearchClient searchClient, EmbeddingClient embeddingClient)
            {
                this.searchClient = searchClient;
                this.embeddingClient = embeddingClient;
            }
    
            @Override
            public void add(List<Document> documents)
            {
                final var docs = documents.stream().map(document -> {
    
                    final var embeddings = embeddingClient.embed(document);
    
                    return new DocEntry(document.getId(), "", document.getContent(), embeddings);
    
                }).toList();
    
                searchClient.uploadDocuments(docs);
            }
    
            @Override
            public Optional<Boolean> delete(List<String> idList)
            {
                final List<DocEntry> docIds = idList.stream().map(id -> DocEntry.builder().id(id).build())
                    .toList();
    
                var results = searchClient.deleteDocuments(docIds);
    
                boolean resSuccess = true;
    
                for (IndexingResult result : results.getResults())
                    if (!result.isSucceeded()) {
                        resSuccess = false;
                        break;
                    }
    
                return Optional.of(resSuccess);
            }
    
            @Override
            public List<Document> similaritySearch(String query)
            {
                return similaritySearch(query, DEFAULT_TOP_K);
            }
    
            @Override
            public List<Document> similaritySearch(String query, int k)
            {
                return similaritySearch(query, k, DEFAULT_SIMILARITY_THRESHOLD);
            }
    
            @Override
            public List<Document> similaritySearch(String query, int k, double threshold)
            {
                final var searchQueryVector = new RawVectorQuery()
                        .setVector(toFloatList(embeddingClient.embed(query)))
                        .setKNearestNeighborsCount(k)
                        .setFields("contentVector");
    
                final var searchResults = searchClient.search(null,
                        new SearchOptions().setVectorQueries(searchQueryVector), Context.NONE);
    
                return searchResults.stream()
                        .filter(r -> r.getScore() >= threshold)
                        .map(r -> {
    
                            final DocEntry entry = r.getDocument(DocEntry.class);
    
                            final Document doc = new Document(entry.getId(), entry.getContent(), Collections.emptyMap());
                            doc.setEmbedding(entry.getContentVector());
    
                            return doc;
                        })
                        .collect(Collectors.toList());
            }
    
            private List<Float> toFloatList(List<Double> doubleList)
            {
                return doubleList.stream().map(Double::floatValue).toList();
            }
    
        }
    
        @Data
        @Builder
        @Jacksonized
        @AllArgsConstructor
        @NoArgsConstructor
        static class DocEntry
        {
            private String id;
    
            private String hash;
    
            private String content;
    
            private List<Double> contentVector;
        }
    
    }
    

    Důležité

    V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace o zabezpečení přihlašovacích údajů najdete v článku zabezpečení služeb Azure AI.

  3. Přejděte zpět do kořenové složky projektu a spusťte aplikaci pomocí následujícího příkazu:

    ./mvnw spring-boot:run
    

Výstup

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.1.5)

2023-11-07T14:40:45.250-06:00  INFO 18557 --- [           main] c.e.a.AiCustomDataApplication            : No active profile set, falling back to 1 default profile: "default"
2023-11-07T14:40:46.035-06:00  INFO 18557 --- [           main] c.e.a.AiCustomDataApplication            : Started AiCustomDataApplication in 1.095 seconds (process running for 1.397)
Sending custom data prompt to AI service. One moment please...

Prompt created 1 generated response(s).
Generated response from "assistant": The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans.

Načtení požadovaných proměnných

K úspěšnému volání azure OpenAI potřebujete následující proměnné. V tomto rychlém startu se předpokládá, že jste data nahráli do účtu služby Azure Blob Storage a vytvořili jste index služby Azure AI Search. Viz Přidání dat pomocí nástroje Azure AI Studio

Název proměnné Hodnota
AZURE_OPENAI_ENDPOINT Tuto hodnotu najdete v části Klíče a koncový bod při zkoumání prostředku Azure OpenAI na webu Azure Portal. Hodnotu najdete také v zobrazení kódu chatovacího hřiště>Azure AI Studio>. Ukázkový koncový bod je: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Tuto hodnotu najdete v části Klíče správy>prostředků a koncový bod při zkoumání prostředku Azure OpenAI na webu Azure Portal. Použít můžete předponu KEY1 nebo KEY2. Vždy mít dva klíče vám umožní bezpečně otáčet a znovu vygenerovat klíče, aniž by to způsobilo přerušení služeb.
AZURE_OPENAI_DEPLOYMENT_ID Tato hodnota odpovídá vlastnímu názvu, který jste zvolili pro vaše nasazení při nasazení modelu. Tuto hodnotu najdete v části Nasazení správy>prostředků na webu Azure Portal nebo v části Nasazení správy>v nástroji Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Tuto hodnotu najdete v části Přehled při zkoumání prostředku Azure AI Search na webu Azure Portal.
AZURE_AI_SEARCH_API_KEY Tuto hodnotu najdete v části Nastavení> Klíče při zkoumání prostředku Azure AI Search z webu Azure Portal. Můžete použít primární klíč správce nebo sekundární klíč správce. Vždy mít dva klíče vám umožní bezpečně otáčet a znovu vygenerovat klíče, aniž by to způsobilo přerušení služeb.
AZURE_AI_SEARCH_INDEX Tato hodnota odpovídá názvu indexu, který jste vytvořili pro ukládání dat. Najdete ho v části Přehled při zkoumání prostředku Azure AI Search na webu Azure Portal.

Proměnné prostředí

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

Vytvoření aplikace Node

V okně konzoly (například cmd, PowerShell nebo Bash) vytvořte pro vaši aplikaci nový adresář a přejděte do něj. Potom spuštěním npm init příkazu vytvořte aplikaci uzlu se souborem package.json .

npm init

Instalace klientské knihovny

Nainstalujte klienta Azure OpenAI a knihovny identit Azure pro JavaScript pomocí npm:

npm install @azure/openai @azure/identity

Soubor package.json vaší aplikace se aktualizuje o závislosti.

Vytvoření ukázkové aplikace

Otevřete příkazový řádek, na kterém chcete nový projekt, a vytvořte nový soubor s názvem ChatWithOwnData.js. Do souboru ChatWithOwnData.js zkopírujte následující kód.

const { OpenAIClient, AzureKeyCredential } = require("@azure/openai");

// Set the Azure and AI Search values from environment variables
const endpoint = process.env["AZURE_OPENAI_ENDPOINT"];
const azureApiKey = process.env["AZURE_OPENAI_API_KEY"];
const deploymentId = process.env["AZURE_OPENAI_DEPLOYMENT_ID"];
const searchEndpoint = process.env["AZURE_AI_SEARCH_ENDPOINT"];
const searchKey = process.env["AZURE_AI_SEARCH_API_KEY"];
const searchIndex = process.env["AZURE_AI_SEARCH_INDEX"];


async function main(){
  const client = new OpenAIClient(endpoint, new AzureKeyCredential(azureApiKey));

  const messages = [
    { role: "user", content: "What are my available health plans?" },
  ];

  console.log(`Message: ${messages.map((m) => m.content).join("\n")}`);

  const events = await client.streamChatCompletions(deploymentId, messages, { 
    maxTokens: 128,
    azureExtensionOptions: {
      extensions: [
        {
          type: "AzureCognitiveSearch",
          endpoint: searchEndpoint,
          key: searchKey,
          indexName: searchIndex,
        },
      ],
    },
  });
  let response = "";
  for await (const event of events) {
    for (const choice of event.choices) {
      const newText = choice.delta?.content;
      if (!!newText) {
        response += newText;
        // To see streaming results as they arrive, uncomment line below
        // console.log(newText);
      }
    }
  }
  console.log(response);
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
});



module.exports = { main };

Důležité

V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace o zabezpečení přihlašovacích údajů najdete v článku zabezpečení služeb Azure AI.

node.exe ChatWithOwnData.js

Výstup

Message: What are my available health plans?
The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans.

Načtení požadovaných proměnných

K úspěšnému volání azure OpenAI potřebujete následující proměnné. V tomto rychlém startu se předpokládá, že jste data nahráli do účtu služby Azure Blob Storage a vytvořili jste index služby Azure AI Search. Viz Přidání dat pomocí nástroje Azure AI Studio

Název proměnné Hodnota
AZURE_OPENAI_ENDPOINT Tuto hodnotu najdete v části Klíče a koncový bod při zkoumání prostředku Azure OpenAI na webu Azure Portal. Hodnotu najdete také v zobrazení kódu chatovacího hřiště>Azure AI Studio>. Ukázkový koncový bod je: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Tuto hodnotu najdete v části Klíče správy>prostředků a koncový bod při zkoumání prostředku Azure OpenAI na webu Azure Portal. Použít můžete předponu KEY1 nebo KEY2. Vždy mít dva klíče vám umožní bezpečně otáčet a znovu vygenerovat klíče, aniž by to způsobilo přerušení služeb.
AZURE_OPENAI_DEPLOYMENT_ID Tato hodnota odpovídá vlastnímu názvu, který jste zvolili pro vaše nasazení při nasazení modelu. Tuto hodnotu najdete v části Nasazení správy>prostředků na webu Azure Portal nebo v části Nasazení správy>v nástroji Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Tuto hodnotu najdete v části Přehled při zkoumání prostředku Azure AI Search na webu Azure Portal.
AZURE_AI_SEARCH_API_KEY Tuto hodnotu najdete v části Nastavení> Klíče při zkoumání prostředku Azure AI Search z webu Azure Portal. Můžete použít primární klíč správce nebo sekundární klíč správce. Vždy mít dva klíče vám umožní bezpečně otáčet a znovu vygenerovat klíče, aniž by to způsobilo přerušení služeb.
AZURE_AI_SEARCH_INDEX Tato hodnota odpovídá názvu indexu, který jste vytvořili pro ukládání dat. Najdete ho v části Přehled při zkoumání prostředku Azure AI Search na webu Azure Portal.

Proměnné prostředí

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

Vytvoření prostředí Pythonu

  1. Vytvořte novou složku s názvem openai-python pro váš projekt a nový soubor kódu Pythonu s názvem main.py. Přejděte do adresáře:
mkdir openai-python
cd openai-python
  1. Nainstalujte následující knihovny Pythonu:
pip install openai
pip install python-dotenv

Vytvoření aplikace v Pythonu

  1. V adresáři projektu otevřete soubor main.py a přidejte následující kód:
import os
import openai
import dotenv

dotenv.load_dotenv()

endpoint = os.environ.get("AZURE_OPENAI_ENDPOINT")
api_key = os.environ.get("AZURE_OPENAI_API_KEY")
deployment = os.environ.get("AZURE_OPENAI_DEPLOYMENT_ID")

client = openai.AzureOpenAI(
    azure_endpoint=endpoint,
    api_key=api_key,
    api_version="2024-02-01",
)

completion = client.chat.completions.create(
    model=deployment,
    messages=[
        {
            "role": "user",
            "content": "What are my available health plans?",
        },
    ],
    extra_body={
        "data_sources":[
            {
                "type": "azure_search",
                "parameters": {
                    "endpoint": os.environ["AZURE_AI_SEARCH_ENDPOINT"],
                    "index_name": os.environ["AZURE_AI_SEARCH_INDEX"],
                    "authentication": {
                        "type": "api_key",
                        "key": os.environ["AZURE_AI_SEARCH_API_KEY"],
                    }
                }
            }
        ],
    }
)

print(completion.model_dump_json(indent=2))

Důležité

V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace o zabezpečení přihlašovacích údajů najdete v článku zabezpečení služeb Azure AI.

  1. Spusťte následující příkaz:
python main.py

Aplikace vytiskne odpověď ve formátu JSON vhodném pro použití v mnoha scénářích. Obsahuje odpovědi na váš dotaz i citace z nahraných souborů.

Načtení požadovaných proměnných

K úspěšnému volání azure OpenAI potřebujete následující proměnné. V tomto rychlém startu se předpokládá, že jste data nahráli do účtu služby Azure Blob Storage a vytvořili jste index služby Azure AI Search. Viz Přidání dat pomocí nástroje Azure AI Studio

Název proměnné Hodnota
AZURE_OPENAI_ENDPOINT Tuto hodnotu najdete v části Klíče a koncový bod při zkoumání prostředku Azure OpenAI na webu Azure Portal. Hodnotu najdete také v zobrazení kódu chatovacího hřiště>Azure AI Studio>. Ukázkový koncový bod je: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Tuto hodnotu najdete v části Klíče správy>prostředků a koncový bod při zkoumání prostředku Azure OpenAI na webu Azure Portal. Použít můžete předponu KEY1 nebo KEY2. Vždy mít dva klíče vám umožní bezpečně otáčet a znovu vygenerovat klíče, aniž by to způsobilo přerušení služeb.
AZURE_OPENAI_DEPLOYMENT_ID Tato hodnota odpovídá vlastnímu názvu, který jste zvolili pro vaše nasazení při nasazení modelu. Tuto hodnotu najdete v části Nasazení správy>prostředků na webu Azure Portal nebo v části Nasazení správy>v nástroji Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Tuto hodnotu najdete v části Přehled při zkoumání prostředku Azure AI Search na webu Azure Portal.
AZURE_AI_SEARCH_API_KEY Tuto hodnotu najdete v části Nastavení> Klíče při zkoumání prostředku Azure AI Search z webu Azure Portal. Můžete použít primární klíč správce nebo sekundární klíč správce. Vždy mít dva klíče vám umožní bezpečně otáčet a znovu vygenerovat klíče, aniž by to způsobilo přerušení služeb.
AZURE_AI_SEARCH_INDEX Tato hodnota odpovídá názvu indexu, který jste vytvořili pro ukládání dat. Najdete ho v části Přehled při zkoumání prostředku Azure AI Search na webu Azure Portal.

Proměnné prostředí

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

Příklady příkazů PowerShellu

Modely chatu Azure OpenAI jsou optimalizované pro práci se vstupy formátovanými jako konverzace. Proměnná messages předává pole slovníků s různými rolemi v konverzaci vypisované systémem, uživatelem, nástrojem a asistentem. Proměnná dataSources se připojí k indexu služby Azure Cognitive Search a umožňuje modelům Azure OpenAI reagovat pomocí vašich dat.

Pokud chcete aktivovat odpověď z modelu, měli byste ukončit zprávu uživatele, která indikuje, že se jedná o pomocnou odpověď.

Tip

Existuje několik parametrů, které můžete použít ke změně odpovědi modelu, například temperaturetop_p. Další informace najdete v referenční dokumentaci .

# Azure OpenAI metadata variables
   $openai = @{
       api_key     = $Env:AZURE_OPENAI_API_KEY
       api_base    = $Env:AZURE_OPENAI_ENDPOINT # your endpoint should look like the following https://YOUR_RESOURCE_NAME.openai.azure.com/
       api_version = '2023-07-01-preview' # this may change in the future
       name        = 'YOUR-DEPLOYMENT-NAME-HERE' #This will correspond to the custom name you chose for your deployment when you deployed a model.
   }

   $acs = @{
       search_endpoint     = 'YOUR ACS ENDPOINT' # your endpoint should look like the following https://YOUR_RESOURCE_NAME.search.windows.net/
       search_key    = 'YOUR-ACS-KEY-HERE' # or use the Get-Secret cmdlet to retrieve the value
       search_index = 'YOUR-INDEX-NAME-HERE' # the name of your ACS index
   }

   # Completion text
   $body = @{
    dataSources = @(
        @{
            type = 'AzureCognitiveSearch'
            parameters = @{
                    endpoint = $acs.search_endpoint
                    key = $acs.search_key
                    indexName = $acs.search_index
                }
        }
    )
    messages = @(
            @{
                role = 'user'
                content = 'What are my available health plans?'
            }
    )
   } | convertto-json -depth 5

   # Header for authentication
   $headers = [ordered]@{
       'api-key' = $openai.api_key
   }

   # Send a completion call to generate an answer
   $url = "$($openai.api_base)/openai/deployments/$($openai.name)/extensions/chat/completions?api-version=$($openai.api_version)"

   $response = Invoke-RestMethod -Uri $url -Headers $headers -Body $body -Method Post -ContentType 'application/json'
   return $response.choices.messages[1].content

Příklad výstupu

The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans.

Důležité

V produkčním prostředí použijte zabezpečený způsob ukládání a přístupu k přihlašovacím údajům, jako je správa tajných kódů PowerShellu pomocí služby Azure Key Vault. Další informace o zabezpečení přihlašovacích údajů najdete v článku zabezpečení služeb Azure AI.

Chatování s modelem pomocí webové aplikace

Pokud chcete začít chatovat s modelem Azure OpenAI, který používá vaše data, můžete nasadit webovou aplikaci pomocí nástroje Azure OpenAI Studio nebo ukázkového kódu, který poskytujeme na GitHubu. Tato aplikace se nasadí pomocí služby Azure App Service a poskytuje uživatelské rozhraní pro odesílání dotazů. Tuto aplikaci je možné použít modely Azure OpenAI, které používají vaše data, nebo modely, které vaše data nepoužívají. Pokyny k požadavkům, nastavení a nasazení najdete v souboru readme v úložišti. Volitelně můžete přizpůsobit front-endovou a back-endovou logiku webové aplikace provedením změn ve zdrojovém kódu.

Načtení požadovaných proměnných

K úspěšnému volání azure OpenAI potřebujete následující proměnné. V tomto rychlém startu se předpokládá, že jste data nahráli do účtu služby Azure Blob Storage a vytvořili jste index služby Azure AI Search. Viz Přidání dat pomocí nástroje Azure AI Studio

Název proměnné Hodnota
AZURE_OPENAI_ENDPOINT Tuto hodnotu najdete v části Klíče a koncový bod při zkoumání prostředku Azure OpenAI na webu Azure Portal. Hodnotu najdete také v zobrazení kódu chatovacího hřiště>Azure AI Studio>. Ukázkový koncový bod je: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Tuto hodnotu najdete v části Klíče správy>prostředků a koncový bod při zkoumání prostředku Azure OpenAI na webu Azure Portal. Použít můžete předponu KEY1 nebo KEY2. Vždy mít dva klíče vám umožní bezpečně otáčet a znovu vygenerovat klíče, aniž by to způsobilo přerušení služeb.
AZURE_OPENAI_DEPLOYMENT_ID Tato hodnota odpovídá vlastnímu názvu, který jste zvolili pro vaše nasazení při nasazení modelu. Tuto hodnotu najdete v části Nasazení správy>prostředků na webu Azure Portal nebo v části Nasazení správy>v nástroji Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Tuto hodnotu najdete v části Přehled při zkoumání prostředku Azure AI Search na webu Azure Portal.
AZURE_AI_SEARCH_API_KEY Tuto hodnotu najdete v části Nastavení> Klíče při zkoumání prostředku Azure AI Search z webu Azure Portal. Můžete použít primární klíč správce nebo sekundární klíč správce. Vždy mít dva klíče vám umožní bezpečně otáčet a znovu vygenerovat klíče, aniž by to způsobilo přerušení služeb.
AZURE_AI_SEARCH_INDEX Tato hodnota odpovídá názvu indexu, který jste vytvořili pro ukládání dat. Najdete ho v části Přehled při zkoumání prostředku Azure AI Search na webu Azure Portal.

Proměnné prostředí

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

Vytvoření prostředí Go

  1. Vytvořte novou složku s názvem openai-go pro váš projekt a nový soubor kódu Go s názvem sample.go. Přejděte do adresáře:

    mkdir openai-go
    cd openai-go
    
  2. Nainstalujte následující balíčky Go:

    go get github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai
    
  3. Povolte sledování závislostí pro váš kód.

    go mod init example/azure-openai
    

Vytvoření aplikace Go

  1. V adresáři projektu otevřete soubor sample.go a přidejte následující kód:

    package main
    
    import (
     "context"
     "fmt"
     "log"
     "os"
    
     "github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai"
     "github.com/Azure/azure-sdk-for-go/sdk/azcore"
     "github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
    )
    
    func main() {
     azureOpenAIKey := os.Getenv("AZURE_OPENAI_API_KEY")
     modelDeploymentID := os.Getenv("AZURE_OPENAI_DEPLOYMENT_ID")
    
     // Ex: "https://<your-azure-openai-host>.openai.azure.com"
     azureOpenAIEndpoint := os.Getenv("AZURE_OPENAI_ENDPOINT")
    
     // Azure AI Search configuration
     searchIndex := os.Getenv("AZURE_AI_SEARCH_INDEX")
     searchEndpoint := os.Getenv("AZURE_AI_SEARCH_ENDPOINT")
     searchAPIKey := os.Getenv("AZURE_AI_SEARCH_API_KEY")
    
     if azureOpenAIKey == "" || modelDeploymentID == "" || azureOpenAIEndpoint == "" || searchIndex == "" || searchEndpoint == "" || searchAPIKey == "" {
     	fmt.Fprintf(os.Stderr, "Skipping example, environment variables missing\n")
     	return
     }
    
     keyCredential := azcore.NewKeyCredential(azureOpenAIKey)
    
     // In Azure OpenAI you must deploy a model before you can use it in your client. For more information
     // see here: https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource
     client, err := azopenai.NewClientWithKeyCredential(azureOpenAIEndpoint, keyCredential, nil)
    
     if err != nil {
     	//  TODO: Update the following line with your application specific error handling logic
     	log.Fatalf("ERROR: %s", err)
     }
    
     resp, err := client.GetChatCompletions(context.TODO(), azopenai.ChatCompletionsOptions{
     	Messages: []azopenai.ChatRequestMessageClassification{
     		&azopenai.ChatRequestUserMessage{Content: azopenai.NewChatRequestUserMessageContent("What are my available health plans?")},
     	},
     	MaxTokens: to.Ptr[int32](512),
     	AzureExtensionsOptions: []azopenai.AzureChatExtensionConfigurationClassification{
     		&azopenai.AzureCognitiveSearchChatExtensionConfiguration{
     			// This allows Azure OpenAI to use an Azure AI Search index.
     			//
     			// > Because the model has access to, and can reference specific sources to support its responses, answers are not only based on its pretrained knowledge
     			// > but also on the latest information available in the designated data source. This grounding data also helps the model avoid generating responses
     			// > based on outdated or incorrect information.
     			//
     			// Quote from here: https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/use-your-data
     			Parameters: &azopenai.AzureCognitiveSearchChatExtensionParameters{
     				Endpoint:  &searchEndpoint,
     				IndexName: &searchIndex,
     				Authentication: &azopenai.OnYourDataAPIKeyAuthenticationOptions{
     					Key: &searchAPIKey,
     				},
     			},
     		},
     	},
     	DeploymentName: &modelDeploymentID,
     }, nil)
    
     if err != nil {
     	//  TODO: Update the following line with your application specific error handling logic
     	log.Fatalf("ERROR: %s", err)
     }
    
     // Contains contextual information from your Azure chat completion extensions, configured above in `AzureExtensionsOptions`
     msgContext := resp.Choices[0].Message.Context
    
     fmt.Fprintf(os.Stderr, "Extensions Context Role: %s\nExtensions Context (length): %d\n",
     	*msgContext.Messages[0].Role,
     	len(*msgContext.Messages[0].Content))
    
     fmt.Fprintf(os.Stderr, "ChatRole: %s\nChat content: %s\n",
     	*resp.Choices[0].Message.Role,
     	*resp.Choices[0].Message.Content,
     )
    }
    

    Důležité

    V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace o zabezpečení přihlašovacích údajů najdete v článku zabezpečení služeb Azure AI.

  2. Spusťte následující příkaz:

    go run sample.go
    

    Aplikace vytiskne odpověď včetně odpovědí na váš dotaz i citací z nahraných souborů.

Načtení požadovaných proměnných

K úspěšnému volání azure OpenAI potřebujete následující proměnné. V tomto rychlém startu se předpokládá, že jste data nahráli do účtu služby Azure Blob Storage a vytvořili jste index služby Azure AI Search. Viz Přidání dat pomocí nástroje Azure AI Studio

Název proměnné Hodnota
AZURE_OPENAI_ENDPOINT Tuto hodnotu najdete v části Klíče a koncový bod při zkoumání prostředku Azure OpenAI na webu Azure Portal. Hodnotu najdete také v zobrazení kódu chatovacího hřiště>Azure AI Studio>. Ukázkový koncový bod je: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Tuto hodnotu najdete v části Klíče správy>prostředků a koncový bod při zkoumání prostředku Azure OpenAI na webu Azure Portal. Použít můžete předponu KEY1 nebo KEY2. Vždy mít dva klíče vám umožní bezpečně otáčet a znovu vygenerovat klíče, aniž by to způsobilo přerušení služeb.
AZURE_OPENAI_DEPLOYMENT_ID Tato hodnota odpovídá vlastnímu názvu, který jste zvolili pro vaše nasazení při nasazení modelu. Tuto hodnotu najdete v části Nasazení správy>prostředků na webu Azure Portal nebo v části Nasazení správy>v nástroji Azure AI Studio.
AZURE_AI_SEARCH_ENDPOINT Tuto hodnotu najdete v části Přehled při zkoumání prostředku Azure AI Search na webu Azure Portal.
AZURE_AI_SEARCH_API_KEY Tuto hodnotu najdete v části Nastavení> Klíče při zkoumání prostředku Azure AI Search z webu Azure Portal. Můžete použít primární klíč správce nebo sekundární klíč správce. Vždy mít dva klíče vám umožní bezpečně otáčet a znovu vygenerovat klíče, aniž by to způsobilo přerušení služeb.
AZURE_AI_SEARCH_INDEX Tato hodnota odpovídá názvu indexu, který jste vytvořili pro ukládání dat. Najdete ho v části Přehled při zkoumání prostředku Azure AI Search na webu Azure Portal.

Proměnné prostředí

setx AZURE_OPENAI_ENDPOINT REPLACE_WITH_YOUR_AOAI_ENDPOINT_VALUE_HERE
setx AZURE_OPENAI_API_KEY REPLACE_WITH_YOUR_AOAI_KEY_VALUE_HERE
setx AZURE_OPENAI_DEPLOYMENT_ID REPLACE_WITH_YOUR_AOAI_DEPLOYMENT_VALUE_HERE
setx AZURE_AI_SEARCH_ENDPOINT REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_VALUE_HERE
setx AZURE_AI_SEARCH_API_KEY REPLACE_WITH_YOUR_AZURE_SEARCH_RESOURCE_KEY_VALUE_HERE
setx AZURE_AI_SEARCH_INDEX REPLACE_WITH_YOUR_INDEX_NAME_HERE

Příklady příkazů cURL

Modely chatu Azure OpenAI jsou optimalizované pro práci se vstupy formátovanými jako konverzace. Proměnná messages předává pole slovníků s různými rolemi v konverzaci vypisované systémem, uživatelem, nástrojem a asistentem. Proměnná dataSources se připojí k indexu Azure AI Search a umožní modelům Azure OpenAI reagovat na vaše data.

Pokud chcete aktivovat odpověď z modelu, měli byste ukončit zprávu uživatele, která indikuje, že se jedná o pomocnou odpověď.

Tip

Existuje několik parametrů, které můžete použít ke změně odpovědi modelu, například temperaturetop_p. Další informace najdete v referenční dokumentaci .

curl -i -X POST $AZURE_OPENAI_ENDPOINT/openai/deployments/$AZURE_OPENAI_DEPLOYMENT_ID/chat/completions?api-version=2024-02-15-preview \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY" \
-d \
'
{
    "data_sources": [
        {
            "type": "AzureCognitiveSearch",
            "parameters": {
                "endpoint": "'$AZURE_AI_SEARCH_ENDPOINT'",
                "key": "'$AZURE_AI_SEARCH_API_KEY'",
                "index_name": "'$AZURE_AI_SEARCH_INDEX'"
            }
        }
    ],
    "messages": [
        {
            "role": "user",
            "content": "What are my available health plans?"
        }
    ]
}
'

Příklad výstupu

{
    "id": "12345678-1a2b-3c4e5f-a123-12345678abcd",
    "model": "gpt-4",
    "created": 1709835345,
    "object": "extensions.chat.completion",
    "choices": [
        {
            "index": 0,
            "finish_reason": "stop",
            "message": {
                "role": "assistant",
                "content": "The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans. [doc1].",
                "end_turn": true,
                "context": {
                    "citations": [
                        {
                            "content": "...",
                            "title": "...",
                            "url": "https://mysearch.blob.core.windows.net/xyz/001.txt",
                            "filepath": "001.txt",
                            "chunk_id": "0"
                        }
                    ],
                    "intent": "[\"Available health plans\"]"
                }
            }
        }
    ],
    "usage": {
        "prompt_tokens": 3779,
        "completion_tokens": 105,
        "total_tokens": 3884
    }
}

Chatování s modelem pomocí webové aplikace

Pokud chcete začít chatovat s modelem Azure OpenAI, který používá vaše data, můžete nasadit webovou aplikaci pomocí nástroje Azure OpenAI Studio nebo ukázkového kódu, který poskytujeme na GitHubu. Tato aplikace se nasadí pomocí služby Azure App Service a poskytuje uživatelské rozhraní pro odesílání dotazů. Tuto aplikaci je možné použít modely Azure OpenAI, které používají vaše data, nebo modely, které vaše data nepoužívají. Pokyny k požadavkům, nastavení a nasazení najdete v souboru readme v úložišti. Volitelně můžete přizpůsobit front-endovou a back-endovou logiku webové aplikace provedením změn ve zdrojovém kódu.

Vyčištění prostředků

Pokud chcete vyčistit a odebrat prostředek Azure OpenAI nebo Azure AI Search, můžete prostředek nebo skupinu prostředků odstranit. Odstraněním skupiny prostředků se odstraní také všechny ostatní prostředky, které jsou k ní přidružené.

Další kroky