Início Rápido: converse com modelos do OpenAI do Azure usando seus próprios dados
Referência | Código-fonte | Pacote (PyPi) | Amostras
Esses links referenciam a API do OpenAI para Python. Não há um SDK do OpenAI para Python específico para o 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
Uma assinatura do Azure – Crie uma gratuitamente.
Um recurso de OpenAI do Azure implantado em uma região com suporte e com um modelo com suporte.
Verifique se você recebeu pelo menos a função Colaborador de 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 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.
Escolha a opção Use seus próprios dados
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
- Confira o seguinte recurso para obter mais informações:
- Para documentos e conjuntos de dados com texto longo, recomendamos usar o script de preparação de dados disponível.
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.
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.
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.
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.
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.
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.
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.
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
Crie e atribua variáveis de ambiente persistentes para sua chave e ponto de extremidade.
Importante
Se você usar uma chave de API, armazene-a com segurança em outro lugar, como no Azure Key Vault. Não inclua a chave da API diretamente no seu código e nunca a publique publicamente.
Para obter mais informações sobre a segurança dos serviços de IA, confira Autenticar solicitações para serviços de IA do Azure.
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 Azure.AI.OpenAI.Chat;
using OpenAI.Chat;
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");
#pragma warning disable AOAI001
AzureOpenAIClient azureClient = new(
new Uri(azureOpenAIEndpoint),
new AzureKeyCredential(azureOpenAIKey));
ChatClient chatClient = azureClient.GetChatClient(deploymentName);
ChatCompletionOptions options = new();
options.AddDataSource(new AzureSearchChatDataSource()
{
Endpoint = new Uri(searchEndpoint),
IndexName = searchIndex,
Authentication = DataSourceAuthentication.FromApiKey(searchKey),
});
ChatCompletion completion = chatClient.CompleteChat(
[
new UserChatMessage("What are my available health plans?"),
], options);
Console.WriteLine(completion.Content[0].Text);
AzureChatMessageContext onYourDataContext = completion.GetAzureMessageContext();
if (onYourDataContext?.Intent is not null)
{
Console.WriteLine($"Intent: {onYourDataContext.Intent}");
}
foreach (AzureChatCitation citation in onYourDataContext?.Citations ?? [])
{
Console.WriteLine($"Citation: {citation.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.
dotnet run program.cs
Saída
Contoso Electronics offers two health plans: Northwind Health Plus and Northwind Standard [doc1]. Northwind Health Plus is a comprehensive plan that provides coverage for medical, vision, and dental services, prescription drug coverage, mental health and substance abuse coverage, and coverage for preventive care services. It also offers coverage for emergency services, both in-network and out-of-network. On the other hand, Northwind Standard is a basic plan that provides coverage for medical, vision, and dental services, prescription drug coverage, and coverage for preventive care services. However, it does not offer coverage for emergency services, mental health and substance abuse coverage, or out-of-network services [doc1].
Intent: ["What are the available health plans?", "List of health plans available", "Health insurance options", "Types of health plans offered"]
Citation:
Contoso Electronics plan and benefit packages
Thank you for your interest in the Contoso electronics plan and benefit packages. Use this document to
learn more about the various options available to you...// Omitted for brevity
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 Azure.AI.OpenAI.Chat;
using OpenAI.Chat;
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");
#pragma warning disable AOAI001
AzureOpenAIClient azureClient = new(
new Uri(azureOpenAIEndpoint),
new AzureKeyCredential(azureOpenAIKey));
ChatClient chatClient = azureClient.GetChatClient(deploymentName);
ChatCompletionOptions options = new();
options.AddDataSource(new AzureSearchChatDataSource()
{
Endpoint = new Uri(searchEndpoint),
IndexName = searchIndex,
Authentication = DataSourceAuthentication.FromApiKey(searchKey),
});
var chatUpdates = chatClient.CompleteChatStreamingAsync(
[
new UserChatMessage("What are my available health plans?"),
], options);
AzureChatMessageContext onYourDataContext = null;
await foreach (var chatUpdate in chatUpdates)
{
if (chatUpdate.Role.HasValue)
{
Console.WriteLine($"{chatUpdate.Role}: ");
}
foreach (var contentPart in chatUpdate.ContentUpdate)
{
Console.Write(contentPart.Text);
}
if (onYourDataContext == null)
{
onYourDataContext = chatUpdate.GetAzureMessageContext();
}
}
Console.WriteLine();
if (onYourDataContext?.Intent is not null)
{
Console.WriteLine($"Intent: {onYourDataContext.Intent}");
}
foreach (AzureChatCitation citation in onYourDataContext?.Citations ?? [])
{
Console.Write($"Citation: {citation.Content}");
}
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
Crie e atribua variáveis de ambiente persistentes para sua chave e ponto de extremidade.
Importante
Se você usar uma chave de API, armazene-a com segurança em outro lugar, como no Azure Key Vault. Não inclua a chave da API diretamente no seu código e nunca a publique publicamente.
Para obter mais informações sobre a segurança dos serviços de IA, veja Autenticar solicitações para serviços de IA do Azure.
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 AzureCognitiveSearchChatExtensionConfiguration
opçõ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
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>
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.
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
Crie e atribua variáveis de ambiente persistentes para sua chave e ponto de extremidade.
Importante
Se você usar uma chave de API, armazene-a com segurança em outro lugar, como no Azure Key Vault. Não inclua a chave da API diretamente no seu código e nunca a publique publicamente.
Para obter mais informações sobre a segurança dos serviços de IA, confira Autenticar solicitações para serviços de IA do Azure.
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
Crie e atribua variáveis de ambiente persistentes para sua chave e ponto de extremidade.
Importante
Se você usar uma chave de API, armazene-a com segurança em outro lugar, como no Azure Key Vault. Não inclua a chave da API diretamente no seu código e nunca a publique publicamente.
Para obter mais informações sobre a segurança dos serviços de IA, confira Autenticar solicitações para serviços de IA do Azure.
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
- 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
- Instale as seguintes bibliotecas do Python:
pip install openai
pip install python-dotenv
Criar o aplicativo do Python
- 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.
- 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
Crie e atribua variáveis de ambiente persistentes para sua chave e ponto de extremidade.
Importante
Se você usar uma chave de API, armazene-a com segurança em outro lugar, como no Azure Key Vault. Não inclua a chave da API diretamente no seu código e nunca a publique publicamente.
Para obter mais informações sobre a segurança dos serviços de IA, confira Autenticar solicitações para serviços de IA do Azure.
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 com 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
Crie e atribua variáveis de ambiente persistentes para sua chave e ponto de extremidade.
Importante
Se você usar uma chave de API, armazene-a com segurança em outro lugar, como no Azure Key Vault. Não inclua a chave da API diretamente no seu código e nunca a publique publicamente.
Para obter mais informações sobre a segurança dos serviços de IA, confira Autenticar solicitações para serviços de IA do Azure.
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
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
Instale os seguintes pacotes do Go:
go get github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai
Habilite o acompanhamento de dependências para o código.
go mod init example/azure-openai
Criar o aplicativo Go
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.AzureSearchChatExtensionConfiguration{ // 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.AzureSearchChatExtensionParameters{ 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) } fmt.Fprintf(os.Stderr, "Extensions Context Role: %s\nExtensions Context (length): %d\n", *resp.Choices[0].Message.Role, len(*resp.Choices[0].Message.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.
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
Crie e atribua variáveis de ambiente persistentes para sua chave e ponto de extremidade.
Importante
Se você usar uma chave de API, armazene-a com segurança em outro lugar, como no Azure Key Vault. Não inclua a chave da API diretamente no seu código e nunca a publique publicamente.
Para obter mais informações sobre a segurança dos serviços de IA, confira Autenticar solicitações para serviços de IA do Azure.
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 com 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.
- Recursos dos serviços de IA do Azure
- Recursos da Pesquisa de IA do Azure
- Recursos do serviço de aplicativos do Azure