Início Rápido: converse com modelos do OpenAI do Azure usando seus próprios dados

Referência | Código-fonte | Pacote (PyPi) | Amostras

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

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

Pré-requisitos

Adicione seus dados usando o Estúdio OpenAI do Azure

Dica

Você pode usar o Azure Developer CLI para criar programaticamente os recursos necessários para o OpenAI do Azure em seus dados

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

  1. Escolha a opção Use seus próprios dados

    Uma captura de tela da página inicial do Estúdio de OpenAI do Azure.

  2. No painel que aparece, selecione Carregar arquivos (versão prévia) em Selecionar fonte de dados . O OpenAI do Azure precisa de um recurso de armazenamento e de um recurso de pesquisa para acessar e indexar seus dados.

    Dica

    1. Para que o OpenAI do Azure 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 de Armazenamento de Blobs do Azure, selecione Ativar o CORS.

    2. Selecione seu recurso de Pesquisa de IA do Azure e selecione a confirmação de que a sua conexão incorrerá em uso em sua conta. Em seguida, selecione Avançar.

    Uma captura de tela mostrando as opções para selecionar uma fonte de dados no Estúdio de OpenAI do Azure.

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

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

    Importante

    • A pesquisa semântica e a busca em vetores estão sujeitas a preços adicionais. Você precisa escolher o SKU Básico ou superior para habilitar a pesquisa semântica ou a busca em vetores. Confira diferença dos tipos de preço e os limites de serviço para 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 idiomas de fonte de dados a seguir: inglês, francês, espanhol, português, italiano, alemão, chinês (Zh), japonês, coreano, russo e árabe.
  5. Reveja os detalhes inseridos e selecione Salvar e fechar. Agora é possível conversar com o modelo e ele usará as informações dos seus dados para construir a resposta.

Playground “Chat”

Comece a explorar os recursos do OpenAI do Azure com uma abordagem sem código através do playground do chat. É apenas uma caixa de texto em que você pode enviar um prompt para gerar uma conclusão. Nesta página, você pode iterar e experimentar as funcionalidades rapidamente.

Captura de tela da página do playground do Estúdio OpenAI do Azure com as seções destacadas.

O playground oferece opções para adaptar sua experiência de chat. À direita, você pode selecionar Implantação para determinar qual modelo gera uma resposta usando os resultados da pesquisa do índice. Você escolhe o número de mensagens passadas a serem incluídas como histórico de conversa para respostas futuras geradas. O histórico de conversas fornece contexto para gerar respostas relacionadas, mas também consome uso de token. 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 runtime, que fornecem controle sobre a recuperação e pesquisa de informações relevantes de seus dados. Um bom caso de uso é quando você deseja garantir que as respostas sejam geradas apenas com base em seus dados ou você descobrir que o modelo não pode gerar uma resposta com base nas informações existentes em seus dados.

  • A rigidez determina a agressividade do sistema na filtragem de documentos de pesquisa com base em suas pontuações de similaridade. Definir a rigidez como 5 indica que o sistema filtrará agressivamente 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 rigidez produzem respostas mais detalhadas, mas também podem incluir informações que não estão em seu índice. Isso é definido como 3 por padrão.

  • Os documentos recuperados são um inteiro que pode ser definido como 3, 5, 10 ou 20 e controla o número de partes de documento fornecidas ao modelo de linguagem grande para formular a resposta final. Por padrão, ele é definido como 5.

  • Quando Limitar respostas aos seus dados estiver habilitado, o modelo tentará contar apenas com seus documentos para respostas. Isso é definido como true por padrão.

Captura de tela da configuração avançada.

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

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

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

Implantar o seu modelo

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

Captura de tela mostrando o botão de implantação de modelo no Azure OpenAI Studio.

Isso oferece a opção de implantar em um aplicativo web autônomo ou em um copiloto no Copilot Studio (versão prévia) 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 da URL do aplicativo. Por exemplo, https://<appname>.azurewebsites.net.

Selecione sua assinatura, grupo de recursos, local e plano de preços para o aplicativo publicado. 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, confira as considerações importantes para usá-lo.

Recuperar as variáveis necessárias

Para fazer uma chamada com êxito para o OpenAI do Azure, você precisa das seguintes variáveis. Esse início rápido pressupõe que você tenha carregado seus dados em uma conta de armazenamento de blobs do Azure e tenha criado um índice da Pesquisa de IA do Azure. Consulte Adicione seus dados usando o Estúdio de IA do Azure

Nome da variável Valor
AZURE_OPENAI_ENDPOINT Esse valor pode ser encontrado na seção Chaves e Ponto de Extremidade ao examinar seu recurso do OpenAI do Azure no portal do Azure. Como alternativa, você pode encontrar o valor no Estúdio de IA do Azure>Playground do Chat>Exibição do código. Um ponto de extremidade de exemplo é: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Esse valor pode ser encontrado na seção Gerenciamento de Recurso>Chaves e Ponto de Extremidade ao examinar seu recurso do OpenAI do Azure no portal do Azure. Você pode usar KEY1 ou KEY2. Ter sempre duas chaves permite girar e regenerar chaves com segurança, sem causar interrupção de serviço.
AZURE_OPENAI_DEPLOYMENT_ID Esse valor corresponde ao nome personalizado escolhido para sua implantação ao implantar um modelo. Esse valor pode ser encontrado em Gerenciamento de Recursos>Implantações no portal do Azure ou, alternativamente, em Gerenciamento>Implantações no Estúdio de IA do Azure.
AZURE_AI_SEARCH_ENDPOINT Esse valor pode ser encontrado na seção Visão Geral ao examinar o seu recurso de Pesquisa de IA do Azure no portal do Azure.
AZURE_AI_SEARCH_API_KEY Esse valor pode ser encontrado na seção Configurações>Chaves ao examinar o seu recurso de Pesquisa de IA do Azure 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 girar e regenerar chaves com segurança, sem causar interrupção de 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 de Pesquisa de IA do Azure 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 .NET Core

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

dotnet new console -n azure-openai-quickstart

Altere o diretório para a pasta do aplicativo recém-criado. É possível criar o aplicativo com:

dotnet build

A saída de compilação não deve conter nenhum aviso ou erro.

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

Instalar a biblioteca de clientes do 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 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 tenha gerado toda a resposta antes de imprimir os resultados. Como alternativa, se você quiser transmitir a resposta de forma assíncrona e imprimir os resultados, poderá 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 as variáveis necessárias

Para fazer uma chamada com êxito para o OpenAI do Azure, você precisa das seguintes variáveis. Esse início rápido pressupõe que você tenha carregado seus dados em uma conta de armazenamento de blobs do Azure e tenha criado um índice da Pesquisa de IA do Azure. Para obter mais informações, confira Adicionar seus dados usando o Estúdio de IA do Azure.

Nome da variável Valor
AZURE_OPENAI_ENDPOINT É possível encontrar esse valor na seção Chaves e Ponto de extremidade ao examinar seu recurso do OpenAI do Azure no portal do Microsoft Azure. Como alternativa, você pode encontrar o valor no Estúdio de IA do Azure>Playground do Chat>Exibição do código. Um ponto de extremidade de exemplo é: https://my-resource.openai.azure.com.
AZURE_OPENAI_API_KEY É possível encontrar esse valor na seção Gerenciador de recursos>Chaves e Ponto de extremidade ao examinar seu recurso OpenAI do Azure no portal do Microsoft Azure. Você pode usar KEY1 ou KEY2. Ter sempre duas chaves permite girar e regenerar chaves com segurança, sem causar interrupção de serviço.
AZURE_OPEN_AI_DEPLOYMENT_ID Esse valor corresponde ao nome personalizado escolhido para sua implantação ao implantar um modelo. Você pode encontrar esse valor em Gerenciamento de Recursos>Implantações no portal do Microsoft Azure ou, alternativamente, em Gerenciamento>Implantações no Estúdio de IA do Azure.
AZURE_AI_SEARCH_ENDPOINT É possível encontrar esse valor na seção Visão geral ao examinar seu recurso de Pesquisa de IA do Azure no portal do Azure.
AZURE_AI_SEARCH_API_KEY É possível encontrar esse valor na seção Configurações>Chaves ao examinar seu recurso de pesquisa de IA do Azure no portal do Microsoft Azure. Você pode usar a chave de administração primária ou a chave de administração secundária. Ter sempre duas chaves permite girar e regenerar chaves com segurança, sem causar interrupção de 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 de Pesquisa de IA do Azure no portal do Azure.

Variáveis de ambiente

Observação

A IA do Spring define o nome do modelo como padrão para gpt-35-turbo. Só é necessário fornecer o valor SPRING_AI_AZURE_OPENAI_MODEL se você implantou 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 aplicativo Spring

Atualmente, a IA do Spring não dá suporte para as AzureCognitiveSearchChatExtensionConfigurationopções que permitem que uma consulta de IA do Azure encapsule o método de Recuperação com Geração Aumentada (RAG) 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 de pesquisa de IA do Azure e usar os documentos recuperados para aumentar sua consulta.

A AI do Suporte dá suporte a uma abstração VectorStore, e você pode encapsular a Pesquisa de IA do Azure em uma implementação VectorStore da IA do Seus para consultar seus dados personalizados. O projeto a seguir implementa um VectorStore personalizado com suporte da Pesquisa de IA do Azure e executa diretamente as operações RAG.

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

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

Execute o comando spring init em seu diretório de trabalho. Esse comando criará uma estrutura de diretório padrão para o projeto Spring, incluindo o arquivo de origem da classe Java principal e o arquivo pom.xml usado para gerenciar projetos baseados em Maven.

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

Os arquivos e as pastas geradas 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 o aplicativo Spring

  1. Edite o arquivo pom.xml.

    Na raiz do diretório do projeto, abra o arquivo pom.xml no 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 no seu editor ou IDE preferido e cole o código a seguir:

    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 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 as variáveis necessárias

Para fazer uma chamada com êxito para o OpenAI do Azure, você precisa das seguintes variáveis. Esse início rápido pressupõe que você tenha carregado seus dados em uma conta de armazenamento de blobs do Azure e tenha criado um índice da Pesquisa de IA do Azure. Consulte Adicione seus dados usando o Estúdio de IA do Azure

Nome da variável Valor
AZURE_OPENAI_ENDPOINT Esse valor pode ser encontrado na seção Chaves e Ponto de Extremidade ao examinar seu recurso do OpenAI do Azure no portal do Azure. Como alternativa, você pode encontrar o valor no Estúdio de IA do Azure>Playground do Chat>Exibição do código. Um ponto de extremidade de exemplo é: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Esse valor pode ser encontrado na seção Gerenciamento de Recurso>Chaves e Ponto de Extremidade ao examinar seu recurso do OpenAI do Azure no portal do Azure. Você pode usar KEY1 ou KEY2. Ter sempre duas chaves permite girar e regenerar chaves com segurança, sem causar interrupção de serviço.
AZURE_OPENAI_DEPLOYMENT_ID Esse valor corresponde ao nome personalizado escolhido para sua implantação ao implantar um modelo. Esse valor pode ser encontrado em Gerenciamento de Recursos>Implantações no portal do Azure ou, alternativamente, em Gerenciamento>Implantações no Estúdio de IA do Azure.
AZURE_AI_SEARCH_ENDPOINT Esse valor pode ser encontrado na seção Visão Geral ao examinar o seu recurso de Pesquisa de IA do Azure no portal do Azure.
AZURE_AI_SEARCH_API_KEY Esse valor pode ser encontrado na seção Configurações>Chaves ao examinar o seu recurso de Pesquisa de IA do Azure 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 girar e regenerar chaves com segurança, sem causar interrupção de 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 de Pesquisa de IA do Azure 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 Node

Em uma janela de console (como cmd, PowerShell ou Bash), crie um novo diretório para seu aplicativo e navegue até ele. Em seguida, execute o comando npm init para criar um aplicativo de nó com um arquivo package.json.

npm init

Instalar a biblioteca de clientes

Instale o cliente OpenAI do Azure e as bibliotecas de Identidade do Azure do JavaScript com npm:

npm install @azure/openai @azure/identity

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

Criar um aplicativo de exemplo

Abra um prompt de comando onde você quer criar o projeto e crie um arquivo chamado ChatWithOwnData.js. Copie o código a seguir no 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 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 as variáveis necessárias

Para fazer uma chamada com êxito para o OpenAI do Azure, você precisa das seguintes variáveis. Esse início rápido pressupõe que você tenha carregado seus dados em uma conta de armazenamento de blobs do Azure e tenha criado um índice da Pesquisa de IA do Azure. Consulte Adicione seus dados usando o Estúdio de IA do Azure

Nome da variável Valor
AZURE_OPENAI_ENDPOINT Esse valor pode ser encontrado na seção Chaves e Ponto de Extremidade ao examinar seu recurso do OpenAI do Azure no portal do Azure. Como alternativa, você pode encontrar o valor no Estúdio de IA do Azure>Playground do Chat>Exibição do código. Um ponto de extremidade de exemplo é: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Esse valor pode ser encontrado na seção Gerenciamento de Recurso>Chaves e Ponto de Extremidade ao examinar seu recurso do OpenAI do Azure no portal do Azure. Você pode usar KEY1 ou KEY2. Ter sempre duas chaves permite girar e regenerar chaves com segurança, sem causar interrupção de serviço.
AZURE_OPENAI_DEPLOYMENT_ID Esse valor corresponde ao nome personalizado escolhido para sua implantação ao implantar um modelo. Esse valor pode ser encontrado em Gerenciamento de Recursos>Implantações no portal do Azure ou, alternativamente, em Gerenciamento>Implantações no Estúdio de IA do Azure.
AZURE_AI_SEARCH_ENDPOINT Esse valor pode ser encontrado na seção Visão Geral ao examinar o seu recurso de Pesquisa de IA do Azure no portal do Azure.
AZURE_AI_SEARCH_API_KEY Esse valor pode ser encontrado na seção Configurações>Chaves ao examinar o seu recurso de Pesquisa de IA do Azure 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 girar e regenerar chaves com segurança, sem causar interrupção de 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 de Pesquisa de IA do Azure 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 de Python

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

Criar o aplicativo do 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 segurança dos serviços de IA do Azure.

  1. Execute o comando a seguir:
python main.py

O aplicativo imprime a resposta em um formato JSON adequado para uso em vários cenários. Ele inclui respostas para sua consulta e citações dos arquivos carregados.

Recuperar as variáveis necessárias

Para fazer uma chamada com êxito para o OpenAI do Azure, você precisa das seguintes variáveis. Esse início rápido pressupõe que você tenha carregado seus dados em uma conta de armazenamento de blobs do Azure e tenha criado um índice da Pesquisa de IA do Azure. Consulte Adicione seus dados usando o Estúdio de IA do Azure

Nome da variável Valor
AZURE_OPENAI_ENDPOINT Esse valor pode ser encontrado na seção Chaves e Ponto de Extremidade ao examinar seu recurso do OpenAI do Azure no portal do Azure. Como alternativa, você pode encontrar o valor no Estúdio de IA do Azure>Playground do Chat>Exibição do código. Um ponto de extremidade de exemplo é: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Esse valor pode ser encontrado na seção Gerenciamento de Recurso>Chaves e Ponto de Extremidade ao examinar seu recurso do OpenAI do Azure no portal do Azure. Você pode usar KEY1 ou KEY2. Ter sempre duas chaves permite girar e regenerar chaves com segurança, sem causar interrupção de serviço.
AZURE_OPENAI_DEPLOYMENT_ID Esse valor corresponde ao nome personalizado escolhido para sua implantação ao implantar um modelo. Esse valor pode ser encontrado em Gerenciamento de Recursos>Implantações no portal do Azure ou, alternativamente, em Gerenciamento>Implantações no Estúdio de IA do Azure.
AZURE_AI_SEARCH_ENDPOINT Esse valor pode ser encontrado na seção Visão Geral ao examinar o seu recurso de Pesquisa de IA do Azure no portal do Azure.
AZURE_AI_SEARCH_API_KEY Esse valor pode ser encontrado na seção Configurações>Chaves ao examinar o seu recurso de Pesquisa de IA do Azure 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 girar e regenerar chaves com segurança, sem causar interrupção de 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 de Pesquisa de IA do Azure 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 OpenAI do Azure são otimizados para trabalhar com entradas formatadas como uma conversa. A variável messages passa uma matriz de dicionários com diferentes funções na conversa delineada pelo sistema, usuário, ferramenta e assistente. A variável dataSources se conecta ao seu índice do Azure Cognitive Search e permite que os modelos do OpenAI do Azure respondam usando seus dados.

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

Dica

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

# 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

Saída de exemplo

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 um modo seguro de armazenar e acessar suas credenciais, como o Gerenciamento de Segredo do PowerShell com o Azure Key Vault. Para obter mais informações sobre segurança de credenciais, consulte o artigo 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 OpenAI do Azure que utiliza seus dados, você pode implantar um aplicativo Web usando o Estúdio do OpenAI do Azure ou o código de exemplo que fornecemos no GitHub. Esse aplicativo é implantado usando o serviço de aplicativo do Azure e fornece uma interface de usuário para o envio de consultas. Esse aplicativo pode ser usado em modelos do OpenAI do Azure que utilizam seus dados ou em modelos que não utilizam seus dados. Consulte o arquivo leia-me no repositório para obter instruções sobre requisitos, configuração e implantação. Opcionalmente, você pode personalizar a lógica de front-end e back-end do aplicativo Web fazendo alterações no código-fonte.

Recuperar as variáveis necessárias

Para fazer uma chamada com êxito para o OpenAI do Azure, você precisa das seguintes variáveis. Esse início rápido pressupõe que você tenha carregado seus dados em uma conta de armazenamento de blobs do Azure e tenha criado um índice da Pesquisa de IA do Azure. Consulte Adicione seus dados usando o Estúdio de IA do Azure

Nome da variável Valor
AZURE_OPENAI_ENDPOINT Esse valor pode ser encontrado na seção Chaves e Ponto de Extremidade ao examinar seu recurso do OpenAI do Azure no portal do Azure. Como alternativa, você pode encontrar o valor no Estúdio de IA do Azure>Playground do Chat>Exibição do código. Um ponto de extremidade de exemplo é: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Esse valor pode ser encontrado na seção Gerenciamento de Recurso>Chaves e Ponto de Extremidade ao examinar seu recurso do OpenAI do Azure no portal do Azure. Você pode usar KEY1 ou KEY2. Ter sempre duas chaves permite girar e regenerar chaves com segurança, sem causar interrupção de serviço.
AZURE_OPENAI_DEPLOYMENT_ID Esse valor corresponde ao nome personalizado escolhido para sua implantação ao implantar um modelo. Esse valor pode ser encontrado em Gerenciamento de Recursos>Implantações no portal do Azure ou, alternativamente, em Gerenciamento>Implantações no Estúdio de IA do Azure.
AZURE_AI_SEARCH_ENDPOINT Esse valor pode ser encontrado na seção Visão Geral ao examinar o seu recurso de Pesquisa de IA do Azure no portal do Azure.
AZURE_AI_SEARCH_API_KEY Esse valor pode ser encontrado na seção Configurações>Chaves ao examinar o seu recurso de Pesquisa de IA do Azure 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 girar e regenerar chaves com segurança, sem causar interrupção de 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 de Pesquisa de IA do Azure 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 do Go

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

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

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

    go mod init example/azure-openai
    

Criar o aplicativo 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 segurança dos serviços de IA do Azure.

  2. Execute o comando a seguir:

    go run sample.go
    

    O aplicativo imprime a resposta, incluindo respostas para sua consulta e citações dos arquivos carregados.

Recuperar as variáveis necessárias

Para fazer uma chamada com êxito para o OpenAI do Azure, você precisa das seguintes variáveis. Esse início rápido pressupõe que você tenha carregado seus dados em uma conta de armazenamento de blobs do Azure e tenha criado um índice da Pesquisa de IA do Azure. Consulte Adicione seus dados usando o Estúdio de IA do Azure

Nome da variável Valor
AZURE_OPENAI_ENDPOINT Esse valor pode ser encontrado na seção Chaves e Ponto de Extremidade ao examinar seu recurso do OpenAI do Azure no portal do Azure. Como alternativa, você pode encontrar o valor no Estúdio de IA do Azure>Playground do Chat>Exibição do código. Um ponto de extremidade de exemplo é: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Esse valor pode ser encontrado na seção Gerenciamento de Recurso>Chaves e Ponto de Extremidade ao examinar seu recurso do OpenAI do Azure no portal do Azure. Você pode usar KEY1 ou KEY2. Ter sempre duas chaves permite girar e regenerar chaves com segurança, sem causar interrupção de serviço.
AZURE_OPENAI_DEPLOYMENT_ID Esse valor corresponde ao nome personalizado escolhido para sua implantação ao implantar um modelo. Esse valor pode ser encontrado em Gerenciamento de Recursos>Implantações no portal do Azure ou, alternativamente, em Gerenciamento>Implantações no Estúdio de IA do Azure.
AZURE_AI_SEARCH_ENDPOINT Esse valor pode ser encontrado na seção Visão Geral ao examinar o seu recurso de Pesquisa de IA do Azure no portal do Azure.
AZURE_AI_SEARCH_API_KEY Esse valor pode ser encontrado na seção Configurações>Chaves ao examinar o seu recurso de Pesquisa de IA do Azure 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 girar e regenerar chaves com segurança, sem causar interrupção de 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 de Pesquisa de IA do Azure 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

Exemplos de comandos cURL

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

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

Dica

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

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

Saída de exemplo

{
    "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 OpenAI do Azure que utiliza seus dados, você pode implantar um aplicativo Web usando o Estúdio do OpenAI do Azure ou o código de exemplo que fornecemos no GitHub. Esse aplicativo é implantado usando o serviço de aplicativo do Azure e fornece uma interface de usuário para o envio de consultas. Esse aplicativo pode ser usado em modelos do OpenAI do Azure que utilizam seus dados ou em modelos que não utilizam seus dados. Consulte o arquivo leia-me no repositório para obter instruções sobre requisitos, configuração e implantação. Opcionalmente, você pode personalizar a lógica de front-end e back-end do aplicativo Web fazendo alterações no código-fonte.

Limpar os recursos

Se você quiser limpar e remover um recurso do OpenAI do Azure ou da Pesquisa de IA do Azure, poderá excluir o recurso ou o grupo de recursos. Excluir o grupo de recursos também exclui todos os recursos associados a ele.

Próximas etapas