Guia de início rápido: converse com modelos OpenAI do Azure usando seus próprios dados

Pacote de código | fonte de referência | (pypi)Amostras |

Os links acima fazem referência à API OpenAI para Python. Não há nenhum SDK Python OpenAI específico do Azure. Saiba como alternar entre os serviços OpenAI e os serviços Azure OpenAI.

Neste guia de início rápido, você pode usar seus próprios dados com modelos do Azure OpenAI. Usar os modelos do Azure OpenAI em seus dados pode fornecer uma poderosa plataforma de IA conversacional que permite uma comunicação mais rápida e precisa.

Pré-requisitos

  • Uma assinatura do Azure - Crie uma gratuitamente.

  • Acesso concedido ao Azure OpenAI na subscrição pretendida do Azure.

    O Azure OpenAI requer registo e está atualmente disponível apenas para clientes e parceiros empresariais aprovados. Consulte Acesso limitado ao Serviço OpenAI do Azure para obter mais informações. Você pode solicitar acesso ao Azure OpenAI preenchendo o formulário em https://aka.ms/oai/access. Abra um problema neste repositório para entrar em contato conosco se tiver um problema.

  • Um recurso OpenAI do Azure implantado em uma região com suporte com um modelo suportado.

  • Certifique-se de que lhe foi atribuída pelo menos a função de Colaborador dos Serviços Cognitivos para o recurso OpenAI do Azure.

  • Baixe os dados de exemplo do GitHub se você não tiver seus próprios dados.

Adicione seus dados usando o Azure OpenAI Studio

Gorjeta

Você pode usar a CLI do Desenvolvedor do Azure para criar programaticamente os recursos necessários para o Azure OpenAI On Your Data

Navegue até o Azure OpenAI Studio e entre com credenciais que têm acesso ao seu recurso do Azure OpenAI. Durante ou após o fluxo de trabalho de entrada, selecione o diretório apropriado, a assinatura do Azure e o recurso do Azure OpenAI.

  1. Selecione o bloco Traga seus próprios dados

    Uma captura de tela da página inicial do Azure OpenAI Studio.

  2. No painel exibido, selecione Carregar arquivos (visualização) em Selecionar fonte de dados. O Azure OpenAI precisa de um recurso de armazenamento e de um recurso de pesquisa para aceder e indexar os seus dados.

    Gorjeta

    1. Para que o Azure OpenAI acesse sua conta de armazenamento, você precisará ativar o compartilhamento de recursos entre origens (CORS). Se o CORS ainda não estiver ativado para o recurso Armazenamento de Blobs do Azure, selecione Ativar CORS.

    2. Selecione seu recurso Azure AI Search e selecione a confirmação de que conectá-lo incorrerá em uso em sua conta. Em seguida, selecione Seguinte.

    Uma captura de tela mostrando opções para selecionar uma fonte de dados no Azure OpenAI Studio.

  3. No painel Carregar arquivos, selecione Procurar um arquivo e selecione os arquivos baixados da seção de pré-requisitos ou seus próprios dados. Em seguida, selecione Carregar arquivos. Em seguida, selecione Seguinte.

  4. No painel Gerenciamento de dados, você pode escolher se deseja habilitar a pesquisa semântica ou a pesquisa vetorial para seu índice.

    Importante

    • A pesquisa semântica e a pesquisa vetorial estão sujeitas a preços adicionais. Você precisa escolher SKU básico ou superior para habilitar a pesquisa semântica ou a pesquisa vetorial. Consulte a diferença de nível de preço e os limites de serviço para obter mais informações.
    • Para ajudar a melhorar a qualidade da recuperação de informações e da resposta do modelo, recomendamos habilitar a pesquisa semântica para os seguintes idiomas de fonte de dados: inglês, francês, espanhol, português, italiano, alemão, chinês (zh), japonês, coreano, russo e árabe.
  5. Reveja os detalhes introduzidos e selecione Guardar e fechar. Agora você pode conversar com o modelo e ele usará informações de seus dados para construir a resposta.

Playground de bate-papo

Comece a explorar os recursos do Azure OpenAI com uma abordagem sem código por meio do playground de bate-papo. É simplesmente uma caixa de texto onde você pode enviar um prompt para gerar uma conclusão. Nesta página, você pode iterar e experimentar rapidamente os recursos.

Captura de ecrã da página de parque infantil do Azure OpenAI Studio com secções realçadas.

O playground oferece opções para personalizar sua experiência de bate-papo. À direita, você pode selecionar Implantação para determinar qual modelo gera uma resposta usando os resultados da pesquisa do seu índice. Você escolhe o número de mensagens passadas a serem incluídas como histórico de conversas para futuras respostas geradas. O histórico de conversas fornece contexto para gerar respostas relacionadas, mas também consome o uso de tokens. O indicador de progresso do token de entrada controla a contagem de tokens da pergunta enviada.

As configurações avançadas à esquerda são parâmetros de tempo de execução, que lhe dão controle sobre a recuperação e pesquisa de informações relevantes de seus dados. Um bom caso de uso é quando você quer ter certeza de que as respostas são geradas apenas com base em seus dados ou você acha que o modelo não pode gerar uma resposta com base em informações existentes em seus dados.

  • O rigor determina a agressividade do sistema na filtragem de documentos de pesquisa com base nas suas pontuações de semelhança. Definir rigor como 5 indica que o sistema filtrará agressivamente os documentos, aplicando um limite de similaridade muito alto. A pesquisa semântica pode ser útil nesse cenário porque os modelos de classificação fazem um trabalho melhor de inferir a intenção da consulta. Níveis mais baixos de rigor produzem respostas mais detalhadas, mas também podem incluir informações que não estão no seu índice. Isso é definido como 3 por padrão.

  • Documentos recuperados é um número inteiro que pode ser definido como 3, 5, 10 ou 20 e controla o número de blocos de documentos fornecidos ao modelo de linguagem grande para formular a resposta final. Por padrão, isso é definido como 5.

  • Quando a opção Limitar respostas aos seus dados está ativada, o modelo tenta confiar apenas nos seus documentos para obter respostas. Isso é definido como true por padrão.

Captura de ecrã das definições avançadas.

Envie a sua primeira consulta. Os modelos de chat têm o melhor desempenho em exercícios de perguntas e respostas. Por exemplo, "Quais são os meus planos de saúde disponíveis?" ou "Qual é a opção saúde mais?".

Consultas que exigem análise de dados provavelmente falhariam, como "Qual plano de saúde é mais popular?". Consultas que exigem informações sobre todos os seus dados provavelmente também falharão, como "Quantos documentos eu carreguei?". Lembre-se de que o mecanismo de pesquisa procura partes com termos, frases ou construções exatas ou semelhantes à consulta. E embora o modelo possa entender a pergunta, se os resultados da pesquisa forem partes do conjunto de dados, não é a informação certa para responder a esse tipo de pergunta.

Os chats são limitados pelo número de documentos (partes) retornados na resposta (limitado a 3-20 no playground do Azure OpenAI Studio). Como você pode imaginar, fazer uma pergunta sobre "todos os títulos" requer uma varredura completa de todo o repositório vetorial.

Implementar o modelo

Quando estiver satisfeito com a experiência no estúdio OpenAI do Azure, você poderá implantar um aplicativo Web diretamente do Studio selecionando o botão Implantar em .

Uma captura de tela mostrando o botão de implantação do modelo no Azure OpenAI Studio.

Isso lhe dá a opção de implantar em um aplicativo Web autônomo ou um copiloto no Copilot Studio (visualização) se você estiver usando seus próprios dados no modelo.

Por exemplo, se você optar por implantar um aplicativo Web:

Na primeira vez que implantar um aplicativo Web, selecione Criar um novo aplicativo Web. Escolha um nome para o aplicativo, que se tornará parte do URL do aplicativo. Por exemplo, https://<appname>.azurewebsites.net.

Selecione a sua subscrição, grupo de recursos, localização e plano de preços para a aplicação publicada. Para atualizar um aplicativo existente, selecione Publicar em um aplicativo Web existente e escolha o nome do aplicativo anterior no menu suspenso.

Se você optar por implantar um aplicativo Web, consulte as considerações importantes para usá-lo.

Recuperar variáveis necessárias

Para fazer uma chamada com êxito no Azure OpenAI, você precisa das seguintes variáveis. Este guia de início rápido pressupõe que você carregou seus dados em uma conta de armazenamento de blob do Azure e criou um índice do Azure AI Search. Consulte Adicionar seus dados usando o estúdio de IA do Azure

Nome da variável Value
AZURE_OPENAI_ENDPOINT Esse valor pode ser encontrado na seção Chaves & Ponto de Extremidade ao examinar seu recurso do Azure OpenAI no portal do Azure. Como alternativa, você pode encontrar o valor na visualização Código do playground>de bate-papo do estúdio Azure AI>. Um exemplo de ponto de extremidade é: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Esse valor pode ser encontrado na seção Chaves de gerenciamento de>recursos & Ponto de extremidade ao examinar seu recurso do Azure OpenAI no portal do Azure. Pode utilizar KEY1 ou KEY2. Ter sempre duas chaves permite-lhe rodar e regenerar chaves de forma segura sem causar uma interrupção do serviço.
AZURE_OPENAI_DEPLOYMENT_ID Esse valor corresponde ao nome personalizado que você escolheu para sua implantação quando implantou um modelo. Esse valor pode ser encontrado em Implantações de Gerenciamento de>Recursos no portal do Azure ou, alternativamente, em Implantações de Gerenciamento>no estúdio de IA do Azure.
AZURE_AI_SEARCH_ENDPOINT Esse valor pode ser encontrado na seção Visão geral ao examinar seu recurso Azure AI Search no portal do Azure.
AZURE_AI_SEARCH_API_KEY Esse valor pode ser encontrado na seção Chaves de Configurações> ao examinar seu recurso Azure AI Search no portal do Azure. Você pode usar a chave de administração primária ou a chave de administração secundária. Ter sempre duas chaves permite-lhe rodar e regenerar chaves de forma segura sem causar uma interrupção do serviço.
AZURE_AI_SEARCH_INDEX Esse valor corresponde ao nome do índice que você criou para armazenar seus dados. Você pode encontrá-lo na seção Visão geral ao examinar seu recurso Azure AI Search no portal do Azure.

Variáveis de ambiente

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

Criar uma nova aplicação .NET Core

Em uma janela de console (como cmd, PowerShell ou Bash), use o dotnet new comando para criar um novo aplicativo de console com o nome azure-openai-quickstart. Este comando cria um projeto "Hello World" simples com um único arquivo de origem C#: Program.cs.

dotnet new console -n azure-openai-quickstart

Altere seu diretório para a pasta do aplicativo recém-criada. Você pode criar o aplicativo com:

dotnet build

A saída da compilação não deve conter avisos ou erros.

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

Instale a biblioteca de cliente OpenAI .NET com:

dotnet add package Azure.AI.OpenAI --prerelease

No diretório do projeto, abra o arquivo Program.cs e substitua seu conteúdo pelo seguinte código:

Sem streaming de resposta

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("===");

Importante

Para produção, use uma maneira segura de armazenar e acessar suas credenciais, como o Azure Key Vault. Para obter mais informações sobre segurança de credenciais, consulte o artigo de segurança dos serviços de IA do Azure.

dotnet run program.cs

Saída

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]"
}
===

Isso aguardará até que o modelo gere toda a sua resposta antes de imprimir os resultados. Como alternativa, se quiser transmitir a resposta de forma assíncrona e imprimir os resultados, você pode substituir o conteúdo do Program.cs pelo código no próximo exemplo.

Assíncrono com streaming

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);
    }
}

Recuperar variáveis necessárias

Para fazer uma chamada com êxito no Azure OpenAI, você precisa das seguintes variáveis. Este guia de início rápido pressupõe que você carregou seus dados em uma conta de armazenamento de blob do Azure e criou um índice do Azure AI Search. Para obter mais informações, consulte Adicionar seus dados usando o Azure AI studio.

Nome da variável Value
AZURE_OPENAI_ENDPOINT Você pode encontrar esse valor na seção Chaves & Ponto de Extremidade ao examinar seu recurso do Azure OpenAI no portal do Azure. Como alternativa, você pode encontrar o valor na visualização Código do playground>de bate-papo do estúdio Azure AI>. Um exemplo de ponto de extremidade é: https://my-resource.openai.azure.com.
AZURE_OPENAI_API_KEY Você pode encontrar esse valor na seção Chaves de gerenciamento de>recursos & Ponto de extremidade ao examinar seu recurso do Azure OpenAI no portal do Azure. Pode utilizar KEY1 ou KEY2. Ter sempre duas chaves permite-lhe rodar e regenerar chaves de forma segura sem causar uma interrupção do serviço.
AZURE_OPEN_AI_DEPLOYMENT_ID Esse valor corresponde ao nome personalizado que você escolheu para sua implantação quando implantou um modelo. Você pode encontrar esse valor em Implantações de Gerenciamento de>Recursos no portal do Azure ou, alternativamente, em Implantações de Gerenciamento>no estúdio de IA do Azure.
AZURE_AI_SEARCH_ENDPOINT Você pode encontrar esse valor na seção Visão geral ao examinar seu recurso Azure AI Search no portal do Azure.
AZURE_AI_SEARCH_API_KEY Você pode encontrar esse valor na seção Chaves de Configurações> ao examinar seu recurso Azure AI Search no portal do Azure. Você pode usar a chave de administração primária ou a chave de administração secundária. Ter sempre duas chaves permite-lhe rodar e regenerar chaves de forma segura sem causar uma interrupção do serviço.
AZURE_AI_SEARCH_INDEX Esse valor corresponde ao nome do índice que você criou para armazenar seus dados. Você pode encontrá-lo na seção Visão geral ao examinar seu recurso Azure AI Search no portal do Azure.

Variáveis de ambiente

Nota

O Spring AI padroniza o nome do modelo como gpt-35-turbo. Só é necessário fornecer o SPRING_AI_AZURE_OPENAI_MODEL valor se você tiver implantado um modelo com um nome diferente.

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

Criar um novo aplicativo Spring

Atualmente, o Spring AI não oferece suporte às AzureCognitiveSearchChatExtensionConfiguration opções que permitem que uma consulta de IA do Azure encapsular o método RAG (Retrieval Augmented Generation ) e oculte os detalhes do usuário. Como alternativa, você ainda pode invocar o método RAG diretamente em seu aplicativo para consultar dados em seu índice do Azure AI Search e usar documentos recuperados para aumentar sua consulta.

O Spring AI dá suporte a uma abstração do VectorStore e você pode envolver o Azure AI Search em uma implementação do Spring AI VectorStore para consultar seus dados personalizados. O projeto a seguir implementa um VectorStore personalizado apoiado pelo Azure AI Search e executa diretamente operações RAG.

Em uma janela Bash, crie um novo diretório para seu aplicativo e navegue até ele.

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

Execute o comando a spring init partir do seu diretório de trabalho. Este comando cria uma estrutura de diretórios padrão para seu projeto Spring, incluindo o arquivo de origem da classe Java principal e o arquivo pom.xml usado para gerenciar projetos baseados no Maven.

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

Os arquivos e pastas gerados se assemelham à seguinte estrutura:

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

Editar aplicativo Spring

  1. Edite o arquivo pom.xml .

    Na raiz do diretório do projeto, abra o arquivo pom.xml em seu editor ou IDE preferido e substitua o arquivo pelo seguinte conteúdo:

    <?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. Na pasta src/main/java/com/example/aicustomdatademo , abra AiCustomDataApplication.java em seu editor ou IDE preferido e cole o seguinte código:

    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;
        }
    
    }
    

    Importante

    Para produção, use uma maneira segura de armazenar e acessar suas credenciais, como o Azure Key Vault. Para obter mais informações sobre segurança de credenciais, consulte o artigo de segurança dos serviços de IA do Azure.

  3. Navegue de volta para a pasta raiz do projeto e execute o aplicativo usando o seguinte comando:

    ./mvnw spring-boot:run
    

Saída

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: 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.

Recuperar variáveis necessárias

Para fazer uma chamada com êxito no Azure OpenAI, você precisa das seguintes variáveis. Este guia de início rápido pressupõe que você carregou seus dados em uma conta de armazenamento de blob do Azure e criou um índice do Azure AI Search. Consulte Adicionar seus dados usando o estúdio de IA do Azure

Nome da variável Value
AZURE_OPENAI_ENDPOINT Esse valor pode ser encontrado na seção Chaves & Ponto de Extremidade ao examinar seu recurso do Azure OpenAI no portal do Azure. Como alternativa, você pode encontrar o valor na visualização Código do playground>de bate-papo do estúdio Azure AI>. Um exemplo de ponto de extremidade é: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Esse valor pode ser encontrado na seção Chaves de gerenciamento de>recursos & Ponto de extremidade ao examinar seu recurso do Azure OpenAI no portal do Azure. Pode utilizar KEY1 ou KEY2. Ter sempre duas chaves permite-lhe rodar e regenerar chaves de forma segura sem causar uma interrupção do serviço.
AZURE_OPENAI_DEPLOYMENT_ID Esse valor corresponde ao nome personalizado que você escolheu para sua implantação quando implantou um modelo. Esse valor pode ser encontrado em Implantações de Gerenciamento de>Recursos no portal do Azure ou, alternativamente, em Implantações de Gerenciamento>no estúdio de IA do Azure.
AZURE_AI_SEARCH_ENDPOINT Esse valor pode ser encontrado na seção Visão geral ao examinar seu recurso Azure AI Search no portal do Azure.
AZURE_AI_SEARCH_API_KEY Esse valor pode ser encontrado na seção Chaves de Configurações> ao examinar seu recurso Azure AI Search no portal do Azure. Você pode usar a chave de administração primária ou a chave de administração secundária. Ter sempre duas chaves permite-lhe rodar e regenerar chaves de forma segura sem causar uma interrupção do serviço.
AZURE_AI_SEARCH_INDEX Esse valor corresponde ao nome do índice que você criou para armazenar seus dados. Você pode encontrá-lo na seção Visão geral ao examinar seu recurso Azure AI Search no portal do Azure.

Variáveis de ambiente

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

Criar um aplicativo de nó

Numa janela de consola (como cmd, PowerShell ou Bash), crie um novo diretório para a sua aplicação e navegue para a mesma. Em seguida, execute o npm init comando para criar um aplicativo de nó com um arquivo package.json .

npm init

Instalar a biblioteca de cliente

Instale o cliente OpenAI do Azure e as bibliotecas do Azure Identity para JavaScript com npm:

npm install @azure/openai @azure/identity

O arquivo de package.json do seu aplicativo será atualizado com as dependências.

Criar um aplicativo de exemplo

Abra um prompt de comando onde você deseja o novo projeto e crie um novo arquivo chamado ChatWithOwnData.js. Copie o código a seguir para o arquivo ChatWithOwnData.js.

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 };

Importante

Para produção, use uma maneira segura de armazenar e acessar suas credenciais, como o Azure Key Vault. Para obter mais informações sobre segurança de credenciais, consulte o artigo de segurança dos serviços de IA do Azure.

node.exe ChatWithOwnData.js

Saída

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.

Recuperar variáveis necessárias

Para fazer uma chamada com êxito no Azure OpenAI, você precisa das seguintes variáveis. Este guia de início rápido pressupõe que você carregou seus dados em uma conta de armazenamento de blob do Azure e criou um índice do Azure AI Search. Consulte Adicionar seus dados usando o estúdio de IA do Azure

Nome da variável Value
AZURE_OPENAI_ENDPOINT Esse valor pode ser encontrado na seção Chaves & Ponto de Extremidade ao examinar seu recurso do Azure OpenAI no portal do Azure. Como alternativa, você pode encontrar o valor na visualização Código do playground>de bate-papo do estúdio Azure AI>. Um exemplo de ponto de extremidade é: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Esse valor pode ser encontrado na seção Chaves de gerenciamento de>recursos & Ponto de extremidade ao examinar seu recurso do Azure OpenAI no portal do Azure. Pode utilizar KEY1 ou KEY2. Ter sempre duas chaves permite-lhe rodar e regenerar chaves de forma segura sem causar uma interrupção do serviço.
AZURE_OPENAI_DEPLOYMENT_ID Esse valor corresponde ao nome personalizado que você escolheu para sua implantação quando implantou um modelo. Esse valor pode ser encontrado em Implantações de Gerenciamento de>Recursos no portal do Azure ou, alternativamente, em Implantações de Gerenciamento>no estúdio de IA do Azure.
AZURE_AI_SEARCH_ENDPOINT Esse valor pode ser encontrado na seção Visão geral ao examinar seu recurso Azure AI Search no portal do Azure.
AZURE_AI_SEARCH_API_KEY Esse valor pode ser encontrado na seção Chaves de Configurações> ao examinar seu recurso Azure AI Search no portal do Azure. Você pode usar a chave de administração primária ou a chave de administração secundária. Ter sempre duas chaves permite-lhe rodar e regenerar chaves de forma segura sem causar uma interrupção do serviço.
AZURE_AI_SEARCH_INDEX Esse valor corresponde ao nome do índice que você criou para armazenar seus dados. Você pode encontrá-lo na seção Visão geral ao examinar seu recurso Azure AI Search no portal do Azure.

Variáveis de ambiente

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

Criar um ambiente Python

  1. Crie uma nova pasta chamada openai-python para seu projeto e um novo arquivo de código Python chamado main.py. Altere para esse diretório:
mkdir openai-python
cd openai-python
  1. Instale as seguintes bibliotecas Python:
pip install openai
pip install python-dotenv

Criar o aplicativo Python

  1. No diretório do projeto, abra o arquivo main.py e adicione o seguinte código:
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))

Importante

Para produção, use uma maneira segura de armazenar e acessar suas credenciais, como o Azure Key Vault. Para obter mais informações sobre segurança de credenciais, consulte o artigo de segurança dos serviços de IA do Azure.

  1. Execute o seguinte comando:
python main.py

O aplicativo imprime a resposta em um formato JSON adequado para uso em muitos cenários. Inclui respostas à sua consulta e citações dos ficheiros carregados.

Recuperar variáveis necessárias

Para fazer uma chamada com êxito no Azure OpenAI, você precisa das seguintes variáveis. Este guia de início rápido pressupõe que você carregou seus dados em uma conta de armazenamento de blob do Azure e criou um índice do Azure AI Search. Consulte Adicionar seus dados usando o estúdio de IA do Azure

Nome da variável Value
AZURE_OPENAI_ENDPOINT Esse valor pode ser encontrado na seção Chaves & Ponto de Extremidade ao examinar seu recurso do Azure OpenAI no portal do Azure. Como alternativa, você pode encontrar o valor na visualização Código do playground>de bate-papo do estúdio Azure AI>. Um exemplo de ponto de extremidade é: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Esse valor pode ser encontrado na seção Chaves de gerenciamento de>recursos & Ponto de extremidade ao examinar seu recurso do Azure OpenAI no portal do Azure. Pode utilizar KEY1 ou KEY2. Ter sempre duas chaves permite-lhe rodar e regenerar chaves de forma segura sem causar uma interrupção do serviço.
AZURE_OPENAI_DEPLOYMENT_ID Esse valor corresponde ao nome personalizado que você escolheu para sua implantação quando implantou um modelo. Esse valor pode ser encontrado em Implantações de Gerenciamento de>Recursos no portal do Azure ou, alternativamente, em Implantações de Gerenciamento>no estúdio de IA do Azure.
AZURE_AI_SEARCH_ENDPOINT Esse valor pode ser encontrado na seção Visão geral ao examinar seu recurso Azure AI Search no portal do Azure.
AZURE_AI_SEARCH_API_KEY Esse valor pode ser encontrado na seção Chaves de Configurações> ao examinar seu recurso Azure AI Search no portal do Azure. Você pode usar a chave de administração primária ou a chave de administração secundária. Ter sempre duas chaves permite-lhe rodar e regenerar chaves de forma segura sem causar uma interrupção do serviço.
AZURE_AI_SEARCH_INDEX Esse valor corresponde ao nome do índice que você criou para armazenar seus dados. Você pode encontrá-lo na seção Visão geral ao examinar seu recurso Azure AI Search no portal do Azure.

Variáveis de ambiente

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

Exemplo de comandos do PowerShell

Os modelos de chat do Azure OpenAI são otimizados para trabalhar com entradas formatadas como uma conversa. A messages variável passa por uma matriz de dicionários com diferentes papéis na conversação delineados por sistema, usuário, ferramenta e assistente. A dataSources variável se conecta ao seu índice de Pesquisa Cognitiva do Azure e permite que os modelos do Azure OpenAI respondam usando seus dados.

Para acionar uma resposta do modelo, você deve terminar com uma mensagem de usuário indicando que é a vez do assistente responder.

Gorjeta

Há vários parâmetros que você pode usar para alterar a resposta do modelo, como temperature ou top_p. Consulte a documentação de referência para obter mais informações.

# 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

Exemplo de saída

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

Importante

Para produção, use uma maneira segura de armazenar e acessar suas credenciais, como o Gerenciamento Secreto do PowerShell com o Cofre de Chaves do Azure. Para obter mais informações sobre segurança de credenciais, consulte o artigo de segurança dos serviços de IA do Azure.

Converse com seu modelo usando um aplicativo Web

Para começar a conversar com o modelo do Azure OpenAI que usa seus dados, você pode implantar um aplicativo Web usando o estúdio do Azure OpenAI ou o código de exemplo que fornecemos no GitHub. Este aplicativo implanta usando o serviço de aplicativo do Azure e fornece uma interface de usuário para enviar consultas. Este aplicativo pode ser usado modelos do Azure OpenAI que usam seus dados ou modelos que não usam seus dados. Consulte o arquivo readme no repositório para obter instruções sobre requisitos, configuração e implantação. Opcionalmente, você pode personalizar a lógica de frontend e back-end do aplicativo Web fazendo alterações no código-fonte.

Recuperar variáveis necessárias

Para fazer uma chamada com êxito no Azure OpenAI, você precisa das seguintes variáveis. Este guia de início rápido pressupõe que você carregou seus dados em uma conta de armazenamento de blob do Azure e criou um índice do Azure AI Search. Consulte Adicionar seus dados usando o estúdio de IA do Azure

Nome da variável Value
AZURE_OPENAI_ENDPOINT Esse valor pode ser encontrado na seção Chaves & Ponto de Extremidade ao examinar seu recurso do Azure OpenAI no portal do Azure. Como alternativa, você pode encontrar o valor na visualização Código do playground>de bate-papo do estúdio Azure AI>. Um exemplo de ponto de extremidade é: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Esse valor pode ser encontrado na seção Chaves de gerenciamento de>recursos & Ponto de extremidade ao examinar seu recurso do Azure OpenAI no portal do Azure. Pode utilizar KEY1 ou KEY2. Ter sempre duas chaves permite-lhe rodar e regenerar chaves de forma segura sem causar uma interrupção do serviço.
AZURE_OPENAI_DEPLOYMENT_ID Esse valor corresponde ao nome personalizado que você escolheu para sua implantação quando implantou um modelo. Esse valor pode ser encontrado em Implantações de Gerenciamento de>Recursos no portal do Azure ou, alternativamente, em Implantações de Gerenciamento>no estúdio de IA do Azure.
AZURE_AI_SEARCH_ENDPOINT Esse valor pode ser encontrado na seção Visão geral ao examinar seu recurso Azure AI Search no portal do Azure.
AZURE_AI_SEARCH_API_KEY Esse valor pode ser encontrado na seção Chaves de Configurações> ao examinar seu recurso Azure AI Search no portal do Azure. Você pode usar a chave de administração primária ou a chave de administração secundária. Ter sempre duas chaves permite-lhe rodar e regenerar chaves de forma segura sem causar uma interrupção do serviço.
AZURE_AI_SEARCH_INDEX Esse valor corresponde ao nome do índice que você criou para armazenar seus dados. Você pode encontrá-lo na seção Visão geral ao examinar seu recurso Azure AI Search no portal do Azure.

Variáveis de ambiente

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

Criar um ambiente Go

  1. Crie uma nova pasta chamada openai-go para seu projeto e um novo arquivo de código Go chamado sample.go. Altere para esse diretório:

    mkdir openai-go
    cd openai-go
    
  2. Instale os seguintes pacotes Go:

    go get github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai
    
  3. Habilite o controle de dependência para seu código.

    go mod init example/azure-openai
    

Criar a aplicação Go

  1. No diretório do projeto, abra o arquivo sample.go e adicione o seguinte código:

    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,
     )
    }
    

    Importante

    Para produção, use uma maneira segura de armazenar e acessar suas credenciais, como o Azure Key Vault. Para obter mais informações sobre segurança de credenciais, consulte o artigo de segurança dos serviços de IA do Azure.

  2. Execute o seguinte comando:

    go run sample.go
    

    A aplicação imprime a resposta, incluindo as respostas à sua consulta e as citações dos ficheiros carregados.

Recuperar variáveis necessárias

Para fazer uma chamada com êxito no Azure OpenAI, você precisa das seguintes variáveis. Este guia de início rápido pressupõe que você carregou seus dados em uma conta de armazenamento de blob do Azure e criou um índice do Azure AI Search. Consulte Adicionar seus dados usando o estúdio de IA do Azure

Nome da variável Value
AZURE_OPENAI_ENDPOINT Esse valor pode ser encontrado na seção Chaves & Ponto de Extremidade ao examinar seu recurso do Azure OpenAI no portal do Azure. Como alternativa, você pode encontrar o valor na visualização Código do playground>de bate-papo do estúdio Azure AI>. Um exemplo de ponto de extremidade é: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Esse valor pode ser encontrado na seção Chaves de gerenciamento de>recursos & Ponto de extremidade ao examinar seu recurso do Azure OpenAI no portal do Azure. Pode utilizar KEY1 ou KEY2. Ter sempre duas chaves permite-lhe rodar e regenerar chaves de forma segura sem causar uma interrupção do serviço.
AZURE_OPENAI_DEPLOYMENT_ID Esse valor corresponde ao nome personalizado que você escolheu para sua implantação quando implantou um modelo. Esse valor pode ser encontrado em Implantações de Gerenciamento de>Recursos no portal do Azure ou, alternativamente, em Implantações de Gerenciamento>no estúdio de IA do Azure.
AZURE_AI_SEARCH_ENDPOINT Esse valor pode ser encontrado na seção Visão geral ao examinar seu recurso Azure AI Search no portal do Azure.
AZURE_AI_SEARCH_API_KEY Esse valor pode ser encontrado na seção Chaves de Configurações> ao examinar seu recurso Azure AI Search no portal do Azure. Você pode usar a chave de administração primária ou a chave de administração secundária. Ter sempre duas chaves permite-lhe rodar e regenerar chaves de forma segura sem causar uma interrupção do serviço.
AZURE_AI_SEARCH_INDEX Esse valor corresponde ao nome do índice que você criou para armazenar seus dados. Você pode encontrá-lo na seção Visão geral ao examinar seu recurso Azure AI Search no portal do Azure.

Variáveis de ambiente

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

Exemplo de comandos cURL

Os modelos de chat do Azure OpenAI são otimizados para trabalhar com entradas formatadas como uma conversa. A messages variável passa por uma matriz de dicionários com diferentes papéis na conversação delineados por sistema, usuário, ferramenta e assistente. A dataSources variável se conecta ao seu índice do Azure AI Search e permite que os modelos do Azure OpenAI respondam usando seus dados.

Para acionar uma resposta do modelo, você deve terminar com uma mensagem de usuário indicando que é a vez do assistente responder.

Gorjeta

Há vários parâmetros que você pode usar para alterar a resposta do modelo, como temperature ou top_p. Consulte a documentação de referência para obter mais informações.

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?"
        }
    ]
}
'

Exemplo de saída

{
    "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
    }
}

Converse com seu modelo usando um aplicativo Web

Para começar a conversar com o modelo do Azure OpenAI que usa seus dados, você pode implantar um aplicativo Web usando o estúdio do Azure OpenAI ou o código de exemplo que fornecemos no GitHub. Este aplicativo implanta usando o serviço de aplicativo do Azure e fornece uma interface de usuário para enviar consultas. Este aplicativo pode ser usado modelos do Azure OpenAI que usam seus dados ou modelos que não usam seus dados. Consulte o arquivo readme no repositório para obter instruções sobre requisitos, configuração e implantação. Opcionalmente, você pode personalizar a lógica de frontend e back-end do aplicativo Web fazendo alterações no código-fonte.

Clean up resources (Limpar recursos)

Se quiser limpar e remover um recurso do Azure OpenAI ou Azure AI Search, você pode excluir o recurso ou grupo de recursos. A exclusão do grupo de recursos também exclui quaisquer outros recursos associados a ele.

Próximos passos