Megosztás a következőn keresztül:


Rövid útmutató: Csevegés Azure OpenAI-modellekkel a saját adataival

Referencia-forráskódcsomag | | (pypi) | -minták

A fenti hivatkozások a Pythonhoz készült OpenAI API-ra hivatkoznak. Nincs Azure-specifikus OpenAI Python SDK. Megtudhatja, hogyan válthat az OpenAI-szolgáltatások és az Azure OpenAI-szolgáltatások között.

Ebben a rövid útmutatóban saját adatokat használhat azure OpenAI-modellekkel. Az Azure OpenAI-modellek adatain való használata hatékony beszélgetési AI-platformot biztosít, amely gyorsabb és pontosabb kommunikációt tesz lehetővé.

Előfeltételek

Adatok hozzáadása az Azure OpenAI Studióval

Tipp.

Az Azure Developer CLI használatával programozott módon hozhatja létre az Azure OpenAI-hoz szükséges erőforrásokat az adatokon

Lépjen az Azure OpenAI Studióba, és jelentkezzen be olyan hitelesítő adatokkal, amelyek hozzáférnek az Azure OpenAI-erőforráshoz. A bejelentkezési munkafolyamat során vagy után válassza ki a megfelelő könyvtárat, Azure-előfizetést és Azure OpenAI-erőforrást.

  1. Válassza a Saját adatcsempét

    Képernyőkép az Azure OpenAI Studio kezdőlapjáról.

  2. A megjelenő panelen válassza a Fájlok feltöltése (előzetes verzió) lehetőséget az Adatforrás kiválasztása területen. Az Azure OpenAI-nak tárolóerőforrásra és keresési erőforrásra is szüksége van az adatok eléréséhez és indexeléséhez.

    Tipp.

    1. Ahhoz, hogy az Azure OpenAI hozzáférhessen a tárfiókhoz, be kell kapcsolnia a forrásközi erőforrás-megosztást (CORS). Ha a CORS még nincs bekapcsolva az Azure Blob Storage-erőforráshoz, válassza a CORS bekapcsolása lehetőséget.

    2. Válassza ki az Azure AI Search-erőforrást, és válassza ki azt a nyugtát, hogy a csatlakozás használatot fog kapni a fiókjában. Ezután válassza a Tovább gombra.

    Képernyőkép adatforrás kiválasztásának lehetőségeiről az Azure OpenAI Studióban.

  3. A Fájlok feltöltése panelen válassza a Tallózás a fájlhoz lehetőséget, és válassza ki az előfeltételek szakaszból letöltött fájlokat, illetve a saját adatait. Ezután válassza a Fájlok feltöltése lehetőséget. Ezután válassza a Tovább gombra.

  4. Az Adatkezelés panelen kiválaszthatja, hogy engedélyezi-e a szemantikai keresést vagy az index vektorkeresését.

    Fontos

  5. Tekintse át a megadott adatokat, és válassza a Mentés és bezárás lehetőséget. Most már cseveghet a modellel, és az adatokból származó információkat fogja használni a válasz létrehozásához.

Csevegési játszótér

Kezdje el az Azure OpenAI képességeit kód nélküli megközelítéssel a csevegési játszótéren keresztül. Ez egyszerűen egy szövegdoboz, ahol elküldhet egy kérést a befejezés létrehozásához. Ezen a lapon gyorsan iterálhat és kísérletezhet a képességekkel.

Képernyőkép az Azure OpenAI Studio játszótéri oldaláról, kiemelt szakaszokkal.

A játszótér lehetővé teszi a csevegési élmény testreszabását. A jobb oldalon az Üzembe helyezés lehetőséget választva meghatározhatja, hogy melyik modell hoz létre választ az index keresési eredményei alapján. A jövőbeli válaszok beszélgetési előzményeiként felveendő múltbeli üzenetek számát adja meg. A beszélgetési előzmények kontextust adnak a kapcsolódó válaszok létrehozásához, de tokenhasználatot is használnak. A bemeneti jogkivonat előrehaladási mutatója nyomon követi a beküldött kérdés tokenszámát.

A bal oldalon található Speciális beállítások futtatókörnyezeti paraméterek, amelyek lehetővé teszik a releváns adatok beolvasását és keresését az adatokból. Hasznos eset, ha meg szeretné győződni arról, hogy a válaszok csak az adatok alapján jönnek létre, vagy ha úgy találja, hogy a modell nem tud olyan választ generálni, amely az adatokon meglévő információkon alapul.

  • A szigorúság határozza meg a rendszer agresszivitását a keresési dokumentumok szűrésében a hasonlósági pontszámok alapján. Az 5-ös szigorúság azt jelzi, hogy a rendszer agresszíven kiszűri a dokumentumokat, és nagyon magas hasonlósági küszöbértéket alkalmaz. A szemantikai keresés ebben a forgatókönyvben hasznos lehet, mert a rangsorolási modellek jobb munkát végeznek a lekérdezés szándékának következtetésében. Az alacsonyabb szintű szigorúság részletesebb válaszokat eredményez, de tartalmazhat olyan információkat is, amelyek nem szerepelnek az indexben. Ez alapértelmezés szerint 3 értékre van állítva.

  • A lekért dokumentumok egy 3, 5, 10 vagy 20 értékre állítható egész szám, amely szabályozza a nagy nyelvi modellnek biztosított dokumentumtömbök számát a végső válasz megfogalmazásához. Alapértelmezés szerint ez az 5 értékre van állítva.

  • Ha engedélyezve van az adatokra adott válaszok korlátozása, a modell csak a dokumentumokra próbál támaszkodni a válaszokra. Ez alapértelmezés szerint igaz értékre van állítva.

Képernyőkép a speciális beállításokról.

Küldje el az első lekérdezést. A csevegési modellek a kérdés- és válaszgyakorlatokban a legjobban teljesítenek. Például: "Mik az elérhető állapotterveim?" vagy "Mi az állapot plusz lehetőség?".

Az adatelemzést igénylő lekérdezések valószínűleg sikertelenek lesznek, például "Melyik állapotterv a legnépszerűbb?". Az összes adatra vonatkozó információt igénylő lekérdezések is valószínűleg sikertelenek lesznek, például :"Hány dokumentumot töltöttem fel?". Ne feledje, hogy a keresőmotor olyan adattömböket keres, amelyek pontos vagy hasonló kifejezésekkel, kifejezésekkel vagy szerkezetekkel rendelkeznek a lekérdezéshez. És bár a modell megértheti a kérdést, ha a keresési eredmények adatkészletből származó adattömbök, nem a megfelelő információ az ilyen típusú kérdések megválaszolásához.

A csevegéseket a válaszban visszaadott dokumentumok (adattömbök) száma korlátozza (az Azure OpenAI Studio játszótéren 3–20-ra korlátozva). Képzelhető el, hogy "az összes cím" kérdésének megválaszolásához a teljes vektortároló teljes vizsgálata szükséges.

A modell üzembe helyezése

Ha elégedett az Azure OpenAI Studio felhasználói élményével, közvetlenül a Studióból is üzembe helyezhet egy webalkalmazást a Telepítés a gombra kattintva.

Képernyőkép a modell üzembe helyezésének gombjáról az Azure OpenAI Studióban.

Ez lehetővé teszi, hogy önálló webalkalmazásban, vagy a Copilot Studióban (előzetes verzió) telepítsen egy copilotot, ha saját adatokat használ a modellen.

Ha például egy webalkalmazás üzembe helyezését választja:

A webalkalmazás első üzembe helyezésekor válassza az Új webalkalmazás létrehozása lehetőséget. Válasszon egy nevet az alkalmazásnak, amely az alkalmazás URL-címének része lesz. Például: https://<appname>.azurewebsites.net.

Válassza ki a közzétett alkalmazás előfizetését, erőforráscsoportját, helyét és díjszabási csomagját. Meglévő alkalmazás frissítéséhez válassza a Közzététel egy meglévő webalkalmazásban lehetőséget, és válassza ki az előző alkalmazás nevét a legördülő menüből.

Ha úgy dönt, hogy üzembe helyez egy webalkalmazást, tekintse meg a használatának fontos szempontjait .

A szükséges változók lekérése

Az Azure OpenAI-ra való sikeres híváshoz a következő változókra van szükség. Ez a rövid útmutató feltételezi, hogy feltöltötte az adatokat egy Azure Blob Storage-fiókba, és létrehozott egy Azure AI Search-indexet. Lásd: Adatok hozzáadása az Azure AI Studióval

Változó neve Érték
AZURE_OPENAI_ENDPOINT Ez az érték a Kulcsok & végpont szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure OpenAI-erőforrást. Az értéket az Azure AI Studio>Chat playground>Code nézetében is megtalálhatja. Példavégpont: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Ez az érték az Erőforrás-kezelési>kulcsok > Végpont szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure OpenAI-erőforrást. A következők bármelyikét használhatja: KEY1 vagy KEY2. A két kulcs mindig lehetővé teszi a kulcsok biztonságos elforgatását és újragenerálását anélkül, hogy szolgáltatáskimaradást okoz.
AZURE_OPENAI_DEPLOYMENT_ID Ez az érték a modell üzembe helyezésekor az üzembe helyezéshez választott egyéni névnek felel meg. Ez az érték az Azure Portal erőforrás-kezelési üzembe helyezései vagy az Azure AI Studio felügyeleti>üzembe helyezései alatt található.>
AZURE_AI_SEARCH_ENDPOINT Ez az érték az Áttekintés szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure AI Search-erőforrást.
AZURE_AI_SEARCH_API_KEY Ez az érték a Gépház> Keys szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure AI Search-erőforrást. Használhatja az elsődleges rendszergazdai kulcsot vagy a másodlagos rendszergazdai kulcsot. A két kulcs mindig lehetővé teszi a kulcsok biztonságos elforgatását és újragenerálását anélkül, hogy szolgáltatáskimaradást okoz.
AZURE_AI_SEARCH_INDEX Ez az érték az adatok tárolásához létrehozott index nevének felel meg. Az Azure AI Search-erőforrás Azure Portalról történő vizsgálatakor az Áttekintés szakaszban találja.

Környezeti változók

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

Egy új .NET Core-alkalmazás létrehozása

Egy konzolablakban (például parancsmag, PowerShell vagy Bash) a dotnet new paranccsal hozzon létre egy új konzolalkalmazást a névvel azure-openai-quickstart. Ez a parancs létrehoz egy egyszerű "„Helló világ!” alkalmazás" projektet egyetlen C#-forrásfájllal: Program.cs.

dotnet new console -n azure-openai-quickstart

Módosítsa a könyvtárat az újonnan létrehozott alkalmazásmappára. Az alkalmazást a következőkkel hozhatja létre:

dotnet build

A buildkimenet nem tartalmazhat figyelmeztetést vagy hibát.

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

Telepítse az OpenAI .NET ügyfélkódtárat a következőkkel:

dotnet add package Azure.AI.OpenAI --prerelease

Nyissa meg a Program.cs fájlt a projektkönyvtárban, és cserélje le annak tartalmát a következő kódra:

Válaszstreamelés nélkül

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

Fontos

Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. A hitelesítő adatok biztonságával kapcsolatos további információkért tekintse meg az Azure AI-szolgáltatások biztonsági cikkét.

dotnet run program.cs

Hozam

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

Ez megvárja, amíg a modell a teljes választ generálja az eredmények nyomtatása előtt. Ha aszinkron módon szeretné streamelni a választ, és ki szeretné nyomtatni az eredményeket, a következő példában lecserélheti a Program.cs tartalmát a kódra.

Aszinkron streameléssel

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

A szükséges változók lekérése

Az Azure OpenAI-ra való sikeres híváshoz a következő változókra van szükség. Ez a rövid útmutató feltételezi, hogy feltöltötte az adatokat egy Azure Blob Storage-fiókba, és létrehozott egy Azure AI Search-indexet. További információ: Adatok hozzáadása az Azure AI Studióval.

Változó neve Érték
AZURE_OPENAI_ENDPOINT Ezt az értéket a Kulcsok & végpont szakaszban találja, amikor az Azure Portalról vizsgálja meg az Azure OpenAI-erőforrást. Az értéket az Azure AI Studio>Chat playground>Code nézetében is megtalálhatja. Példavégpont: https://my-resource.openai.azure.com.
AZURE_OPENAI_API_KEY Ezt az értéket az Erőforrás-kezelési>kulcsok & végpont szakaszban találja, amikor az Azure Portalról vizsgálja meg az Azure OpenAI-erőforrást. A következők bármelyikét használhatja: KEY1 vagy KEY2. A két kulcs mindig lehetővé teszi a kulcsok biztonságos elforgatását és újragenerálását anélkül, hogy szolgáltatáskimaradást okoz.
AZURE_OPEN_AI_DEPLOYMENT_ID Ez az érték a modell üzembe helyezésekor az üzembe helyezéshez választott egyéni névnek felel meg. Ezt az értéket az Azure Portal erőforrás-kezelési>üzembe helyezései vagy az Azure AI Studio Felügyeleti>üzembe helyezései alatt találja.
AZURE_AI_SEARCH_ENDPOINT Ezt az értéket az Áttekintés szakaszban találja, amikor az Azure Portalról vizsgálja meg az Azure AI Search-erőforrást.
AZURE_AI_SEARCH_API_KEY Ezt az értéket a Gépház> Kulcsok szakaszban találja, amikor az Azure Portalról vizsgálja meg az Azure AI Search-erőforrást. Használhatja az elsődleges rendszergazdai kulcsot vagy a másodlagos rendszergazdai kulcsot. A két kulcs mindig lehetővé teszi a kulcsok biztonságos elforgatását és újragenerálását anélkül, hogy szolgáltatáskimaradást okoz.
AZURE_AI_SEARCH_INDEX Ez az érték az adatok tárolásához létrehozott index nevének felel meg. Az Azure AI Search-erőforrás Azure Portalról történő vizsgálatakor az Áttekintés szakaszban találja.

Környezeti változók

Feljegyzés

A Spring AI alapértelmezés szerint a modell nevét adja meg gpt-35-turbo. Csak akkor kell megadni az SPRING_AI_AZURE_OPENAI_MODEL értéket, ha egy másik nevű modellt telepített.

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

Új Spring-alkalmazás létrehozása

A Spring AI jelenleg nem támogatja azokat a AzureCognitiveSearchChatExtensionConfiguration beállításokat, amelyek lehetővé teszik, hogy egy Azure AI-lekérdezés beágyazza a beolvasási kiterjesztett generációs (RAG) metódust, és elrejtse a részleteket a felhasználó elől. Alternatív megoldásként továbbra is meghívhatja a RAG metódust közvetlenül az alkalmazásban az Azure AI Search-indexben lévő adatok lekérdezéséhez, valamint a lekért dokumentumok használatával bővítheti a lekérdezést.

A Spring AI támogatja a VectorStore absztrakciót, és az Azure AI Search becsomagolható egy Spring AI VectorStore-implementációba az egyéni adatok lekérdezéséhez. Az alábbi projekt az Azure AI Search által támogatott egyéni VectorStore-t implementálja, és közvetlenül végrehajtja a RAG-műveleteket.

Egy Bash-ablakban hozzon létre egy új könyvtárat az alkalmazáshoz, és navigáljon hozzá.

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

Futtassa a spring init parancsot a munkakönyvtárból. Ez a parancs létrehoz egy standard könyvtárstruktúrát a Spring-projekthez, beleértve a fő Java-osztály forrásfájlját és a Maven-alapú projektek kezeléséhez használt pom.xml fájlt.

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

A létrehozott fájlok és mappák a következő struktúrához hasonlítanak:

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

Spring-alkalmazás szerkesztése

  1. Szerkessze a pom.xml fájlt.

    A projektkönyvtár gyökerében nyissa meg a pom.xml fájlt az előnyben részesített szerkesztőben vagy IDE-ben, és írja felül a fájlt a következő tartalommal:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>3.2.0</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.example</groupId>
        <artifactId>ai-custom-data-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>AICustomData</name>
        <description>Demo project for Spring Boot</description>
        <properties>
            <java.version>17</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.experimental.ai</groupId>
                <artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId>
                <version>0.7.0-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>com.azure</groupId>
                <artifactId>azure-search-documents</artifactId>
                <version>11.6.0-beta.10</version>
                <exclusions>
                    <!-- exclude this to avoid changing the default serializer and the null-value behavior -->
                    <exclusion>
                        <groupId>com.azure</groupId>
                        <artifactId>azure-core-serializer-json-jackson</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
        <repositories>
            <repository>
                <id>spring-snapshots</id>
                <name>Spring Snapshots</name>
                <url>https://repo.spring.io/snapshot</url>
                <releases>
                    <enabled>false</enabled>
                </releases>
            </repository>
        </repositories>
    </project>
    
  2. Az src/main/java/com/example/aicustomdatademo mappában nyissa meg a AiCustomDataApplication.java az előnyben részesített szerkesztőben vagy IDE-ben, és illessze be a következő kódot:

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

    Fontos

    Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. A hitelesítő adatok biztonságával kapcsolatos további információkért tekintse meg az Azure AI-szolgáltatások biztonsági cikkét.

  3. Lépjen vissza a projekt gyökérmappájához, és futtassa az alkalmazást az alábbi paranccsal:

    ./mvnw spring-boot:run
    

Hozam

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

A szükséges változók lekérése

Az Azure OpenAI-ra való sikeres híváshoz a következő változókra van szükség. Ez a rövid útmutató feltételezi, hogy feltöltötte az adatokat egy Azure Blob Storage-fiókba, és létrehozott egy Azure AI Search-indexet. Lásd: Adatok hozzáadása az Azure AI Studióval

Változó neve Érték
AZURE_OPENAI_ENDPOINT Ez az érték a Kulcsok & végpont szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure OpenAI-erőforrást. Az értéket az Azure AI Studio>Chat playground>Code nézetében is megtalálhatja. Példavégpont: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Ez az érték az Erőforrás-kezelési>kulcsok > Végpont szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure OpenAI-erőforrást. A következők bármelyikét használhatja: KEY1 vagy KEY2. A két kulcs mindig lehetővé teszi a kulcsok biztonságos elforgatását és újragenerálását anélkül, hogy szolgáltatáskimaradást okoz.
AZURE_OPENAI_DEPLOYMENT_ID Ez az érték a modell üzembe helyezésekor az üzembe helyezéshez választott egyéni névnek felel meg. Ez az érték az Azure Portal erőforrás-kezelési üzembe helyezései vagy az Azure AI Studio felügyeleti>üzembe helyezései alatt található.>
AZURE_AI_SEARCH_ENDPOINT Ez az érték az Áttekintés szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure AI Search-erőforrást.
AZURE_AI_SEARCH_API_KEY Ez az érték a Gépház> Keys szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure AI Search-erőforrást. Használhatja az elsődleges rendszergazdai kulcsot vagy a másodlagos rendszergazdai kulcsot. A két kulcs mindig lehetővé teszi a kulcsok biztonságos elforgatását és újragenerálását anélkül, hogy szolgáltatáskimaradást okoz.
AZURE_AI_SEARCH_INDEX Ez az érték az adatok tárolásához létrehozott index nevének felel meg. Az Azure AI Search-erőforrás Azure Portalról történő vizsgálatakor az Áttekintés szakaszban találja.

Környezeti változók

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

Csomópontalkalmazás létrehozása

Egy konzolablakban (pl. cmd, PowerShell vagy Bash) hozzon létre egy új mappát az alkalmazásnak, majd navigáljon oda. Ezután futtassa a npm init parancsot egy csomópontalkalmazás létrehozásához egy package.json fájllal.

npm init

Telepítse az ügyfélkódtárat

Telepítse az Azure OpenAI-ügyfél- és Azure Identity-kódtárakat JavaScripthez az npm használatával:

npm install @azure/openai @azure/identity

Az alkalmazás package.json fájlja frissül a függőségekkel.

Mintaalkalmazás létrehozása

Nyisson meg egy parancssort, ahol az új projektet szeretné, és hozzon létre egy ChatWithOwnData.js nevű új fájlt. Másolja a következő kódot a ChatWithOwnData.js fájlba.

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

Fontos

Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. A hitelesítő adatok biztonságával kapcsolatos további információkért tekintse meg az Azure AI-szolgáltatások biztonsági cikkét.

node.exe ChatWithOwnData.js

Hozam

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.

A szükséges változók lekérése

Az Azure OpenAI-ra való sikeres híváshoz a következő változókra van szükség. Ez a rövid útmutató feltételezi, hogy feltöltötte az adatokat egy Azure Blob Storage-fiókba, és létrehozott egy Azure AI Search-indexet. Lásd: Adatok hozzáadása az Azure AI Studióval

Változó neve Érték
AZURE_OPENAI_ENDPOINT Ez az érték a Kulcsok & végpont szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure OpenAI-erőforrást. Az értéket az Azure AI Studio>Chat playground>Code nézetében is megtalálhatja. Példavégpont: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Ez az érték az Erőforrás-kezelési>kulcsok > Végpont szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure OpenAI-erőforrást. A következők bármelyikét használhatja: KEY1 vagy KEY2. A két kulcs mindig lehetővé teszi a kulcsok biztonságos elforgatását és újragenerálását anélkül, hogy szolgáltatáskimaradást okoz.
AZURE_OPENAI_DEPLOYMENT_ID Ez az érték a modell üzembe helyezésekor az üzembe helyezéshez választott egyéni névnek felel meg. Ez az érték az Azure Portal erőforrás-kezelési üzembe helyezései vagy az Azure AI Studio felügyeleti>üzembe helyezései alatt található.>
AZURE_AI_SEARCH_ENDPOINT Ez az érték az Áttekintés szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure AI Search-erőforrást.
AZURE_AI_SEARCH_API_KEY Ez az érték a Gépház> Keys szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure AI Search-erőforrást. Használhatja az elsődleges rendszergazdai kulcsot vagy a másodlagos rendszergazdai kulcsot. A két kulcs mindig lehetővé teszi a kulcsok biztonságos elforgatását és újragenerálását anélkül, hogy szolgáltatáskimaradást okoz.
AZURE_AI_SEARCH_INDEX Ez az érték az adatok tárolásához létrehozott index nevének felel meg. Az Azure AI Search-erőforrás Azure Portalról történő vizsgálatakor az Áttekintés szakaszban találja.

Környezeti változók

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

Python-környezet létrehozása

  1. Hozzon létre egy openai-python nevű új mappát a projekthez, és hozzon létre egy új Python-kódfájlt main.py. Váltás erre a könyvtárra:
mkdir openai-python
cd openai-python
  1. Telepítse a következő Python-kódtárakat:
pip install openai
pip install python-dotenv

A Python-alkalmazás létrehozása

  1. Nyissa meg a main.py fájlt a projektkönyvtárban, és adja hozzá a következő kódot:
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))

Fontos

Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. A hitelesítő adatok biztonságával kapcsolatos további információkért tekintse meg az Azure AI-szolgáltatások biztonsági cikkét.

  1. Hajtsa végre a következő parancsot:
python main.py

Az alkalmazás a választ JSON formátumban nyomtatja ki, amely számos forgatókönyvben használható. A lekérdezésre adott válaszokat és a feltöltött fájlokból származó idézeteket is tartalmazza.

A szükséges változók lekérése

Az Azure OpenAI-ra való sikeres híváshoz a következő változókra van szükség. Ez a rövid útmutató feltételezi, hogy feltöltötte az adatokat egy Azure Blob Storage-fiókba, és létrehozott egy Azure AI Search-indexet. Lásd: Adatok hozzáadása az Azure AI Studióval

Változó neve Érték
AZURE_OPENAI_ENDPOINT Ez az érték a Kulcsok & végpont szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure OpenAI-erőforrást. Az értéket az Azure AI Studio>Chat playground>Code nézetében is megtalálhatja. Példavégpont: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Ez az érték az Erőforrás-kezelési>kulcsok > Végpont szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure OpenAI-erőforrást. A következők bármelyikét használhatja: KEY1 vagy KEY2. A két kulcs mindig lehetővé teszi a kulcsok biztonságos elforgatását és újragenerálását anélkül, hogy szolgáltatáskimaradást okoz.
AZURE_OPENAI_DEPLOYMENT_ID Ez az érték a modell üzembe helyezésekor az üzembe helyezéshez választott egyéni névnek felel meg. Ez az érték az Azure Portal erőforrás-kezelési üzembe helyezései vagy az Azure AI Studio felügyeleti>üzembe helyezései alatt található.>
AZURE_AI_SEARCH_ENDPOINT Ez az érték az Áttekintés szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure AI Search-erőforrást.
AZURE_AI_SEARCH_API_KEY Ez az érték a Gépház> Keys szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure AI Search-erőforrást. Használhatja az elsődleges rendszergazdai kulcsot vagy a másodlagos rendszergazdai kulcsot. A két kulcs mindig lehetővé teszi a kulcsok biztonságos elforgatását és újragenerálását anélkül, hogy szolgáltatáskimaradást okoz.
AZURE_AI_SEARCH_INDEX Ez az érték az adatok tárolásához létrehozott index nevének felel meg. Az Azure AI Search-erőforrás Azure Portalról történő vizsgálatakor az Áttekintés szakaszban találja.

Környezeti változók

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

Példa PowerShell-parancsok

Az Azure OpenAI-csevegőmodellek úgy vannak optimalizálva, hogy beszélgetésként formázott bemenetekkel működjenek. A messages változó különböző szerepkörökkel rendelkező szótárakat ad át a rendszer, a felhasználó, az eszköz és az asszisztens által meghatározott beszélgetésben. A dataSources változó csatlakozik az Azure Cognitive Search-indexhez, és lehetővé teszi, hogy az Azure OpenAI-modellek válaszoljanak az adataival.

A modell válaszának aktiválásához egy felhasználói üzenetnek kell véget vetnie, amely jelzi, hogy az asszisztens válasza a sor.

Tipp.

A modell válaszának módosításához számos paraméter használható, például temperature vagy top_p. További információért tekintse meg a referenciadokumentációt .

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

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

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

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

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

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

Példakimenet

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

Fontos

Éles környezetben használja a hitelesítő adatok biztonságos tárolásának és elérésének biztonságos módját, például a PowerShell titkos kulcskezelését az Azure Key Vaulttal. A hitelesítő adatok biztonságával kapcsolatos további információkért tekintse meg az Azure AI-szolgáltatások biztonsági cikkét.

Csevegés a modellel webalkalmazás használatával

Ha az adatokat használó Azure OpenAI-modellel szeretne csevegni, üzembe helyezhet egy webalkalmazást az Azure OpenAI studióval vagy a GitHubon megadott példakóddal. Ez az alkalmazás az Azure App Service használatával települ, és felhasználói felületet biztosít a lekérdezések küldéséhez. Ez az alkalmazás az adatokat használó Azure OpenAI-modelleket, illetve az adatokat nem használó modelleket is használhatja. A követelményekkel, a beállítással és az üzembe helyezéssel kapcsolatos utasításokért tekintse meg az adattár olvasófájlját. A forráskód módosításával igény szerint testre szabhatja a webalkalmazás előtér- és háttérlogikát .

A szükséges változók lekérése

Az Azure OpenAI-ra való sikeres híváshoz a következő változókra van szükség. Ez a rövid útmutató feltételezi, hogy feltöltötte az adatokat egy Azure Blob Storage-fiókba, és létrehozott egy Azure AI Search-indexet. Lásd: Adatok hozzáadása az Azure AI Studióval

Változó neve Érték
AZURE_OPENAI_ENDPOINT Ez az érték a Kulcsok & végpont szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure OpenAI-erőforrást. Az értéket az Azure AI Studio>Chat playground>Code nézetében is megtalálhatja. Példavégpont: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Ez az érték az Erőforrás-kezelési>kulcsok > Végpont szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure OpenAI-erőforrást. A következők bármelyikét használhatja: KEY1 vagy KEY2. A két kulcs mindig lehetővé teszi a kulcsok biztonságos elforgatását és újragenerálását anélkül, hogy szolgáltatáskimaradást okoz.
AZURE_OPENAI_DEPLOYMENT_ID Ez az érték a modell üzembe helyezésekor az üzembe helyezéshez választott egyéni névnek felel meg. Ez az érték az Azure Portal erőforrás-kezelési üzembe helyezései vagy az Azure AI Studio felügyeleti>üzembe helyezései alatt található.>
AZURE_AI_SEARCH_ENDPOINT Ez az érték az Áttekintés szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure AI Search-erőforrást.
AZURE_AI_SEARCH_API_KEY Ez az érték a Gépház> Keys szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure AI Search-erőforrást. Használhatja az elsődleges rendszergazdai kulcsot vagy a másodlagos rendszergazdai kulcsot. A két kulcs mindig lehetővé teszi a kulcsok biztonságos elforgatását és újragenerálását anélkül, hogy szolgáltatáskimaradást okoz.
AZURE_AI_SEARCH_INDEX Ez az érték az adatok tárolásához létrehozott index nevének felel meg. Az Azure AI Search-erőforrás Azure Portalról történő vizsgálatakor az Áttekintés szakaszban találja.

Környezeti változók

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

Go-környezet létrehozása

  1. Hozzon létre egy openai-go nevű új mappát a projekthez, és egy új, sample.go nevű Go-kódfájlt. Váltás erre a könyvtárra:

    mkdir openai-go
    cd openai-go
    
  2. Telepítse a következő Go-csomagokat:

    go get github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai
    
  3. Engedélyezze a függőségek nyomon követését a kódhoz.

    go mod init example/azure-openai
    

A Go alkalmazás létrehozása

  1. Nyissa meg a sample.go fájlt a projektkönyvtárban, és adja hozzá a következő kódot:

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

    Fontos

    Éles környezetben biztonságos módon tárolhatja és érheti el a hitelesítő adatait, például az Azure Key Vaultot. A hitelesítő adatok biztonságával kapcsolatos további információkért tekintse meg az Azure AI-szolgáltatások biztonsági cikkét.

  2. Hajtsa végre a következő parancsot:

    go run sample.go
    

    Az alkalmazás kinyomtatja a választ, beleértve a lekérdezésre adott válaszokat és a feltöltött fájlokból származó idézeteket is.

A szükséges változók lekérése

Az Azure OpenAI-ra való sikeres híváshoz a következő változókra van szükség. Ez a rövid útmutató feltételezi, hogy feltöltötte az adatokat egy Azure Blob Storage-fiókba, és létrehozott egy Azure AI Search-indexet. Lásd: Adatok hozzáadása az Azure AI Studióval

Változó neve Érték
AZURE_OPENAI_ENDPOINT Ez az érték a Kulcsok & végpont szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure OpenAI-erőforrást. Az értéket az Azure AI Studio>Chat playground>Code nézetében is megtalálhatja. Példavégpont: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Ez az érték az Erőforrás-kezelési>kulcsok > Végpont szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure OpenAI-erőforrást. A következők bármelyikét használhatja: KEY1 vagy KEY2. A két kulcs mindig lehetővé teszi a kulcsok biztonságos elforgatását és újragenerálását anélkül, hogy szolgáltatáskimaradást okoz.
AZURE_OPENAI_DEPLOYMENT_ID Ez az érték a modell üzembe helyezésekor az üzembe helyezéshez választott egyéni névnek felel meg. Ez az érték az Azure Portal erőforrás-kezelési üzembe helyezései vagy az Azure AI Studio felügyeleti>üzembe helyezései alatt található.>
AZURE_AI_SEARCH_ENDPOINT Ez az érték az Áttekintés szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure AI Search-erőforrást.
AZURE_AI_SEARCH_API_KEY Ez az érték a Gépház> Keys szakaszban található, amikor az Azure Portalról vizsgálja meg az Azure AI Search-erőforrást. Használhatja az elsődleges rendszergazdai kulcsot vagy a másodlagos rendszergazdai kulcsot. A két kulcs mindig lehetővé teszi a kulcsok biztonságos elforgatását és újragenerálását anélkül, hogy szolgáltatáskimaradást okoz.
AZURE_AI_SEARCH_INDEX Ez az érték az adatok tárolásához létrehozott index nevének felel meg. Az Azure AI Search-erőforrás Azure Portalról történő vizsgálatakor az Áttekintés szakaszban találja.

Környezeti változók

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

Példa cURL-parancsok

Az Azure OpenAI-csevegőmodellek úgy vannak optimalizálva, hogy beszélgetésként formázott bemenetekkel működjenek. A messages változó különböző szerepkörökkel rendelkező szótárakat ad át a rendszer, a felhasználó, az eszköz és az asszisztens által meghatározott beszélgetésben. A dataSources változó csatlakozik az Azure AI Search-indexhez, és lehetővé teszi, hogy az Azure OpenAI-modellek válaszoljanak az adataival.

A modell válaszának aktiválásához egy felhasználói üzenetnek kell véget vetnie, amely jelzi, hogy az asszisztens válasza a sor.

Tipp.

A modell válaszának módosításához számos paraméter használható, például temperature vagy top_p. További információért tekintse meg a referenciadokumentációt .

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

Példakimenet

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

Csevegés a modellel webalkalmazás használatával

Ha az adatokat használó Azure OpenAI-modellel szeretne csevegni, üzembe helyezhet egy webalkalmazást az Azure OpenAI studióval vagy a GitHubon megadott példakóddal. Ez az alkalmazás az Azure App Service használatával települ, és felhasználói felületet biztosít a lekérdezések küldéséhez. Ez az alkalmazás az adatokat használó Azure OpenAI-modelleket, illetve az adatokat nem használó modelleket is használhatja. A követelményekkel, a beállítással és az üzembe helyezéssel kapcsolatos utasításokért tekintse meg az adattár olvasófájlját. A forráskód módosításával igény szerint testre szabhatja a webalkalmazás előtér- és háttérlogikát .

Az erőforrások eltávolítása

Ha törölni és eltávolítani szeretne egy Azure OpenAI- vagy Azure AI Search-erőforrást, törölheti az erőforrást vagy az erőforráscsoportot. Az erőforráscsoport törlése a hozzá társított egyéb erőforrásokat is törli.

Következő lépések