Snabbstart: Chatta med Azure OpenAI-modeller med dina egna data
Referenskällkodpaket | | (npm)Exempel |
Exempel på referenskällkodpaket | | (pypi) |
Länkarna ovan refererar till OpenAI API för Python. Det finns ingen Azure-specifik OpenAI Python SDK. Lär dig hur du växlar mellan OpenAI-tjänsterna och Azure OpenAI-tjänsterna.
Exempel på referenskällkodspaket | | (Go) |
I den här snabbstarten kan du använda dina egna data med Azure OpenAI-modeller. Genom att använda Azure OpenAI:s modeller på dina data kan du få en kraftfull ai-plattform för konversationer som möjliggör snabbare och mer exakt kommunikation.
Förutsättningar
En Azure-prenumeration – Skapa en kostnadsfritt.
Åtkomst beviljad till Azure OpenAI i den önskade Azure-prenumerationen.
Azure OpenAI kräver registrering och är för närvarande endast tillgängligt för godkända företagskunder och partner. Mer information finns i Begränsad åtkomst till Azure OpenAI-tjänsten . Du kan ansöka om åtkomst till Azure OpenAI genom att fylla i formuläret på https://aka.ms/oai/access. Öppna ett problem på den här lagringsplatsen för att kontakta oss om du har ett problem.
En Azure OpenAI-resurs som distribueras i en region som stöds och med en modell som stöds.
Se till att du har tilldelats rollen Cognitive Services-deltagare för Azure OpenAI-resursen.
Ladda ned exempeldata från GitHub om du inte har egna data.
Lägga till dina data med Azure OpenAI Studio
Dricks
Du kan använda Azure Developer CLI för att programmatiskt skapa de resurser som behövs för Azure OpenAI På dina data
Gå till Azure OpenAI Studio och logga in med autentiseringsuppgifter som har åtkomst till din Azure OpenAI-resurs. Under eller efter inloggningsarbetsflödet väljer du lämplig katalog, Azure-prenumeration och Azure OpenAI-resurs.
Välj panelen Bring your own data (Ta med egna data )
I fönstret som visas väljer du Ladda upp filer (förhandsversion) under Välj datakälla. Azure OpenAI behöver både en lagringsresurs och en sökresurs för att komma åt och indexera dina data.
Dricks
- Mer information finns i följande resurs:
- För dokument och datauppsättningar med lång text rekommenderar vi att du använder det tillgängliga skriptet för förberedelse av data.
För att Azure OpenAI ska få åtkomst till ditt lagringskonto måste du aktivera CORS (Cross-origin resource sharing). Om CORS inte redan är aktiverat för Azure Blob Storage-resursen väljer du Aktivera CORS.
Välj din Azure AI Search-resurs och välj bekräftelsen att anslutningen medför användning för ditt konto. Välj sedan Nästa.
I fönstret Ladda upp filer väljer du Bläddra efter en fil och väljer de filer som du laddade ned från avsnittet förutsättningar eller dina egna data. Välj sedan Ladda upp filer. Välj sedan Nästa.
I fönstret Datahantering kan du välja om du vill aktivera semantisk sökning eller vektorsökning för ditt index.
Viktigt!
- Semantisk sökning och vektorsökning omfattas av ytterligare priser. Du måste välja Grundläggande eller högre SKU för att aktivera semantisk sökning eller vektorsökning. Mer information finns i prisnivåskillnad och tjänstgränser .
- För att förbättra kvaliteten på svar på informationshämtning och modell rekommenderar vi att du aktiverar semantisk sökning efter följande datakällspråk: engelska, franska, spanska, portugisiska, italienska, Tyskland, kinesiska(Zh), japanska, koreanska, ryska och arabiska.
Granska informationen du angav och välj Spara och stäng. Nu kan du chatta med modellen och den använder information från dina data för att konstruera svaret.
Chattlekplats
Börja utforska Azure OpenAI-funktioner med en metod utan kod via chattlekplatsen. Det är bara en textruta där du kan skicka en uppmaning för att generera ett slutförande. Från den här sidan kan du snabbt iterera och experimentera med funktionerna.
Lekplatsen ger dig alternativ för att skräddarsy din chattupplevelse. Till höger kan du välja Distribution för att avgöra vilken modell som genererar ett svar med hjälp av sökresultaten från ditt index. Du väljer antalet tidigare meddelanden som ska inkluderas som konversationshistorik för framtida genererade svar. Konversationshistorik ger kontext för att generera relaterade svar men förbrukar även tokenanvändning. Förloppsindikatorn för indatatoken håller reda på antalet token för den fråga som du skickar.
Avancerade inställningar till vänster är körningsparametrar som ger dig kontroll över hämtning och sökning efter relevant information från dina data. Ett bra användningsfall är när du vill se till att svar endast genereras baserat på dina data eller om du upptäcker att modellen inte kan generera ett svar baserat på befintlig information om dina data.
Strikthet avgör systemets aggressivitet vid filtrering av sökdokument baserat på deras likhetspoäng. Att ange strikthet till 5 anger att systemet aggressivt filtrerar bort dokument och tillämpar ett mycket högt tröskelvärde för likhet. Semantisk sökning kan vara till hjälp i det här scenariot eftersom rangordningsmodellerna gör ett bättre jobb med att härleda frågans avsikt. Lägre nivåer av strikthet ger mer utförliga svar, men kan också innehålla information som inte finns i ditt index. Detta är inställt på 3 som standard.
Hämtade dokument är ett heltal som kan anges till 3, 5, 10 eller 20 och styr antalet dokumentsegment som tillhandahålls till den stora språkmodellen för att formulera det slutliga svaret. Som standard är detta inställt på 5.
När Begränsa svar på dina data är aktiverat försöker modellen bara förlita sig på dina dokument för svar. Detta är inställt på true som standard.
Skicka din första fråga. Chattmodellerna fungerar bäst i fråge- och svarsövningar. Till exempel "Vad är mina tillgängliga hälsoplaner?" eller "Vad är alternativet hälsa plus?".
Frågor som kräver dataanalys skulle förmodligen misslyckas, till exempel "Vilken hälsoplan är mest populär?". Frågor som kräver information om alla dina data kommer sannolikt också att misslyckas, till exempel "Hur många dokument har jag laddat upp?". Kom ihåg att sökmotorn letar efter segment med exakta eller liknande termer, fraser eller konstruktion till frågan. Och även om modellen kan förstå frågan, är det inte rätt information för att besvara den typen av frågor om sökresultaten är segment från datauppsättningen.
Chattar begränsas av antalet dokument (segment) som returneras i svaret (begränsat till 3–20 i Azure OpenAI Studio Playground). Som du kan föreställa dig kräver en fullständig genomsökning av hela vektorarkivet att ställa en fråga om "alla titlar".
Distribuera din modell
När du är nöjd med upplevelsen i Azure OpenAI Studio kan du distribuera en webbapp direkt från Studio genom att välja knappen Distribuera till .
Detta ger dig möjlighet att antingen distribuera till ett fristående webbprogram eller en andrepilot i Copilot Studio (förhandsversion) om du använder dina egna data i modellen.
Om du till exempel väljer att distribuera en webbapp:
Första gången du distribuerar en webbapp bör du välja Skapa en ny webbapp. Välj ett namn för appen, som blir en del av appens URL. Exempel: https://<appname>.azurewebsites.net
Välj din prenumeration, resursgrupp, plats och prisplan för den publicerade appen. Om du vill uppdatera en befintlig app väljer du Publicera till en befintlig webbapp och väljer namnet på din tidigare app på den nedrullningsbara menyn.
Om du väljer att distribuera en webbapp kan du läsa de viktiga övervägandena för att använda den.
Hämta nödvändiga variabler
För att kunna göra ett anrop mot Azure OpenAI behöver du följande variabler. Den här snabbstarten förutsätter att du har laddat upp dina data till ett Azure Blob Storage-konto och har skapat ett Azure AI Search-index. Se Lägga till dina data med Hjälp av Azure AI Studio
Variabelnamn | Värde |
---|---|
AZURE_OPENAI_ENDPOINT |
Det här värdet finns i avsnittet Nycklar och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan också hitta värdet i vyn Chattkod>i Azure AI Studio>. En exempelslutpunkt är: https://my-resoruce.openai.azure.com . |
AZURE_OPENAI_API_KEY |
Det här värdet finns i avsnittet Resurshanteringsnycklar>och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan använda antingen KEY1 eller KEY2 . Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten. |
AZURE_OPENAI_DEPLOYMENT_ID |
Det här värdet motsvarar det anpassade namn som du valde för distributionen när du distribuerade en modell. Det här värdet finns under Resource Management Deployments (Resurshanteringsdistributioner>) i Azure-portalen eller under Hanteringsdistributioner> i Azure AI Studio. |
AZURE_AI_SEARCH_ENDPOINT |
Det här värdet finns i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen. |
AZURE_AI_SEARCH_API_KEY |
Det här värdet finns i avsnittet Inställningar>nycklar när du undersöker din Azure AI Search-resurs från Azure-portalen. Du kan använda antingen den primära administratörsnyckeln eller den sekundära administratörsnyckeln. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten. |
AZURE_AI_SEARCH_INDEX |
Det här värdet motsvarar namnet på det index som du skapade för att lagra dina data. Du hittar den i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen. |
Miljövariabler
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
Skapa en ny .NET Core-app
I ett konsolfönster (till exempel cmd, PowerShell eller Bash) använder du dotnet new
kommandot för att skapa en ny konsolapp med namnet azure-openai-quickstart
. Det här kommandot skapar ett enkelt "Hello World"-projekt med en enda C#-källfil: Program.cs.
dotnet new console -n azure-openai-quickstart
Ändra katalogen till den nyligen skapade appmappen. Du kan skapa programmet med:
dotnet build
Kompileringsutdata får inte innehålla några varningar eller fel.
...
Build succeeded.
0 Warning(s)
0 Error(s)
...
Installera OpenAI .NET-klientbiblioteket med:
dotnet add package Azure.AI.OpenAI --prerelease
Öppna filen Program.cs från projektkatalogen och ersätt dess innehåll med följande kod:
Utan strömning av svar
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("===");
Viktigt!
För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information om säkerhet för autentiseringsuppgifter finns i artikeln om Säkerhet för Azure AI-tjänster.
dotnet run program.cs
Output
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]"
}
===
Detta väntar tills modellen har genererat hela svaret innan resultatet skrivs ut. Om du vill strömma svaret asynkront och skriva ut resultatet kan du ersätta innehållet i Program.cs med koden i nästa exempel.
Async med strömning
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);
}
}
Hämta nödvändiga variabler
För att kunna göra ett anrop mot Azure OpenAI behöver du följande variabler. Den här snabbstarten förutsätter att du har laddat upp dina data till ett Azure Blob Storage-konto och har skapat ett Azure AI Search-index. Mer information finns i Lägga till dina data med Hjälp av Azure AI Studio.
Variabelnamn | Värde |
---|---|
AZURE_OPENAI_ENDPOINT |
Du hittar det här värdet i avsnittet Nycklar och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan också hitta värdet i vyn Chattkod>i Azure AI Studio>. En exempelslutpunkt är: https://my-resource.openai.azure.com . |
AZURE_OPENAI_API_KEY |
Du hittar det här värdet i avsnittet Resurshanteringsnycklar>och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan använda antingen KEY1 eller KEY2 . Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten. |
AZURE_OPEN_AI_DEPLOYMENT_ID |
Det här värdet motsvarar det anpassade namn som du valde för distributionen när du distribuerade en modell. Du hittar det här värdet under Resurshanteringsdistributioner> i Azure-portalen eller under Hanteringsdistributioner> i Azure AI Studio. |
AZURE_AI_SEARCH_ENDPOINT |
Du hittar det här värdet i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen. |
AZURE_AI_SEARCH_API_KEY |
Du hittar det här värdet i avsnittet Inställningar>nycklar när du undersöker din Azure AI Search-resurs från Azure-portalen. Du kan använda antingen den primära administratörsnyckeln eller den sekundära administratörsnyckeln. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten. |
AZURE_AI_SEARCH_INDEX |
Det här värdet motsvarar namnet på det index som du skapade för att lagra dina data. Du hittar den i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen. |
Miljövariabler
Kommentar
Spring AI standardmodellnamnet till gpt-35-turbo
. Det är bara nödvändigt att ange SPRING_AI_AZURE_OPENAI_MODEL
värdet om du har distribuerat en modell med ett annat namn.
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
Skapa ett nytt Spring-program
Spring AI stöder för närvarande inte de AzureCognitiveSearchChatExtensionConfiguration
alternativ som gör att en Azure AI-fråga kan kapsla in rag-metoden (Retrieval Augmented Generation) och dölja informationen från användaren. Alternativt kan du fortfarande anropa RAG-metoden direkt i ditt program för att köra frågor mot data i ditt Azure AI Search-index och använda hämtade dokument för att utöka frågan.
Spring AI har stöd för en VectorStore-abstraktion, och du kan omsluta Azure AI Search i en Spring AI VectorStore-implementering för att köra frågor mot dina anpassade data. Följande projekt implementerar en anpassad VectorStore som backas upp av Azure AI Search och kör DIREKT RAG-åtgärder.
I ett Bash-fönster skapar du en ny katalog för din app och navigerar till den.
mkdir ai-custom-data-demo && cd ai-custom-data-demo
Kör kommandot från arbetskatalogen spring init
. Det här kommandot skapar en standardkatalogstruktur för ditt Spring-projekt, inklusive huvudkällfilen för Java-klassen och den pom.xml fil som används för att hantera Maven-baserade projekt.
spring init -a ai-custom-data-demo -n AICustomData --force --build maven -x
De genererade filerna och mapparna liknar följande struktur:
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
Redigera Spring-program
Redigera filen pom.xml .
Öppna filen pom.xml i önskad redigerare eller IDE från roten i projektkatalogen och skriv över filen med följande innehåll:
<?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>
Från mappen src/main/java/com/example/aicustomdatademo öppnar du AiCustomDataApplication.java i önskad redigerare eller IDE och klistrar in följande kod:
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; } }
Viktigt!
För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information om säkerhet för autentiseringsuppgifter finns i artikeln om Säkerhet för Azure AI-tjänster.
Gå tillbaka till projektrotmappen och kör appen med hjälp av följande kommando:
./mvnw spring-boot:run
Output
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: 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.
Hämta nödvändiga variabler
För att kunna göra ett anrop mot Azure OpenAI behöver du följande variabler. Den här snabbstarten förutsätter att du har laddat upp dina data till ett Azure Blob Storage-konto och har skapat ett Azure AI Search-index. Se Lägga till dina data med Hjälp av Azure AI Studio
Variabelnamn | Värde |
---|---|
AZURE_OPENAI_ENDPOINT |
Det här värdet finns i avsnittet Nycklar och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan också hitta värdet i vyn Chattkod>i Azure AI Studio>. En exempelslutpunkt är: https://my-resoruce.openai.azure.com . |
AZURE_OPENAI_API_KEY |
Det här värdet finns i avsnittet Resurshanteringsnycklar>och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan använda antingen KEY1 eller KEY2 . Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten. |
AZURE_OPENAI_DEPLOYMENT_ID |
Det här värdet motsvarar det anpassade namn som du valde för distributionen när du distribuerade en modell. Det här värdet finns under Resource Management Deployments (Resurshanteringsdistributioner>) i Azure-portalen eller under Hanteringsdistributioner> i Azure AI Studio. |
AZURE_AI_SEARCH_ENDPOINT |
Det här värdet finns i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen. |
AZURE_AI_SEARCH_API_KEY |
Det här värdet finns i avsnittet Inställningar>nycklar när du undersöker din Azure AI Search-resurs från Azure-portalen. Du kan använda antingen den primära administratörsnyckeln eller den sekundära administratörsnyckeln. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten. |
AZURE_AI_SEARCH_INDEX |
Det här värdet motsvarar namnet på det index som du skapade för att lagra dina data. Du hittar den i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen. |
Miljövariabler
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
Skapa ett Node-program
Skapa en ny katalog för din app i ett konsolfönster (till exempel cmd, PowerShell eller bash) och navigera till den. Kör npm init
sedan kommandot för att skapa ett nodprogram med en package.json fil.
npm init
Installera klientbiblioteket
Installera Azure OpenAI-klienten och Azure Identity-biblioteken för JavaScript med npm:
npm install @azure/openai @azure/identity
Appens package.json-fil uppdateras med beroendena.
Skapa ett exempelprogram
Öppna en kommandotolk där du vill ha det nya projektet och skapa en ny fil med namnet ChatWithOwnData.js. Kopiera följande kod till filen 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 };
Viktigt!
För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information om säkerhet för autentiseringsuppgifter finns i artikeln om Säkerhet för Azure AI-tjänster.
node.exe ChatWithOwnData.js
Output
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.
Hämta nödvändiga variabler
För att kunna göra ett anrop mot Azure OpenAI behöver du följande variabler. Den här snabbstarten förutsätter att du har laddat upp dina data till ett Azure Blob Storage-konto och har skapat ett Azure AI Search-index. Se Lägga till dina data med Hjälp av Azure AI Studio
Variabelnamn | Värde |
---|---|
AZURE_OPENAI_ENDPOINT |
Det här värdet finns i avsnittet Nycklar och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan också hitta värdet i vyn Chattkod>i Azure AI Studio>. En exempelslutpunkt är: https://my-resoruce.openai.azure.com . |
AZURE_OPENAI_API_KEY |
Det här värdet finns i avsnittet Resurshanteringsnycklar>och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan använda antingen KEY1 eller KEY2 . Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten. |
AZURE_OPENAI_DEPLOYMENT_ID |
Det här värdet motsvarar det anpassade namn som du valde för distributionen när du distribuerade en modell. Det här värdet finns under Resource Management Deployments (Resurshanteringsdistributioner>) i Azure-portalen eller under Hanteringsdistributioner> i Azure AI Studio. |
AZURE_AI_SEARCH_ENDPOINT |
Det här värdet finns i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen. |
AZURE_AI_SEARCH_API_KEY |
Det här värdet finns i avsnittet Inställningar>nycklar när du undersöker din Azure AI Search-resurs från Azure-portalen. Du kan använda antingen den primära administratörsnyckeln eller den sekundära administratörsnyckeln. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten. |
AZURE_AI_SEARCH_INDEX |
Det här värdet motsvarar namnet på det index som du skapade för att lagra dina data. Du hittar den i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen. |
Miljövariabler
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
Skapa en Python-miljö
- Skapa en ny mapp med namnet openai-python för projektet och en ny Python-kodfil med namnet main.py. Ändra till den katalogen:
mkdir openai-python
cd openai-python
- Installera följande Python-bibliotek:
pip install openai
pip install python-dotenv
Skapa Python-appen
- Öppna filen main.py från projektkatalogen och lägg till följande kod:
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))
Viktigt!
För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information om säkerhet för autentiseringsuppgifter finns i artikeln om Säkerhet för Azure AI-tjänster.
- Kör följande kommando:
python main.py
Programmet skriver ut svaret i ett JSON-format som är lämpligt för användning i många scenarier. Den innehåller både svar på din fråga och citat från dina uppladdade filer.
Hämta nödvändiga variabler
För att kunna göra ett anrop mot Azure OpenAI behöver du följande variabler. Den här snabbstarten förutsätter att du har laddat upp dina data till ett Azure Blob Storage-konto och har skapat ett Azure AI Search-index. Se Lägga till dina data med Hjälp av Azure AI Studio
Variabelnamn | Värde |
---|---|
AZURE_OPENAI_ENDPOINT |
Det här värdet finns i avsnittet Nycklar och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan också hitta värdet i vyn Chattkod>i Azure AI Studio>. En exempelslutpunkt är: https://my-resoruce.openai.azure.com . |
AZURE_OPENAI_API_KEY |
Det här värdet finns i avsnittet Resurshanteringsnycklar>och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan använda antingen KEY1 eller KEY2 . Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten. |
AZURE_OPENAI_DEPLOYMENT_ID |
Det här värdet motsvarar det anpassade namn som du valde för distributionen när du distribuerade en modell. Det här värdet finns under Resource Management Deployments (Resurshanteringsdistributioner>) i Azure-portalen eller under Hanteringsdistributioner> i Azure AI Studio. |
AZURE_AI_SEARCH_ENDPOINT |
Det här värdet finns i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen. |
AZURE_AI_SEARCH_API_KEY |
Det här värdet finns i avsnittet Inställningar>nycklar när du undersöker din Azure AI Search-resurs från Azure-portalen. Du kan använda antingen den primära administratörsnyckeln eller den sekundära administratörsnyckeln. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten. |
AZURE_AI_SEARCH_INDEX |
Det här värdet motsvarar namnet på det index som du skapade för att lagra dina data. Du hittar den i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen. |
Miljövariabler
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
Exempel på PowerShell-kommandon
Azure OpenAI-chattmodellerna är optimerade för att fungera med indata som är formaterade som en konversation. Variabeln messages
skickar en matris med ordlistor med olika roller i konversationen som avgränsas av system, användare, verktyg och assistent. Variabeln dataSources
ansluter till ditt Azure Cognitive Search-index och gör att Azure OpenAI-modeller kan svara med dina data.
Om du vill utlösa ett svar från modellen bör du sluta med ett användarmeddelande som anger att det är assistentens tur att svara.
Dricks
Det finns flera parametrar som du kan använda för att ändra modellens svar, till exempel temperature
eller top_p
. Mer information finns i referensdokumentationen.
# 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
Exempel på utdata
The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans.
Viktigt!
För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som PowerShell Secret Management med Azure Key Vault. Mer information om säkerhet för autentiseringsuppgifter finns i artikeln om Säkerhet för Azure AI-tjänster.
Chatta med din modell med hjälp av en webbapp
Om du vill börja chatta med Azure OpenAI-modellen som använder dina data kan du distribuera en webbapp med hjälp av Azure OpenAI Studio eller exempelkod som vi tillhandahåller på GitHub. Den här appen distribueras med Hjälp av Azure App Service och tillhandahåller ett användargränssnitt för att skicka frågor. Den här appen kan användas med Azure OpenAI-modeller som använder dina data eller modeller som inte använder dina data. Mer information om krav, konfiguration och distribution finns i readme-filen på lagringsplatsen. Du kan också anpassa klientdels- och serverdelslogik för webbappen genom att göra ändringar i källkoden.
Hämta nödvändiga variabler
För att kunna göra ett anrop mot Azure OpenAI behöver du följande variabler. Den här snabbstarten förutsätter att du har laddat upp dina data till ett Azure Blob Storage-konto och har skapat ett Azure AI Search-index. Se Lägga till dina data med Hjälp av Azure AI Studio
Variabelnamn | Värde |
---|---|
AZURE_OPENAI_ENDPOINT |
Det här värdet finns i avsnittet Nycklar och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan också hitta värdet i vyn Chattkod>i Azure AI Studio>. En exempelslutpunkt är: https://my-resoruce.openai.azure.com . |
AZURE_OPENAI_API_KEY |
Det här värdet finns i avsnittet Resurshanteringsnycklar>och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan använda antingen KEY1 eller KEY2 . Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten. |
AZURE_OPENAI_DEPLOYMENT_ID |
Det här värdet motsvarar det anpassade namn som du valde för distributionen när du distribuerade en modell. Det här värdet finns under Resource Management Deployments (Resurshanteringsdistributioner>) i Azure-portalen eller under Hanteringsdistributioner> i Azure AI Studio. |
AZURE_AI_SEARCH_ENDPOINT |
Det här värdet finns i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen. |
AZURE_AI_SEARCH_API_KEY |
Det här värdet finns i avsnittet Inställningar>nycklar när du undersöker din Azure AI Search-resurs från Azure-portalen. Du kan använda antingen den primära administratörsnyckeln eller den sekundära administratörsnyckeln. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten. |
AZURE_AI_SEARCH_INDEX |
Det här värdet motsvarar namnet på det index som du skapade för att lagra dina data. Du hittar den i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen. |
Miljövariabler
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
Skapa en Go-miljö
Skapa en ny mapp med namnet openai-go för projektet och en ny Go-kodfil med namnet sample.go. Ändra till den katalogen:
mkdir openai-go cd openai-go
Installera följande Go-paket:
go get github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai
Aktivera beroendespårning för din kod.
go mod init example/azure-openai
Skapa Go-appen
Öppna filen sample.go från projektkatalogen och lägg till följande kod:
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, ) }
Viktigt!
För produktion använder du ett säkert sätt att lagra och komma åt dina autentiseringsuppgifter som Azure Key Vault. Mer information om säkerhet för autentiseringsuppgifter finns i artikeln om Säkerhet för Azure AI-tjänster.
Kör följande kommando:
go run sample.go
Programmet skriver ut svaret med både svar på din fråga och citat från dina uppladdade filer.
Hämta nödvändiga variabler
För att kunna göra ett anrop mot Azure OpenAI behöver du följande variabler. Den här snabbstarten förutsätter att du har laddat upp dina data till ett Azure Blob Storage-konto och har skapat ett Azure AI Search-index. Se Lägga till dina data med Hjälp av Azure AI Studio
Variabelnamn | Värde |
---|---|
AZURE_OPENAI_ENDPOINT |
Det här värdet finns i avsnittet Nycklar och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan också hitta värdet i vyn Chattkod>i Azure AI Studio>. En exempelslutpunkt är: https://my-resoruce.openai.azure.com . |
AZURE_OPENAI_API_KEY |
Det här värdet finns i avsnittet Resurshanteringsnycklar>och slutpunkter när du undersöker din Azure OpenAI-resurs från Azure-portalen. Du kan använda antingen KEY1 eller KEY2 . Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten. |
AZURE_OPENAI_DEPLOYMENT_ID |
Det här värdet motsvarar det anpassade namn som du valde för distributionen när du distribuerade en modell. Det här värdet finns under Resource Management Deployments (Resurshanteringsdistributioner>) i Azure-portalen eller under Hanteringsdistributioner> i Azure AI Studio. |
AZURE_AI_SEARCH_ENDPOINT |
Det här värdet finns i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen. |
AZURE_AI_SEARCH_API_KEY |
Det här värdet finns i avsnittet Inställningar>nycklar när du undersöker din Azure AI Search-resurs från Azure-portalen. Du kan använda antingen den primära administratörsnyckeln eller den sekundära administratörsnyckeln. Om du alltid har två nycklar kan du rotera och återskapa nycklar på ett säkert sätt utan att orsaka avbrott i tjänsten. |
AZURE_AI_SEARCH_INDEX |
Det här värdet motsvarar namnet på det index som du skapade för att lagra dina data. Du hittar den i avsnittet Översikt när du undersöker din Azure AI Search-resurs från Azure-portalen. |
Miljövariabler
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
Exempel på cURL-kommandon
Azure OpenAI-chattmodellerna är optimerade för att fungera med indata som är formaterade som en konversation. Variabeln messages
skickar en matris med ordlistor med olika roller i konversationen som avgränsas av system, användare, verktyg och assistent. Variabeln dataSources
ansluter till ditt Azure AI Search-index och gör att Azure OpenAI-modeller kan svara med dina data.
Om du vill utlösa ett svar från modellen bör du sluta med ett användarmeddelande som anger att det är assistentens tur att svara.
Dricks
Det finns flera parametrar som du kan använda för att ändra modellens svar, till exempel temperature
eller top_p
. Mer information finns i referensdokumentationen.
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?"
}
]
}
'
Exempel på utdata
{
"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
}
}
Chatta med din modell med hjälp av en webbapp
Om du vill börja chatta med Azure OpenAI-modellen som använder dina data kan du distribuera en webbapp med hjälp av Azure OpenAI Studio eller exempelkod som vi tillhandahåller på GitHub. Den här appen distribueras med Hjälp av Azure App Service och tillhandahåller ett användargränssnitt för att skicka frågor. Den här appen kan användas med Azure OpenAI-modeller som använder dina data eller modeller som inte använder dina data. Mer information om krav, konfiguration och distribution finns i readme-filen på lagringsplatsen. Du kan också anpassa klientdels- och serverdelslogik för webbappen genom att göra ändringar i källkoden.
Rensa resurser
Om du vill rensa och ta bort en Azure OpenAI- eller Azure AI Search-resurs kan du ta bort resursen eller resursgruppen. Om du tar bort resursgruppen tas även alla andra resurser som är associerade med den bort.
Nästa steg
Feedback
https://aka.ms/ContentUserFeedback.
Kommer snart: Under hela 2024 kommer vi att fasa ut GitHub-problem som feedbackmekanism för innehåll och ersätta det med ett nytt feedbacksystem. Mer information finns i:Skicka och visa feedback för