Mulai cepat: Mengobrol dengan model Azure OpenAI menggunakan data Anda sendiri

Paket kode | Sumber Referensi | (pypi)Sampel |

Tautan di atas mereferensikan OPENAI API untuk Python. Tidak ada OpenAI Python SDK khusus Azure. Pelajari cara beralih antara layanan OpenAI dan layanan Azure OpenAI.

Dalam mulai cepat ini, Anda dapat menggunakan data Anda sendiri dengan model Azure OpenAI. Menggunakan model Azure OpenAI pada data Anda dapat memberi Anda platform AI percakapan yang kuat yang memungkinkan komunikasi yang lebih cepat dan lebih akurat.

Prasyarat

  • Langganan Azure - Buat langganan gratis.

  • Akses yang diberikan ke Azure OpenAI dalam langganan Azure yang diinginkan.

    Azure OpenAI memerlukan pendaftaran dan saat ini hanya tersedia untuk pelanggan dan mitra perusahaan yang disetujui. Lihat Akses terbatas ke Azure OpenAI Service untuk informasi selengkapnya. Anda dapat mengajukan permohonan akses ke Azure OpenAI dengan melengkapi formulir di https://aka.ms/oai/access. Buka masalah pada repositori ini untuk menghubungi kami jika Anda mengalami masalah.

  • Sumber daya Azure OpenAI disebarkan di wilayah yang didukung dengan model yang didukung.

  • Pastikan Anda diberi setidaknya peran Kontributor Cognitive Services untuk sumber daya Azure OpenAI.

  • Unduh contoh data dari GitHub jika Anda tidak memiliki data Anda sendiri.

Menambahkan data Anda menggunakan Azure OpenAI Studio

Tip

Anda dapat menggunakan Azure Developer CLI untuk membuat sumber daya yang diperlukan secara terprogram untuk Azure OpenAI On Your Data

Navigasi ke Azure OpenAI Studio dan masuk dengan kredensial yang memiliki akses ke sumber daya Azure OpenAI Anda. Selama atau setelah alur kerja masuk, pilih direktori, langganan Azure, dan sumber daya Azure OpenAI yang sesuai.

  1. Pilih petak peta Bawa data Anda sendiri

    Cuplikan layar halaman arahan Azure OpenAI Studio.

  2. Di panel yang muncul, pilih Unggah file (pratinjau) di bawah Pilih sumber data. Azure OpenAI memerlukan sumber daya penyimpanan dan sumber daya pencarian untuk mengakses dan mengindeks data Anda.

    Tip

    1. Agar Azure OpenAI mengakses akun penyimpanan Anda, Anda harus mengaktifkan Berbagi sumber daya lintas asal (CORS). Jika CORS belum diaktifkan untuk sumber daya Azure Blob Storage, pilih Aktifkan CORS.

    2. Pilih sumber daya Azure AI Search Anda, dan pilih pengakuan bahwa menyambungkannya akan menimbulkan penggunaan di akun Anda. Kemudian pilih Berikutnya.

    Cuplikan layar memperlihatkan opsi untuk memilih sumber data di Azure OpenAI Studio.

  3. Pada panel Unggah file , pilih Telusuri file dan pilih file yang Anda unduh dari bagian prasyarat , atau data Anda sendiri. Lalu pilih Unggah file. Kemudian pilih Berikutnya.

  4. Pada panel Manajemen data , Anda dapat memilih apakah akan mengaktifkan pencarian semantik atau pencarian vektor untuk indeks Anda.

    Penting

    • Pencarian semantik dan pencarian vektor tunduk pada harga tambahan. Anda perlu memilih SKU Dasar atau lebih tinggi untuk mengaktifkan pencarian semantik atau pencarian vektor. Lihat perbedaan tingkat harga dan batas layanan untuk informasi selengkapnya.
    • Untuk membantu meningkatkan kualitas pengambilan informasi dan respons model, sebaiknya aktifkan pencarian semantik untuk bahasa sumber data berikut: Inggris, Prancis, Spanyol, Portugis, Italia, Jerman, Cina(Zh), Jepang, Korea, Rusia, dan Arab.
  5. Tinjau detail yang Anda masukkan, dan pilih Simpan dan tutup. Anda sekarang dapat mengobrol dengan model dan akan menggunakan informasi dari data Anda untuk membangun respons.

Taman bermain obrolan

Mulai jelajahi kemampuan Azure OpenAI dengan pendekatan tanpa kode melalui taman bermain obrolan. Ini hanya kotak teks di mana Anda dapat mengirimkan permintaan untuk membuat penyelesaian. Dari halaman ini, Anda dapat dengan cepat melakukan iterasi dan bereksperimen dengan kemampuan.

Cuplikan layar dari halaman playground Azure OpenAI Studio dengan bagian yang disorot.

Taman bermain memberi Anda opsi untuk menyesuaikan pengalaman obrolan Anda. Di sebelah kanan, Anda dapat memilih Penyebaran untuk menentukan model mana yang menghasilkan respons menggunakan hasil pencarian dari indeks Anda. Anda memilih jumlah pesan sebelumnya untuk disertakan sebagai riwayat percakapan untuk respons yang dihasilkan di masa mendatang. Riwayat percakapan memberikan konteks untuk menghasilkan respons terkait tetapi juga menggunakan penggunaan token. Indikator kemajuan token input melacak jumlah token pertanyaan yang Anda kirimkan.

Pengaturan Tingkat Lanjut di sebelah kiri adalah parameter runtime, yang memberi Anda kontrol atas pengambilan dan mencari informasi yang relevan dari data Anda. Kasus penggunaan yang baik adalah ketika Anda ingin memastikan respons dihasilkan hanya berdasarkan data Anda atau Anda menemukan model tidak dapat menghasilkan respons berdasarkan informasi yang ada pada data Anda.

  • Keketatan menentukan agresivitas sistem dalam memfilter dokumen pencarian berdasarkan skor kesamaannya. Mengatur ketegasan ke 5 menunjukkan bahwa sistem akan secara agresif memfilter dokumen, menerapkan ambang kesamaan yang sangat tinggi. Pencarian semantik dapat membantu dalam skenario ini karena model peringkat melakukan pekerjaan yang lebih baik untuk menyimpulkan niat kueri. Tingkat keketatan yang lebih rendah menghasilkan lebih banyak jawaban verbose, tetapi mungkin juga menyertakan informasi yang tidak ada dalam indeks Anda. Ini diatur ke 3 secara default.

  • Dokumen yang diambil adalah bilangan bulat yang dapat diatur ke 3, 5, 10, atau 20, dan mengontrol jumlah gugus dokumen yang disediakan untuk model bahasa besar untuk merumuskan respons akhir. Secara default, ini diatur ke 5.

  • Saat Batasi respons terhadap data Anda diaktifkan, model hanya mencoba mengandalkan dokumen Anda untuk respons. Ini diatur ke true secara default.

Cuplikan layar pengaturan tingkat lanjut.

Kirim kueri pertama Anda. Model obrolan berkinerja terbaik dalam latihan tanya jawab. Misalnya, "Apa paket kesehatan saya yang tersedia?" atau "Apa opsi plus kesehatannya?".

Kueri yang memerlukan analisis data mungkin akan gagal, seperti "Paket kesehatan mana yang paling populer?". Kueri yang memerlukan informasi tentang semua data Anda juga kemungkinan akan gagal, seperti "Berapa banyak dokumen yang telah saya unggah?". Ingatlah bahwa mesin pencari mencari potongan yang memiliki istilah, frasa, atau konstruksi yang tepat atau serupa dengan kueri. Dan meskipun model mungkin memahami pertanyaan, jika hasil pencarian adalah gugus dari himpunan data, itu bukan informasi yang tepat untuk menjawab pertanyaan semacam itu.

Obrolan dibatasi oleh jumlah dokumen (potongan) yang dikembalikan dalam respons (dibatasi hingga 3-20 di taman bermain Azure OpenAI Studio). Seperti yang dapat Anda bayangkan, mengajukan pertanyaan tentang "semua judul" memerlukan pemindaian penuh dari seluruh penyimpanan vektor.

Sebarkan model anda

Setelah puas dengan pengalaman di studio Azure OpenAI, Anda dapat menyebarkan aplikasi web langsung dari Studio dengan memilih tombol Sebarkan ke .

Cuplikan layar memperlihatkan tombol penyebaran model di Azure OpenAI Studio.

Ini memberi Anda opsi untuk menyebarkan ke aplikasi web mandiri, atau salinan di Copilot Studio (pratinjau) jika Anda menggunakan data Anda sendiri pada model.

Sebagai contoh, jika Anda memilih untuk menyebarkan aplikasi web:

Saat pertama kali menyebarkan aplikasi web, Anda harus memilih Buat aplikasi web baru. Pilih nama untuk aplikasi, yang akan menjadi bagian dari URL aplikasi. Contohnya,https://<appname>.azurewebsites.net.

Pilih langganan, grup sumber daya, lokasi, dan paket harga Anda untuk aplikasi yang diterbitkan. Untuk memperbarui aplikasi yang sudah ada, pilih Terbitkan ke aplikasi web yang sudah ada dan pilih nama aplikasi Anda sebelumnya dari menu dropdown.

Jika Anda memilih untuk menyebarkan aplikasi web, lihat pertimbangan penting untuk menggunakannya.

Mengambil variabel yang diperlukan

Agar berhasil melakukan panggilan terhadap Azure OpenAI, Anda memerlukan variabel berikut. Mulai cepat ini mengasumsikan Anda telah mengunggah data Anda ke akun penyimpanan blob Azure dan membuat indeks Azure AI Search. Lihat Menambahkan data Anda menggunakan studio Azure AI

Nama variabel Nilai
AZURE_OPENAI_ENDPOINT Nilai ini dapat ditemukan di bagian Kunci & Titik Akhir saat memeriksa sumber daya Azure OpenAI Anda dari portal Azure. Atau, Anda dapat menemukan nilainya di tampilan Kode playground>Obrolan studio>Azure AI. Contoh titik akhir adalah: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Nilai ini dapat ditemukan di bagian Kunci Manajemen>sumber daya & Titik Akhir saat memeriksa sumber daya Azure OpenAI Anda dari portal Azure. Anda dapat menggunakan KEY1 atau KEY2. Selalu miliki dua kunci untuk memungkinkan Anda memutar dan meregenerasi kunci dengan aman tanpa menyebabkan gangguan layanan.
AZURE_OPENAI_DEPLOYMENT_ID Nilai ini sesuai dengan nama kustom yang Anda pilih untuk penyebaran saat Anda menyebarkan model. Nilai ini dapat ditemukan di bawah Penyebaran Manajemen>Sumber Daya di portal Azure atau sebagai alternatif di bawah Penyebaran Manajemen>di studio Azure AI.
AZURE_AI_SEARCH_ENDPOINT Nilai ini dapat ditemukan di bagian Gambaran Umum saat memeriksa sumber daya Azure AI Search Anda dari portal Azure.
AZURE_AI_SEARCH_API_KEY Nilai ini dapat ditemukan di bagian Pengaturan> Keys saat memeriksa sumber daya Azure AI Search Anda dari portal Azure. Anda dapat menggunakan kunci admin utama atau kunci admin sekunder. Selalu miliki dua kunci untuk memungkinkan Anda memutar dan meregenerasi kunci dengan aman tanpa menyebabkan gangguan layanan.
AZURE_AI_SEARCH_INDEX Nilai ini sesuai dengan nama indeks yang Anda buat untuk menyimpan data Anda. Anda dapat menemukannya di bagian Gambaran Umum saat memeriksa sumber daya Azure AI Search Anda dari portal Azure.

Variabel lingkungan

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

Buat aplikasi .NET Core baru

Di jendela konsol (seperti cmd, PowerShell, atau Bash), gunakan perintah dotnet new untuk membuat aplikasi konsol baru dengan nama azure-openai-quickstart. Perintah ini membuat proyek "Halo Dunia" sederhana dengan satu file sumber C#: Program.cs.

dotnet new console -n azure-openai-quickstart

Ubah direktori Anda ke folder aplikasi yang baru dibuat. Anda dapat membangun aplikasi dengan:

dotnet build

Output build tidak boleh berisi peringatan atau kesalahan.

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

Instal pustaka klien OpenAI .NET dengan:

dotnet add package Azure.AI.OpenAI --prerelease

Dari direktori proyek, buka file Program.cs dan ganti kontennya dengan kode berikut:

Tanpa streaming respons

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

Penting

Untuk produksi, gunakan cara yang aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya tentang keamanan kredensial, lihat artikel keamanan layanan Azure AI.

dotnet run program.cs

Output

Answer from assistant:
===
The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans [^1^].
===
Context information (e.g. citations) from chat extensions:
===
tool: {
  "citations": [
    {
      "content": "...",
      "id": null,
      "title": "...",
      "filepath": "...",
      "url": "...",
      "metadata": {
        "chunking": "orignal document size=1011. Scores=3.6390076 and None.Org Highlight count=38."
      },
      "chunk_id": "2"
    },
    ...
  ],
  "intent": "[\u0022What are my available health plans?\u0022]"
}
===

Ini akan menunggu sampai model menghasilkan seluruh responsnya sebelum mencetak hasilnya. Atau, jika Anda ingin melakukan streaming respons secara asinkron dan mencetak hasilnya, Anda dapat mengganti konten Program.cs dengan kode dalam contoh berikutnya.

Asinkron dengan streaming

using Azure;
using Azure.AI.OpenAI;
using System.Text.Json;
using static System.Environment;

string azureOpenAIEndpoint = GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT");
string azureOpenAIKey = GetEnvironmentVariable("AZURE_OPENAI_API_KEY");
string deploymentName = GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_ID");
string searchEndpoint = GetEnvironmentVariable("AZURE_AI_SEARCH_ENDPOINT");
string searchKey = GetEnvironmentVariable("AZURE_AI_SEARCH_API_KEY");
string searchIndex = GetEnvironmentVariable("AZURE_AI_SEARCH_INDEX");


var client = new OpenAIClient(new Uri(azureOpenAIEndpoint), new AzureKeyCredential(azureOpenAIKey));

var chatCompletionsOptions = new ChatCompletionsOptions()
{
    DeploymentName = deploymentName,
    Messages =
    {
        new ChatRequestUserMessage("What are my available health plans?"),
    },
    AzureExtensionsOptions = new AzureChatExtensionsOptions()
    {
        Extensions =
        {
            new AzureCognitiveSearchChatExtensionConfiguration()
            {
                SearchEndpoint = new Uri(searchEndpoint),
                Key = searchKey,
                IndexName = searchIndex,
            },
        }
    }
};
await foreach (StreamingChatCompletionsUpdate chatUpdate in client.GetChatCompletionsStreaming(chatCompletionsOptions))
{
    if (chatUpdate.Role.HasValue)
    {
        Console.Write($"{chatUpdate.Role.Value.ToString().ToUpperInvariant()}: ");
    }
    if (!string.IsNullOrEmpty(chatUpdate.ContentUpdate))
    {
        Console.Write(chatUpdate.ContentUpdate);
    }
}

Mengambil variabel yang diperlukan

Agar berhasil melakukan panggilan terhadap Azure OpenAI, Anda memerlukan variabel berikut. Mulai cepat ini mengasumsikan Anda telah mengunggah data Anda ke akun penyimpanan blob Azure dan membuat indeks Azure AI Search. Untuk informasi selengkapnya, lihat Menambahkan data Anda menggunakan studio Azure AI.

Nama variabel Nilai
AZURE_OPENAI_ENDPOINT Anda dapat menemukan nilai ini di bagian Kunci & Titik Akhir saat memeriksa sumber daya Azure OpenAI Anda dari portal Azure. Atau, Anda dapat menemukan nilainya di tampilan Kode playground>Obrolan studio>Azure AI. Contoh titik akhir adalah: https://my-resource.openai.azure.com.
AZURE_OPENAI_API_KEY Anda dapat menemukan nilai ini di bagian Kunci Manajemen>sumber daya & Titik Akhir saat memeriksa sumber daya Azure OpenAI Anda dari portal Azure. Anda dapat menggunakan KEY1 atau KEY2. Selalu miliki dua kunci untuk memungkinkan Anda memutar dan meregenerasi kunci dengan aman tanpa menyebabkan gangguan layanan.
AZURE_OPEN_AI_DEPLOYMENT_ID Nilai ini sesuai dengan nama kustom yang Anda pilih untuk penyebaran saat Anda menyebarkan model. Anda dapat menemukan nilai ini di bawah Penyebaran Manajemen>Sumber Daya di portal Azure atau di bawah Penyebaran Manajemen>di studio Azure AI.
AZURE_AI_SEARCH_ENDPOINT Anda dapat menemukan nilai ini di bagian Gambaran Umum saat memeriksa sumber daya Azure AI Search Anda dari portal Azure.
AZURE_AI_SEARCH_API_KEY Anda dapat menemukan nilai ini di bagian Pengaturan> Keys saat memeriksa sumber daya Azure AI Search Anda dari portal Azure. Anda dapat menggunakan kunci admin utama atau kunci admin sekunder. Selalu miliki dua kunci untuk memungkinkan Anda memutar dan meregenerasi kunci dengan aman tanpa menyebabkan gangguan layanan.
AZURE_AI_SEARCH_INDEX Nilai ini sesuai dengan nama indeks yang Anda buat untuk menyimpan data Anda. Anda dapat menemukannya di bagian Gambaran Umum saat memeriksa sumber daya Azure AI Search Anda dari portal Azure.

Variabel lingkungan

Catatan

Spring AI default nama model ke gpt-35-turbo. Anda hanya perlu memberikan SPRING_AI_AZURE_OPENAI_MODEL nilai jika Anda telah menyebarkan model dengan nama yang berbeda.

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

Membuat aplikasi Spring baru

Spring AI saat ini tidak mendukung AzureCognitiveSearchChatExtensionConfiguration opsi yang memungkinkan kueri Azure AI merangkum metode Pengambilan Augmented Generation (RAG) dan menyembunyikan detail dari pengguna. Sebagai alternatif, Anda masih dapat memanggil metode RAG langsung di aplikasi Anda untuk mengkueri data di indeks Azure AI Search Anda dan menggunakan dokumen yang diambil untuk menambah kueri Anda.

Spring AI mendukung abstraksi VectorStore, dan Anda dapat membungkus Azure AI Search dapat dibungkus dalam implementasi Spring AI VectorStore untuk mengkueri data kustom Anda. Proyek berikut mengimplementasikan VectorStore kustom yang didukung oleh Azure AI Search dan langsung menjalankan operasi RAG.

Di jendela Bash, buat direktori baru untuk aplikasi Anda, dan navigasikan ke dalamnya.

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

Jalankan perintah spring init dari direktori yang berfungsi. Perintah ini membuat struktur direktori standar untuk proyek Spring Anda termasuk file sumber kelas Java utama dan file pom.xml yang digunakan untuk mengelola proyek berbasis Maven.

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

File dan folder yang dihasilkan menyerupai struktur berikut:

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

Edit aplikasi Spring

  1. Edit file pom.xml.

    Dari akar direktori proyek, buka file pom.xml di editor atau IDE pilihan Anda dan timpa file dengan konten berikut:

    <?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. Dari folder src/main/java/com/example/aicustomdatademo, buka AiCustomDataApplication.java di editor atau IDE pilihan Anda dan tempelkan kode berikut:

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

    Penting

    Untuk produksi, gunakan cara yang aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya tentang keamanan kredensial, lihat artikel keamanan layanan Azure AI.

  3. Navigasi kembali ke folder akar proyek, dan jalankan aplikasi dengan menggunakan perintah berikut:

    ./mvnw spring-boot:run
    

Output

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.1.5)

2023-11-07T14:40:45.250-06:00  INFO 18557 --- [           main] c.e.a.AiCustomDataApplication            : No active profile set, falling back to 1 default profile: "default"
2023-11-07T14:40:46.035-06:00  INFO 18557 --- [           main] c.e.a.AiCustomDataApplication            : Started AiCustomDataApplication in 1.095 seconds (process running for 1.397)
Sending custom data prompt to AI service. One moment please...

Prompt created 1 generated response(s).
Generated response from "assistant": The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans.

Mengambil variabel yang diperlukan

Agar berhasil melakukan panggilan terhadap Azure OpenAI, Anda memerlukan variabel berikut. Mulai cepat ini mengasumsikan Anda telah mengunggah data Anda ke akun penyimpanan blob Azure dan membuat indeks Azure AI Search. Lihat Menambahkan data Anda menggunakan studio Azure AI

Nama variabel Nilai
AZURE_OPENAI_ENDPOINT Nilai ini dapat ditemukan di bagian Kunci & Titik Akhir saat memeriksa sumber daya Azure OpenAI Anda dari portal Azure. Atau, Anda dapat menemukan nilainya di tampilan Kode playground>Obrolan studio>Azure AI. Contoh titik akhir adalah: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Nilai ini dapat ditemukan di bagian Kunci Manajemen>sumber daya & Titik Akhir saat memeriksa sumber daya Azure OpenAI Anda dari portal Azure. Anda dapat menggunakan KEY1 atau KEY2. Selalu miliki dua kunci untuk memungkinkan Anda memutar dan meregenerasi kunci dengan aman tanpa menyebabkan gangguan layanan.
AZURE_OPENAI_DEPLOYMENT_ID Nilai ini sesuai dengan nama kustom yang Anda pilih untuk penyebaran saat Anda menyebarkan model. Nilai ini dapat ditemukan di bawah Penyebaran Manajemen>Sumber Daya di portal Azure atau sebagai alternatif di bawah Penyebaran Manajemen>di studio Azure AI.
AZURE_AI_SEARCH_ENDPOINT Nilai ini dapat ditemukan di bagian Gambaran Umum saat memeriksa sumber daya Azure AI Search Anda dari portal Azure.
AZURE_AI_SEARCH_API_KEY Nilai ini dapat ditemukan di bagian Pengaturan> Keys saat memeriksa sumber daya Azure AI Search Anda dari portal Azure. Anda dapat menggunakan kunci admin utama atau kunci admin sekunder. Selalu miliki dua kunci untuk memungkinkan Anda memutar dan meregenerasi kunci dengan aman tanpa menyebabkan gangguan layanan.
AZURE_AI_SEARCH_INDEX Nilai ini sesuai dengan nama indeks yang Anda buat untuk menyimpan data Anda. Anda dapat menemukannya di bagian Gambaran Umum saat memeriksa sumber daya Azure AI Search Anda dari portal Azure.

Variabel lingkungan

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

Membuat aplikasi Node

Di jendela konsol (seperti cmd, PowerShell, atau Bash), buat direktori baru untuk aplikasi Anda, dan buka direktori tersebut. Kemudian jalankan npm init perintah untuk membuat aplikasi simpul dengan file package.json .

npm init

Memasang pustaka klien

Instal pustaka klien Azure OpenAI dan Azure Identity untuk JavaScript dengan npm:

npm install @azure/openai @azure/identity

File package.json aplikasi Anda akan diperbarui dengan dependensi.

Membuat aplikasi sampel

Buka prompt perintah tempat Anda menginginkan proyek baru, dan buat file baru bernama ChatWithOwnData.js. Salin kode berikut ke dalam file ChatWithOwnData.js.

const { OpenAIClient, AzureKeyCredential } = require("@azure/openai");

// Set the Azure and AI Search values from environment variables
const endpoint = process.env["AZURE_OPENAI_ENDPOINT"];
const azureApiKey = process.env["AZURE_OPENAI_API_KEY"];
const deploymentId = process.env["AZURE_OPENAI_DEPLOYMENT_ID"];
const searchEndpoint = process.env["AZURE_AI_SEARCH_ENDPOINT"];
const searchKey = process.env["AZURE_AI_SEARCH_API_KEY"];
const searchIndex = process.env["AZURE_AI_SEARCH_INDEX"];


async function main(){
  const client = new OpenAIClient(endpoint, new AzureKeyCredential(azureApiKey));

  const messages = [
    { role: "user", content: "What are my available health plans?" },
  ];

  console.log(`Message: ${messages.map((m) => m.content).join("\n")}`);

  const events = await client.streamChatCompletions(deploymentId, messages, { 
    maxTokens: 128,
    azureExtensionOptions: {
      extensions: [
        {
          type: "AzureCognitiveSearch",
          endpoint: searchEndpoint,
          key: searchKey,
          indexName: searchIndex,
        },
      ],
    },
  });
  let response = "";
  for await (const event of events) {
    for (const choice of event.choices) {
      const newText = choice.delta?.content;
      if (!!newText) {
        response += newText;
        // To see streaming results as they arrive, uncomment line below
        // console.log(newText);
      }
    }
  }
  console.log(response);
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
});



module.exports = { main };

Penting

Untuk produksi, gunakan cara yang aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya tentang keamanan kredensial, lihat artikel keamanan layanan Azure AI.

node.exe ChatWithOwnData.js

Output

Message: What are my available health plans?
The available health plans in the Contoso Electronics plan and benefit packages are the Northwind Health Plus and Northwind Standard plans.

Mengambil variabel yang diperlukan

Agar berhasil melakukan panggilan terhadap Azure OpenAI, Anda memerlukan variabel berikut. Mulai cepat ini mengasumsikan Anda telah mengunggah data Anda ke akun penyimpanan blob Azure dan membuat indeks Azure AI Search. Lihat Menambahkan data Anda menggunakan studio Azure AI

Nama variabel Nilai
AZURE_OPENAI_ENDPOINT Nilai ini dapat ditemukan di bagian Kunci & Titik Akhir saat memeriksa sumber daya Azure OpenAI Anda dari portal Azure. Atau, Anda dapat menemukan nilainya di tampilan Kode playground>Obrolan studio>Azure AI. Contoh titik akhir adalah: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Nilai ini dapat ditemukan di bagian Kunci Manajemen>sumber daya & Titik Akhir saat memeriksa sumber daya Azure OpenAI Anda dari portal Azure. Anda dapat menggunakan KEY1 atau KEY2. Selalu miliki dua kunci untuk memungkinkan Anda memutar dan meregenerasi kunci dengan aman tanpa menyebabkan gangguan layanan.
AZURE_OPENAI_DEPLOYMENT_ID Nilai ini sesuai dengan nama kustom yang Anda pilih untuk penyebaran saat Anda menyebarkan model. Nilai ini dapat ditemukan di bawah Penyebaran Manajemen>Sumber Daya di portal Azure atau sebagai alternatif di bawah Penyebaran Manajemen>di studio Azure AI.
AZURE_AI_SEARCH_ENDPOINT Nilai ini dapat ditemukan di bagian Gambaran Umum saat memeriksa sumber daya Azure AI Search Anda dari portal Azure.
AZURE_AI_SEARCH_API_KEY Nilai ini dapat ditemukan di bagian Pengaturan> Keys saat memeriksa sumber daya Azure AI Search Anda dari portal Azure. Anda dapat menggunakan kunci admin utama atau kunci admin sekunder. Selalu miliki dua kunci untuk memungkinkan Anda memutar dan meregenerasi kunci dengan aman tanpa menyebabkan gangguan layanan.
AZURE_AI_SEARCH_INDEX Nilai ini sesuai dengan nama indeks yang Anda buat untuk menyimpan data Anda. Anda dapat menemukannya di bagian Gambaran Umum saat memeriksa sumber daya Azure AI Search Anda dari portal Azure.

Variabel lingkungan

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

Membuat lingkungan Python

  1. Buat folder baru bernama openai-python untuk proyek Anda dan file kode Python baru bernama main.py. Ubah menjadi direktori tersebut:
mkdir openai-python
cd openai-python
  1. Instal Pustaka Python berikut:
pip install openai
pip install python-dotenv

Membuat aplikasi Python

  1. Dari direktori proyek, buka file main.py dan tambahkan kode berikut:
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))

Penting

Untuk produksi, gunakan cara yang aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya tentang keamanan kredensial, lihat artikel keamanan layanan Azure AI.

  1. Jalankan perintah berikut:
python main.py

Aplikasi mencetak respons dalam format JSON yang cocok untuk digunakan dalam banyak skenario. Ini termasuk jawaban atas kueri dan kutipan Anda dari file yang Anda unggah.

Mengambil variabel yang diperlukan

Agar berhasil melakukan panggilan terhadap Azure OpenAI, Anda memerlukan variabel berikut. Mulai cepat ini mengasumsikan Anda telah mengunggah data Anda ke akun penyimpanan blob Azure dan membuat indeks Azure AI Search. Lihat Menambahkan data Anda menggunakan studio Azure AI

Nama variabel Nilai
AZURE_OPENAI_ENDPOINT Nilai ini dapat ditemukan di bagian Kunci & Titik Akhir saat memeriksa sumber daya Azure OpenAI Anda dari portal Azure. Atau, Anda dapat menemukan nilainya di tampilan Kode playground>Obrolan studio>Azure AI. Contoh titik akhir adalah: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Nilai ini dapat ditemukan di bagian Kunci Manajemen>sumber daya & Titik Akhir saat memeriksa sumber daya Azure OpenAI Anda dari portal Azure. Anda dapat menggunakan KEY1 atau KEY2. Selalu miliki dua kunci untuk memungkinkan Anda memutar dan meregenerasi kunci dengan aman tanpa menyebabkan gangguan layanan.
AZURE_OPENAI_DEPLOYMENT_ID Nilai ini sesuai dengan nama kustom yang Anda pilih untuk penyebaran saat Anda menyebarkan model. Nilai ini dapat ditemukan di bawah Penyebaran Manajemen>Sumber Daya di portal Azure atau sebagai alternatif di bawah Penyebaran Manajemen>di studio Azure AI.
AZURE_AI_SEARCH_ENDPOINT Nilai ini dapat ditemukan di bagian Gambaran Umum saat memeriksa sumber daya Azure AI Search Anda dari portal Azure.
AZURE_AI_SEARCH_API_KEY Nilai ini dapat ditemukan di bagian Pengaturan> Keys saat memeriksa sumber daya Azure AI Search Anda dari portal Azure. Anda dapat menggunakan kunci admin utama atau kunci admin sekunder. Selalu miliki dua kunci untuk memungkinkan Anda memutar dan meregenerasi kunci dengan aman tanpa menyebabkan gangguan layanan.
AZURE_AI_SEARCH_INDEX Nilai ini sesuai dengan nama indeks yang Anda buat untuk menyimpan data Anda. Anda dapat menemukannya di bagian Gambaran Umum saat memeriksa sumber daya Azure AI Search Anda dari portal Azure.

Variabel lingkungan

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

Contoh perintah PowerShell

Model obrolan Azure OpenAI dioptimalkan untuk bekerja dengan input yang diformat sebagai percakapan. Variabel messages melewati array kamus dengan peran yang berbeda dalam percakapan yang digambarkan oleh sistem, pengguna, alat, dan asisten. Variabel dataSources terhubung ke indeks Azure Cognitive Search Anda, dan memungkinkan model Azure OpenAI merespons menggunakan data Anda.

Untuk memicu respons dari model, Anda harus diakhir dengan pesan pengguna yang menunjukkan bahwa itu adalah giliran asisten untuk merespons.

Tip

Ada beberapa parameter yang dapat Anda gunakan untuk mengubah respons model, seperti temperature atau top_p. Lihat dokumentasi referensi untuk informasi selengkapnya.

# 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

Contoh output

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

Penting

Untuk produksi, gunakan cara aman untuk menyimpan dan mengakses kredensial Anda seperti Manajemen Rahasia PowerShell dengan Azure Key Vault. Untuk informasi selengkapnya tentang keamanan kredensial, lihat artikel keamanan layanan Azure AI.

Mengobrol dengan model Anda menggunakan aplikasi web

Untuk mulai mengobrol dengan model Azure OpenAI yang menggunakan data Anda, Anda dapat menyebarkan aplikasi web menggunakan studio Azure OpenAI atau kode contoh yang kami sediakan di GitHub. Aplikasi ini menyebarkan menggunakan layanan aplikasi Azure, dan menyediakan antarmuka pengguna untuk mengirim kueri. Aplikasi ini dapat digunakan model Azure OpenAI yang menggunakan data Anda, atau model yang tidak menggunakan data Anda. Lihat file readme di repositori untuk petunjuk tentang persyaratan, penyiapan, dan penyebaran. Anda dapat secara opsional menyesuaikan logika frontend dan backend aplikasi web dengan membuat perubahan pada kode sumber.

Mengambil variabel yang diperlukan

Agar berhasil melakukan panggilan terhadap Azure OpenAI, Anda memerlukan variabel berikut. Mulai cepat ini mengasumsikan Anda telah mengunggah data Anda ke akun penyimpanan blob Azure dan membuat indeks Azure AI Search. Lihat Menambahkan data Anda menggunakan studio Azure AI

Nama variabel Nilai
AZURE_OPENAI_ENDPOINT Nilai ini dapat ditemukan di bagian Kunci & Titik Akhir saat memeriksa sumber daya Azure OpenAI Anda dari portal Azure. Atau, Anda dapat menemukan nilainya di tampilan Kode playground>Obrolan studio>Azure AI. Contoh titik akhir adalah: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Nilai ini dapat ditemukan di bagian Kunci Manajemen>sumber daya & Titik Akhir saat memeriksa sumber daya Azure OpenAI Anda dari portal Azure. Anda dapat menggunakan KEY1 atau KEY2. Selalu miliki dua kunci untuk memungkinkan Anda memutar dan meregenerasi kunci dengan aman tanpa menyebabkan gangguan layanan.
AZURE_OPENAI_DEPLOYMENT_ID Nilai ini sesuai dengan nama kustom yang Anda pilih untuk penyebaran saat Anda menyebarkan model. Nilai ini dapat ditemukan di bawah Penyebaran Manajemen>Sumber Daya di portal Azure atau sebagai alternatif di bawah Penyebaran Manajemen>di studio Azure AI.
AZURE_AI_SEARCH_ENDPOINT Nilai ini dapat ditemukan di bagian Gambaran Umum saat memeriksa sumber daya Azure AI Search Anda dari portal Azure.
AZURE_AI_SEARCH_API_KEY Nilai ini dapat ditemukan di bagian Pengaturan> Keys saat memeriksa sumber daya Azure AI Search Anda dari portal Azure. Anda dapat menggunakan kunci admin utama atau kunci admin sekunder. Selalu miliki dua kunci untuk memungkinkan Anda memutar dan meregenerasi kunci dengan aman tanpa menyebabkan gangguan layanan.
AZURE_AI_SEARCH_INDEX Nilai ini sesuai dengan nama indeks yang Anda buat untuk menyimpan data Anda. Anda dapat menemukannya di bagian Gambaran Umum saat memeriksa sumber daya Azure AI Search Anda dari portal Azure.

Variabel lingkungan

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

Membuat lingkungan Go

  1. Buat folder baru bernama openai-go untuk proyek Anda dan file kode Go baru bernama sample.go. Ubah menjadi direktori tersebut:

    mkdir openai-go
    cd openai-go
    
  2. Instal paket Go berikut:

    go get github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai
    
  3. Aktifkan pelacakan dependensi untuk kode Anda.

    go mod init example/azure-openai
    

Membuat aplikasi Go

  1. Dari direktori proyek, buka file sample.go dan tambahkan kode berikut:

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

    Penting

    Untuk produksi, gunakan cara yang aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Untuk informasi selengkapnya tentang keamanan kredensial, lihat artikel keamanan layanan Azure AI.

  2. Jalankan perintah berikut:

    go run sample.go
    

    Aplikasi mencetak respons termasuk jawaban atas kueri dan kutipan Anda dari file yang Anda unggah.

Mengambil variabel yang diperlukan

Agar berhasil melakukan panggilan terhadap Azure OpenAI, Anda memerlukan variabel berikut. Mulai cepat ini mengasumsikan Anda telah mengunggah data Anda ke akun penyimpanan blob Azure dan membuat indeks Azure AI Search. Lihat Menambahkan data Anda menggunakan studio Azure AI

Nama variabel Nilai
AZURE_OPENAI_ENDPOINT Nilai ini dapat ditemukan di bagian Kunci & Titik Akhir saat memeriksa sumber daya Azure OpenAI Anda dari portal Azure. Atau, Anda dapat menemukan nilainya di tampilan Kode playground>Obrolan studio>Azure AI. Contoh titik akhir adalah: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Nilai ini dapat ditemukan di bagian Kunci Manajemen>sumber daya & Titik Akhir saat memeriksa sumber daya Azure OpenAI Anda dari portal Azure. Anda dapat menggunakan KEY1 atau KEY2. Selalu miliki dua kunci untuk memungkinkan Anda memutar dan meregenerasi kunci dengan aman tanpa menyebabkan gangguan layanan.
AZURE_OPENAI_DEPLOYMENT_ID Nilai ini sesuai dengan nama kustom yang Anda pilih untuk penyebaran saat Anda menyebarkan model. Nilai ini dapat ditemukan di bawah Penyebaran Manajemen>Sumber Daya di portal Azure atau sebagai alternatif di bawah Penyebaran Manajemen>di studio Azure AI.
AZURE_AI_SEARCH_ENDPOINT Nilai ini dapat ditemukan di bagian Gambaran Umum saat memeriksa sumber daya Azure AI Search Anda dari portal Azure.
AZURE_AI_SEARCH_API_KEY Nilai ini dapat ditemukan di bagian Pengaturan> Keys saat memeriksa sumber daya Azure AI Search Anda dari portal Azure. Anda dapat menggunakan kunci admin utama atau kunci admin sekunder. Selalu miliki dua kunci untuk memungkinkan Anda memutar dan meregenerasi kunci dengan aman tanpa menyebabkan gangguan layanan.
AZURE_AI_SEARCH_INDEX Nilai ini sesuai dengan nama indeks yang Anda buat untuk menyimpan data Anda. Anda dapat menemukannya di bagian Gambaran Umum saat memeriksa sumber daya Azure AI Search Anda dari portal Azure.

Variabel lingkungan

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

Contoh perintah cURL

Model obrolan Azure OpenAI dioptimalkan untuk bekerja dengan input yang diformat sebagai percakapan. Variabel messages melewati array kamus dengan peran yang berbeda dalam percakapan yang digambarkan oleh sistem, pengguna, alat, dan asisten. Variabel dataSources tersambung ke indeks Azure AI Search Anda, dan memungkinkan model Azure OpenAI merespons menggunakan data Anda.

Untuk memicu respons dari model, Anda harus diakhir dengan pesan pengguna yang menunjukkan bahwa itu adalah giliran asisten untuk merespons.

Tip

Ada beberapa parameter yang dapat Anda gunakan untuk mengubah respons model, seperti temperature atau top_p. Lihat dokumentasi referensi untuk informasi selengkapnya.

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

Contoh output

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

Mengobrol dengan model Anda menggunakan aplikasi web

Untuk mulai mengobrol dengan model Azure OpenAI yang menggunakan data Anda, Anda dapat menyebarkan aplikasi web menggunakan studio Azure OpenAI atau kode contoh yang kami sediakan di GitHub. Aplikasi ini menyebarkan menggunakan layanan aplikasi Azure, dan menyediakan antarmuka pengguna untuk mengirim kueri. Aplikasi ini dapat digunakan model Azure OpenAI yang menggunakan data Anda, atau model yang tidak menggunakan data Anda. Lihat file readme di repositori untuk petunjuk tentang persyaratan, penyiapan, dan penyebaran. Anda dapat secara opsional menyesuaikan logika frontend dan backend aplikasi web dengan membuat perubahan pada kode sumber.

Membersihkan sumber daya

Jika Anda ingin membersihkan dan menghapus sumber daya Azure OpenAI atau Azure AI Search, Anda dapat menghapus sumber daya atau grup sumber daya. Menghapus grup sumber daya juga menghapus sumber daya apa pun yang terkait dengannya.

Langkah berikutnya