Share via


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

  • Azure-előfizetés – Hozzon létre egyet ingyenesen.

  • A hozzáférést az Azure OpenAI a kívánt Azure-előfizetésen belül kapja meg.

    Az Azure OpenAI regisztrációt igényel, és jelenleg csak jóváhagyott vállalati ügyfelek és partnerek számára érhető el. További információért tekintse meg az Azure OpenAI Szolgáltatás korlátozott hozzáférését ismertető témakört. Az Azure OpenAI-hoz való hozzáférésre a következő https://aka.ms/oai/accessűrlap kitöltésével jelentkezhet: . Ha probléma merül fel, nyisson meg egy hibát az adattárban, és lépjen velünk kapcsolatba.

  • Egy támogatott régióban, támogatott modellel üzembe helyezett Azure OpenAI-erőforrás.

  • Győződjön meg arról, hogy legalább a Cognitive Services közreműködői szerepköre van hozzárendelve az Azure OpenAI-erőforráshoz.

  • Ha nem rendelkezik saját adatokkal, töltse le a példaadatokat a GitHubról.

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 egy egyszerű ""Helló világ!" alkalmazás" projektet hoz létre 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