Share via


Hızlı Başlangıç: Kendi verilerinizi kullanarak Azure OpenAI modelleriyle sohbet edin

Başvuru | Kaynak kodu | Paketi (pypi)Örnekleri |

Yukarıdaki bağlantılar Python için OpenAI API'sine başvurur. Azure'a özgü OpenAI Python SDK'sı yoktur. OpenAI hizmetleri ile Azure OpenAI hizmetleri arasında geçiş yapmayı öğrenin.

Bu hızlı başlangıçta Azure OpenAI modelleriyle kendi verilerinizi kullanabilirsiniz. Verilerinizde Azure OpenAI'nin modellerini kullanmak size daha hızlı ve daha doğru iletişim sağlayan güçlü bir konuşma yapay zekası platformu sağlayabilir.

Önkoşullar

Azure OpenAI Studio kullanarak verilerinizi ekleme

İpucu

Verilerinizde Azure OpenAI için gerekli kaynakları program aracılığıyla oluşturmak için Azure Geliştirici CLI'sini kullanabilirsiniz

Azure OpenAI Studio'ya gidin ve Azure OpenAI kaynağınıza erişimi olan kimlik bilgileriyle oturum açın. Oturum açma iş akışı sırasında veya sonrasında uygun dizini, Azure aboneliğini ve Azure OpenAI kaynağını seçin.

  1. Kendi verilerinizi getirin kutucuğunu seçin

    Azure OpenAI Studio giriş sayfasının ekran görüntüsü.

  2. Görüntülenen bölmede Veri kaynağı seç'in altında Dosyaları karşıya yükle (önizleme) öğesini seçin. Azure OpenAI'ın verilerinize erişmek ve verileri dizine eklemek için hem depolama kaynağına hem de arama kaynağına ihtiyacı vardır.

    İpucu

    1. Azure OpenAI'nin depolama hesabınıza erişmesi için Çıkış noktaları arası kaynak paylaşımını (CORS) açmanız gerekir. Azure Blob Depolama kaynağı için CORS henüz açık değilse CORS'yi aç'ı seçin.

    2. Azure AI Search kaynağınızı seçin ve bu kaynağı bağlamanın hesabınızda kullanıma neden olacağı onayını seçin. Sonra İleri'yi seçin.

    Azure OpenAI Studio'da veri kaynağı seçme seçeneklerini gösteren ekran görüntüsü.

  3. Dosyaları karşıya yükle bölmesinde Dosyaya gözat'ı seçin ve önkoşullar bölümünden veya kendi verilerinizden indirdiğiniz dosyaları seçin. Ardından Dosyaları karşıya yükle'yi seçin. Sonra İleri'yi seçin.

  4. Veri yönetimi bölmesinde, dizininiz için anlamsal aramayı mı yoksa vektör aramasını mı etkinleştirebileceğinizi seçebilirsiniz.

    Önemli

    • Anlamsal arama ve vektör araması ek fiyatlandırmaya tabidir. Anlamsal aramayı veya vektör aramasını etkinleştirmek için Temel veya daha yüksek SKU'yu seçmeniz gerekir. Daha fazla bilgi için bkz . fiyatlandırma katmanı farkı ve hizmet sınırları .
    • Bilgi alma ve model yanıtının kalitesini artırmaya yardımcı olmak için şu veri kaynağı dilleri için anlamsal aramayı etkinleştirmenizi öneririz: İngilizce, Fransızca, İspanyolca, Portekizce, İtalyanca, Almanya, Çince (Zh), Japonca, Korece, Rusça ve Arapça.
  5. Girdiğiniz ayrıntıları gözden geçirin ve Kaydet ve kapat'ı seçin. Artık modelle sohbet edebilirsiniz ve yanıt oluşturmak için verilerinizden alınan bilgileri kullanır.

Sohbet oyun alanı

Sohbet oyun alanı aracılığıyla kod içermeyen bir yaklaşımla Azure OpenAI özelliklerini keşfetmeye başlayın. Bu, tamamlama oluşturmak için bir istem gönderebileceğiniz bir metin kutusu. Bu sayfadan özellikleri hızla yineleyebilir ve deneyebilirsiniz.

Bölümlerin vurgulandığı Azure OpenAI Studio'nun oyun alanı sayfasının ekran görüntüsü.

Oyun alanı, sohbet deneyiminizi uyarlamak için seçenekler sunar. Sağ tarafta Dağıtım'ı seçerek dizininizdeki arama sonuçlarını kullanarak hangi modelin yanıt oluşturabileceğini belirleyebilirsiniz. Gelecekte oluşturulan yanıtlar için konuşma geçmişi olarak eklenecek geçmiş iletilerin sayısını seçersiniz. Konuşma geçmişi, ilgili yanıtları oluşturmak için bağlam sağlar, ancak belirteç kullanımını da kullanır. Giriş belirteci ilerleme durumu göstergesi, gönderdiğiniz sorunun belirteç sayısını izler.

Soldaki Gelişmiş ayarlar, verilerinizden ilgili bilgileri alma ve arama üzerinde denetim sahibi olmanıza izin veren çalışma zamanı parametreleridir. İyi bir kullanım örneği, yanıtların yalnızca verilerinize göre oluşturulduğundan emin olmak istemeniz veya modelin verilerinizde mevcut bilgilere dayalı bir yanıt oluşturamadığını bulmanızdır.

  • Katılık , sistemin benzerlik puanlarına göre arama belgelerini filtrelemedeki kararlılığını belirler. Katılığı 5 olarak ayarlamak, sistemin belgeleri agresif bir şekilde filtreleyerek çok yüksek bir benzerlik eşiği uygulayacağını gösterir. Sıralama modelleri sorgunun amacını çıkarsama konusunda daha iyi bir iş çıkardığından bu senaryoda anlamsal arama yararlı olabilir. Düşük katılık düzeyleri daha ayrıntılı yanıtlar üretir, ancak dizininizde olmayan bilgileri de içerebilir. Bu, varsayılan olarak 3 olarak ayarlanır.

  • Alınan belgeler 3, 5, 10 veya 20 olarak ayarlanabilen bir tamsayıdır ve son yanıtı formüle etmek için büyük dil modeline sağlanan belge öbeklerinin sayısını denetler. Varsayılan olarak, bu değer 5 olarak ayarlanır.

  • Verilerinize yanıtları sınırla etkinleştirildiğinde, model yalnızca yanıtlar için belgelerinize güvenmeye çalışır. Bu, varsayılan olarak true olarak ayarlanır.

Gelişmiş ayarların ekran görüntüsü.

İlk sorgunuzu gönderin. Sohbet modelleri söz konusu ve yanıt alıştırmalarında en iyi performansı gösterir. Örneğin, "Kullanılabilir sistem durumu planlarım nelerdir?" veya "Sistem durumu artı seçeneği nedir?".

Veri analizi gerektiren sorgular büyük olasılıkla "En popüler sistem durumu planı hangisidir?" gibi başarısız olabilir. Tüm verileriniz hakkında bilgi gerektiren sorgular da büyük olasılıkla "Kaç belge yükledim?" gibi başarısız olur. Arama altyapısının sorguyla ilgili tam veya benzer terimlere, tümceciklere veya yapıya sahip öbekleri aradığını unutmayın. Model soruyu anlayabilir ancak arama sonuçları veri kümesinden alınan öbeklerse, bu tür bir soruyu yanıtlamak doğru bilgi değildir.

Sohbetler yanıtta döndürülen belge sayısıyla (öbekler) kısıtlanır (Azure OpenAI Studio oyun alanında 3-20 ile sınırlıdır). Tahmin edebileceğiniz gibi, "tüm başlıklar" hakkında soru sorulabilmesi için vektör deposunun tamamının tam taraması gerekir.

Modelinizi dağıtma

Azure OpenAI studio deneyiminden memnun olduktan sonra, Dağıtılacak yer düğmesini seçerek doğrudan Studio'dan bir web uygulaması dağıtabilirsiniz.

Azure OpenAI Studio'da model dağıtım düğmesini gösteren ekran görüntüsü.

Bu, tek başına bir web uygulamasına dağıtma veya modelde kendi verilerinizi kullanıyorsanız Copilot Studio'da bir yardımcı pilot (önizleme) seçeneği sunar.

Örneğin, bir web uygulaması dağıtmayı seçerseniz:

Bir web uygulamasını ilk kez dağıttığınızda Yeni web uygulaması oluştur'u seçmelisiniz. Uygulama URL'sinin bir parçası olacak uygulama için bir ad seçin. Örneğin, https://<appname>.azurewebsites.net.

Yayımlanan uygulama için aboneliğinizi, kaynak grubunuzu, konumunuzu ve fiyatlandırma planınızı seçin. Mevcut bir uygulamayı güncelleştirmek için Mevcut bir web uygulamasında yayımla'yı seçin ve açılan menüden önceki uygulamanızın adını seçin.

Bir web uygulamasını dağıtmayı seçerseniz, bu uygulamayı kullanmak için dikkat edilmesi gereken önemli noktalara bakın.

Gerekli değişkenleri alma

Azure OpenAI'ye karşı başarılı bir şekilde çağrı yapmak için aşağıdaki değişkenlere ihtiyacınız vardır. Bu hızlı başlangıçta verilerinizi bir Azure blob depolama hesabına yüklediğiniz ve bir Azure AI Search dizini oluşturduğunuz varsayılır. Bkz. Azure AI Studio kullanarak verilerinizi ekleme

Değişken adı Değer
AZURE_OPENAI_ENDPOINT Bu değer, Azure portalından Azure OpenAI kaynağınızı incelerken Anahtarlar ve Uç Nokta bölümünde bulunabilir. Alternatif olarak, değeri Azure AI Studio>Sohbet oyun alanı>Kod görünümünde bulabilirsiniz. Örnek uç nokta: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Bu değer, Azure portaldan Azure OpenAI kaynağınızı incelerken Kaynak yönetimi>Anahtarları ve Uç Nokta bölümünde bulunabilir. KEY1 veya KEY2 kullanabilirsiniz. Her zaman iki anahtara sahip olmak, hizmet kesintisine neden olmadan anahtarları güvenli bir şekilde döndürmenize ve yeniden oluşturmanıza olanak tanır.
AZURE_OPENAI_DEPLOYMENT_ID Bu değer, bir modeli dağıtırken dağıtımınız için seçtiğiniz özel ada karşılık gelir. Bu değer, Azure portalındaki Kaynak Yönetimi>Dağıtımları altında veya alternatif olarak Azure AI Studio'daki Yönetim>Dağıtımları altında bulunabilir.
AZURE_AI_SEARCH_ENDPOINT Bu değer, Azure portalından Azure AI Search kaynağınızı incelerken Genel Bakış bölümünde bulunabilir.
AZURE_AI_SEARCH_API_KEY Bu değer, Azure portalından Azure AI Search kaynağınızı incelerken Ayarlar> Keys bölümünde bulunabilir. Birincil yönetici anahtarını veya ikincil yönetici anahtarını kullanabilirsiniz. Her zaman iki anahtara sahip olmak, hizmet kesintisine neden olmadan anahtarları güvenli bir şekilde döndürmenize ve yeniden oluşturmanıza olanak tanır.
AZURE_AI_SEARCH_INDEX Bu değer, verilerinizi depolamak için oluşturduğunuz dizinin adına karşılık gelir. Azure portalından Azure AI Search kaynağınızı incelerken Genel Bakış bölümünde bulabilirsiniz.

Ortam değişkenleri

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

Yeni .NET Core uygulaması oluşturma

Bir konsol penceresinde (cmd, PowerShell veya Bash gibi), adlı azure-openai-quickstartyeni bir konsol uygulaması oluşturmak için komutunu kullanındotnet new. Bu komut, tek bir C# kaynak dosyasıyla basit bir "Merhaba Dünya" projesi oluşturur: Program.cs.

dotnet new console -n azure-openai-quickstart

Dizininizi yeni oluşturulan uygulama klasörüyle değiştirin. Uygulamayı şu şekilde oluşturabilirsiniz:

dotnet build

Derleme çıkışı hiçbir uyarı veya hata içermemelidir.

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

OpenAI .NET istemci kitaplığını şu şekilde yükleyin:

dotnet add package Azure.AI.OpenAI --prerelease

Proje dizininden Program.cs dosyasını açın ve içeriğini aşağıdaki kodla değiştirin:

Yanıt akışı olmadan

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

Önemli

Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Kimlik bilgisi güvenliği hakkında daha fazla bilgi için Azure AI hizmetleri güvenlik makalesine bakın.

dotnet run program.cs

Çıktı

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

Bu işlem, sonuçları yazdırmadan önce modelin tüm yanıtını oluşturmasını bekler. Alternatif olarak, yanıtı zaman uyumsuz olarak akışa almak ve sonuçları yazdırmak istiyorsanız, Program.cs içeriğini sonraki örnekteki kodla değiştirebilirsiniz.

Akışla zaman uyumsuz

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

Gerekli değişkenleri alma

Azure OpenAI'ye karşı başarılı bir şekilde çağrı yapmak için aşağıdaki değişkenlere ihtiyacınız vardır. Bu hızlı başlangıçta verilerinizi bir Azure blob depolama hesabına yüklediğiniz ve bir Azure AI Search dizini oluşturduğunuz varsayılır. Daha fazla bilgi için bkz . Azure AI Studio kullanarak verilerinizi ekleme.

Değişken adı Değer
AZURE_OPENAI_ENDPOINT Bu değeri Azure portaldan Azure OpenAI kaynağınızı incelerken Anahtarlar ve Uç Nokta bölümünde bulabilirsiniz. Alternatif olarak, değeri Azure AI Studio>Sohbet oyun alanı>Kod görünümünde bulabilirsiniz. Örnek uç nokta: https://my-resource.openai.azure.com.
AZURE_OPENAI_API_KEY Bu değeri Azure portalından Azure OpenAI kaynağınızı incelerken Kaynak yönetimi>Anahtarları ve Uç Nokta bölümünde bulabilirsiniz. KEY1 veya KEY2 kullanabilirsiniz. Her zaman iki anahtara sahip olmak, hizmet kesintisine neden olmadan anahtarları güvenli bir şekilde döndürmenize ve yeniden oluşturmanıza olanak tanır.
AZURE_OPEN_AI_DEPLOYMENT_ID Bu değer, bir modeli dağıtırken dağıtımınız için seçtiğiniz özel ada karşılık gelir. Bu değeri Azure portalındaki Kaynak Yönetimi>Dağıtımları altında veya alternatif olarak Azure AI Studio'daki Yönetim>Dağıtımları altında bulabilirsiniz.
AZURE_AI_SEARCH_ENDPOINT Bu değeri Azure portalından Azure AI Search kaynağınızı incelerken Genel Bakış bölümünde bulabilirsiniz.
AZURE_AI_SEARCH_API_KEY Bu değeri Azure portalından Azure AI Search kaynağınızı incelerken Ayarlar> Keys bölümünde bulabilirsiniz. Birincil yönetici anahtarını veya ikincil yönetici anahtarını kullanabilirsiniz. Her zaman iki anahtara sahip olmak, hizmet kesintisine neden olmadan anahtarları güvenli bir şekilde döndürmenize ve yeniden oluşturmanıza olanak tanır.
AZURE_AI_SEARCH_INDEX Bu değer, verilerinizi depolamak için oluşturduğunuz dizinin adına karşılık gelir. Azure portalından Azure AI Search kaynağınızı incelerken Genel Bakış bölümünde bulabilirsiniz.

Ortam değişkenleri

Not

Spring AI, model adını varsayılan olarak olarak gpt-35-turbokullanır. Yalnızca farklı bir ada sahip bir model dağıttıysanız değeri sağlamanız SPRING_AI_AZURE_OPENAI_MODEL gerekir.

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

Yeni bir Spring uygulaması oluşturma

Spring AI şu anda Azure AI sorgusunun AzureCognitiveSearchChatExtensionConfiguration Alma Artırılmış Nesil (RAG) yöntemini kapsüllemesi ve ayrıntıları kullanıcıdan gizlemesine olanak sağlayan seçenekleri desteklememektedir. Alternatif olarak, Azure AI Search dizininizdeki verileri sorgulamak ve sorgunuzu artırmak için alınan belgeleri kullanmak için rag yöntemini doğrudan uygulamanızda çağırabilirsiniz.

Spring AI, VectorStore soyutlamasını destekler ve Özel verilerinizi sorgulamak için Bir Spring AI VectorStore uygulamasında Azure AI Search sarmalayabilirsiniz. Aşağıdaki proje, Azure AI Search tarafından desteklenen özel bir VectorStore uygular ve DOĞRUDAN RAG işlemlerini yürütür.

Bash penceresinde uygulamanız için yeni bir dizin oluşturun ve bu dizine gidin.

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

spring init Komutunu çalışma dizininizden çalıştırın. Bu komut, Spring projeniz için ana Java sınıf kaynak dosyası ve Maven tabanlı projeleri yönetmek için kullanılan pom.xml dosyası da dahil olmak üzere standart bir dizin yapısı oluşturur.

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

Oluşturulan dosya ve klasörler aşağıdaki yapıya benzer:

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 uygulamasını düzenleme

  1. pom.xml dosyasını düzenleyin.

    Proje dizininin kökünden, pom.xml dosyasını tercih ettiğiniz düzenleyicide veya IDE'de açın ve aşağıdaki içeriğe sahip dosyanın üzerine yazın:

    <?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. src/main/java/com/example/aicustomdatademo klasöründen tercih ettiğiniz düzenleyicide veya IDE'de AiCustomDataApplication.java açın ve aşağıdaki kodu yapıştırın:

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

    Önemli

    Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Kimlik bilgisi güvenliği hakkında daha fazla bilgi için Azure AI hizmetleri güvenlik makalesine bakın.

  3. Proje kök klasörüne geri dönün ve aşağıdaki komutu kullanarak uygulamayı çalıştırın:

    ./mvnw spring-boot:run
    

Çıktı

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

Gerekli değişkenleri alma

Azure OpenAI'ye karşı başarılı bir şekilde çağrı yapmak için aşağıdaki değişkenlere ihtiyacınız vardır. Bu hızlı başlangıçta verilerinizi bir Azure blob depolama hesabına yüklediğiniz ve bir Azure AI Search dizini oluşturduğunuz varsayılır. Bkz. Azure AI Studio kullanarak verilerinizi ekleme

Değişken adı Değer
AZURE_OPENAI_ENDPOINT Bu değer, Azure portalından Azure OpenAI kaynağınızı incelerken Anahtarlar ve Uç Nokta bölümünde bulunabilir. Alternatif olarak, değeri Azure AI Studio>Sohbet oyun alanı>Kod görünümünde bulabilirsiniz. Örnek uç nokta: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Bu değer, Azure portaldan Azure OpenAI kaynağınızı incelerken Kaynak yönetimi>Anahtarları ve Uç Nokta bölümünde bulunabilir. KEY1 veya KEY2 kullanabilirsiniz. Her zaman iki anahtara sahip olmak, hizmet kesintisine neden olmadan anahtarları güvenli bir şekilde döndürmenize ve yeniden oluşturmanıza olanak tanır.
AZURE_OPENAI_DEPLOYMENT_ID Bu değer, bir modeli dağıtırken dağıtımınız için seçtiğiniz özel ada karşılık gelir. Bu değer, Azure portalındaki Kaynak Yönetimi>Dağıtımları altında veya alternatif olarak Azure AI Studio'daki Yönetim>Dağıtımları altında bulunabilir.
AZURE_AI_SEARCH_ENDPOINT Bu değer, Azure portalından Azure AI Search kaynağınızı incelerken Genel Bakış bölümünde bulunabilir.
AZURE_AI_SEARCH_API_KEY Bu değer, Azure portalından Azure AI Search kaynağınızı incelerken Ayarlar> Keys bölümünde bulunabilir. Birincil yönetici anahtarını veya ikincil yönetici anahtarını kullanabilirsiniz. Her zaman iki anahtara sahip olmak, hizmet kesintisine neden olmadan anahtarları güvenli bir şekilde döndürmenize ve yeniden oluşturmanıza olanak tanır.
AZURE_AI_SEARCH_INDEX Bu değer, verilerinizi depolamak için oluşturduğunuz dizinin adına karşılık gelir. Azure portalından Azure AI Search kaynağınızı incelerken Genel Bakış bölümünde bulabilirsiniz.

Ortam değişkenleri

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

Node uygulaması oluşturma

Konsol penceresinde (cmd, PowerShell veya Bash gibi), uygulamanız için yeni bir dizin oluşturun ve bu dizine gidin. Ardından komutunu çalıştırarak npm init package.json dosyasıyla bir düğüm uygulaması oluşturun.

npm init

İstemci kitaplığını yükleme

npm ile JavaScript için Azure OpenAI istemcisini ve Azure Kimlik kitaplıklarını yükleyin:

npm install @azure/openai @azure/identity

Uygulamanızın package.json dosyası bağımlılıklarla güncelleştirilir.

Örnek uygulama oluşturma

Yeni projeyi istediğiniz bir komut istemi açın ve ChatWithOwnData.js adlı yeni bir dosya oluşturun. Aşağıdaki kodu ChatWithOwnData.js dosyasına kopyalayın.

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

Önemli

Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Kimlik bilgisi güvenliği hakkında daha fazla bilgi için Azure AI hizmetleri güvenlik makalesine bakın.

node.exe ChatWithOwnData.js

Çıktı

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.

Gerekli değişkenleri alma

Azure OpenAI'ye karşı başarılı bir şekilde çağrı yapmak için aşağıdaki değişkenlere ihtiyacınız vardır. Bu hızlı başlangıçta verilerinizi bir Azure blob depolama hesabına yüklediğiniz ve bir Azure AI Search dizini oluşturduğunuz varsayılır. Bkz. Azure AI Studio kullanarak verilerinizi ekleme

Değişken adı Değer
AZURE_OPENAI_ENDPOINT Bu değer, Azure portalından Azure OpenAI kaynağınızı incelerken Anahtarlar ve Uç Nokta bölümünde bulunabilir. Alternatif olarak, değeri Azure AI Studio>Sohbet oyun alanı>Kod görünümünde bulabilirsiniz. Örnek uç nokta: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Bu değer, Azure portaldan Azure OpenAI kaynağınızı incelerken Kaynak yönetimi>Anahtarları ve Uç Nokta bölümünde bulunabilir. KEY1 veya KEY2 kullanabilirsiniz. Her zaman iki anahtara sahip olmak, hizmet kesintisine neden olmadan anahtarları güvenli bir şekilde döndürmenize ve yeniden oluşturmanıza olanak tanır.
AZURE_OPENAI_DEPLOYMENT_ID Bu değer, bir modeli dağıtırken dağıtımınız için seçtiğiniz özel ada karşılık gelir. Bu değer, Azure portalındaki Kaynak Yönetimi>Dağıtımları altında veya alternatif olarak Azure AI Studio'daki Yönetim>Dağıtımları altında bulunabilir.
AZURE_AI_SEARCH_ENDPOINT Bu değer, Azure portalından Azure AI Search kaynağınızı incelerken Genel Bakış bölümünde bulunabilir.
AZURE_AI_SEARCH_API_KEY Bu değer, Azure portalından Azure AI Search kaynağınızı incelerken Ayarlar> Keys bölümünde bulunabilir. Birincil yönetici anahtarını veya ikincil yönetici anahtarını kullanabilirsiniz. Her zaman iki anahtara sahip olmak, hizmet kesintisine neden olmadan anahtarları güvenli bir şekilde döndürmenize ve yeniden oluşturmanıza olanak tanır.
AZURE_AI_SEARCH_INDEX Bu değer, verilerinizi depolamak için oluşturduğunuz dizinin adına karşılık gelir. Azure portalından Azure AI Search kaynağınızı incelerken Genel Bakış bölümünde bulabilirsiniz.

Ortam değişkenleri

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 ortamı oluşturma

  1. Projeniz için openai-python adlı yeni bir klasör ve main.py adlı yeni bir Python kod dosyası oluşturun. Bu dizine geçin:
mkdir openai-python
cd openai-python
  1. Aşağıdaki Python Kitaplıklarını yükleyin:
pip install openai
pip install python-dotenv

Python uygulamasını oluşturma

  1. Proje dizininden main.py dosyasını açın ve aşağıdaki kodu ekleyin:
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))

Önemli

Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Kimlik bilgisi güvenliği hakkında daha fazla bilgi için Azure AI hizmetleri güvenlik makalesine bakın.

  1. Şu kodu yürütün:
python main.py

Uygulama, yanıtı birçok senaryoda kullanıma uygun bir JSON biçiminde yazdırır. Hem sorgunuzun yanıtlarını hem de karşıya yüklediğiniz dosyalardan alıntıları içerir.

Gerekli değişkenleri alma

Azure OpenAI'ye karşı başarılı bir şekilde çağrı yapmak için aşağıdaki değişkenlere ihtiyacınız vardır. Bu hızlı başlangıçta verilerinizi bir Azure blob depolama hesabına yüklediğiniz ve bir Azure AI Search dizini oluşturduğunuz varsayılır. Bkz. Azure AI Studio kullanarak verilerinizi ekleme

Değişken adı Değer
AZURE_OPENAI_ENDPOINT Bu değer, Azure portalından Azure OpenAI kaynağınızı incelerken Anahtarlar ve Uç Nokta bölümünde bulunabilir. Alternatif olarak, değeri Azure AI Studio>Sohbet oyun alanı>Kod görünümünde bulabilirsiniz. Örnek uç nokta: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Bu değer, Azure portaldan Azure OpenAI kaynağınızı incelerken Kaynak yönetimi>Anahtarları ve Uç Nokta bölümünde bulunabilir. KEY1 veya KEY2 kullanabilirsiniz. Her zaman iki anahtara sahip olmak, hizmet kesintisine neden olmadan anahtarları güvenli bir şekilde döndürmenize ve yeniden oluşturmanıza olanak tanır.
AZURE_OPENAI_DEPLOYMENT_ID Bu değer, bir modeli dağıtırken dağıtımınız için seçtiğiniz özel ada karşılık gelir. Bu değer, Azure portalındaki Kaynak Yönetimi>Dağıtımları altında veya alternatif olarak Azure AI Studio'daki Yönetim>Dağıtımları altında bulunabilir.
AZURE_AI_SEARCH_ENDPOINT Bu değer, Azure portalından Azure AI Search kaynağınızı incelerken Genel Bakış bölümünde bulunabilir.
AZURE_AI_SEARCH_API_KEY Bu değer, Azure portalından Azure AI Search kaynağınızı incelerken Ayarlar> Keys bölümünde bulunabilir. Birincil yönetici anahtarını veya ikincil yönetici anahtarını kullanabilirsiniz. Her zaman iki anahtara sahip olmak, hizmet kesintisine neden olmadan anahtarları güvenli bir şekilde döndürmenize ve yeniden oluşturmanıza olanak tanır.
AZURE_AI_SEARCH_INDEX Bu değer, verilerinizi depolamak için oluşturduğunuz dizinin adına karşılık gelir. Azure portalından Azure AI Search kaynağınızı incelerken Genel Bakış bölümünde bulabilirsiniz.

Ortam değişkenleri

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

Örnek PowerShell komutları

Azure OpenAI sohbet modelleri, konuşma olarak biçimlendirilmiş girişlerle çalışacak şekilde iyileştirilmiştir. değişkeni, messages konuşmada sistem, kullanıcı, araç ve yardımcı tarafından ayrılmış farklı rollere sahip bir sözlük dizisi geçirir. değişkeni dataSources Azure Bilişsel Arama dizininize bağlanır ve Azure OpenAI modellerinin verilerinizi kullanarak yanıt vermesini sağlar.

Modelden bir yanıt tetikleyebilmek için yanıt vermenin yardımcının sırası olduğunu belirten bir kullanıcı iletisiyle bitirmelisiniz.

İpucu

Modelin yanıtını değiştirmek için kullanabileceğiniz veya top_pgibi temperature çeşitli parametreler vardır. Daha fazla bilgi için başvuru belgelerine bakın.

# 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

Örnek çıkış

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

Önemli

Üretim için Azure Key Vault ile PowerShell Gizli Dizi Yönetimi gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Kimlik bilgisi güvenliği hakkında daha fazla bilgi için Azure AI hizmetleri güvenlik makalesine bakın.

Web uygulaması kullanarak modelinizle sohbet etme

Verilerinizi kullanan Azure OpenAI modeliyle sohbet etmeye başlamak için, Azure OpenAI studio'yu veya GitHub'da sağladığımız örnek kodu kullanarak bir web uygulaması dağıtabilirsiniz. Bu uygulama Azure app service kullanarak dağıtılır ve sorgu göndermek için bir kullanıcı arabirimi sağlar. Bu uygulama, verilerinizi kullanan Azure OpenAI modelleri veya verilerinizi kullanmayan modeller kullanılabilir. Gereksinimler, kurulum ve dağıtım yönergeleri için depodaki benioku dosyasına bakın. İsteğe bağlı olarak, kaynak kodda değişiklik yaparak web uygulamasının ön uç ve arka uç mantığını özelleştirebilirsiniz.

Gerekli değişkenleri alma

Azure OpenAI'ye karşı başarılı bir şekilde çağrı yapmak için aşağıdaki değişkenlere ihtiyacınız vardır. Bu hızlı başlangıçta verilerinizi bir Azure blob depolama hesabına yüklediğiniz ve bir Azure AI Search dizini oluşturduğunuz varsayılır. Bkz. Azure AI Studio kullanarak verilerinizi ekleme

Değişken adı Değer
AZURE_OPENAI_ENDPOINT Bu değer, Azure portalından Azure OpenAI kaynağınızı incelerken Anahtarlar ve Uç Nokta bölümünde bulunabilir. Alternatif olarak, değeri Azure AI Studio>Sohbet oyun alanı>Kod görünümünde bulabilirsiniz. Örnek uç nokta: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Bu değer, Azure portaldan Azure OpenAI kaynağınızı incelerken Kaynak yönetimi>Anahtarları ve Uç Nokta bölümünde bulunabilir. KEY1 veya KEY2 kullanabilirsiniz. Her zaman iki anahtara sahip olmak, hizmet kesintisine neden olmadan anahtarları güvenli bir şekilde döndürmenize ve yeniden oluşturmanıza olanak tanır.
AZURE_OPENAI_DEPLOYMENT_ID Bu değer, bir modeli dağıtırken dağıtımınız için seçtiğiniz özel ada karşılık gelir. Bu değer, Azure portalındaki Kaynak Yönetimi>Dağıtımları altında veya alternatif olarak Azure AI Studio'daki Yönetim>Dağıtımları altında bulunabilir.
AZURE_AI_SEARCH_ENDPOINT Bu değer, Azure portalından Azure AI Search kaynağınızı incelerken Genel Bakış bölümünde bulunabilir.
AZURE_AI_SEARCH_API_KEY Bu değer, Azure portalından Azure AI Search kaynağınızı incelerken Ayarlar> Keys bölümünde bulunabilir. Birincil yönetici anahtarını veya ikincil yönetici anahtarını kullanabilirsiniz. Her zaman iki anahtara sahip olmak, hizmet kesintisine neden olmadan anahtarları güvenli bir şekilde döndürmenize ve yeniden oluşturmanıza olanak tanır.
AZURE_AI_SEARCH_INDEX Bu değer, verilerinizi depolamak için oluşturduğunuz dizinin adına karşılık gelir. Azure portalından Azure AI Search kaynağınızı incelerken Genel Bakış bölümünde bulabilirsiniz.

Ortam değişkenleri

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 ortamı oluşturma

  1. Projeniz için openai-go adlı yeni bir klasör ve sample.go adlı yeni bir Go kod dosyası oluşturun. Bu dizine geçin:

    mkdir openai-go
    cd openai-go
    
  2. Aşağıdaki Go paketlerini yükleyin:

    go get github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai
    
  3. Kodunuz için bağımlılık izlemeyi etkinleştirin.

    go mod init example/azure-openai
    

Go uygulamasını oluşturma

  1. Proje dizininden sample.go dosyasını açın ve aşağıdaki kodu ekleyin:

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

    Önemli

    Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Kimlik bilgisi güvenliği hakkında daha fazla bilgi için Azure AI hizmetleri güvenlik makalesine bakın.

  2. Şu kodu yürütün:

    go run sample.go
    

    Uygulama, hem sorgunuzun yanıtlarını hem de karşıya yüklediğiniz dosyalardan alıntıları içeren yanıtı yazdırır.

Gerekli değişkenleri alma

Azure OpenAI'ye karşı başarılı bir şekilde çağrı yapmak için aşağıdaki değişkenlere ihtiyacınız vardır. Bu hızlı başlangıçta verilerinizi bir Azure blob depolama hesabına yüklediğiniz ve bir Azure AI Search dizini oluşturduğunuz varsayılır. Bkz. Azure AI Studio kullanarak verilerinizi ekleme

Değişken adı Değer
AZURE_OPENAI_ENDPOINT Bu değer, Azure portalından Azure OpenAI kaynağınızı incelerken Anahtarlar ve Uç Nokta bölümünde bulunabilir. Alternatif olarak, değeri Azure AI Studio>Sohbet oyun alanı>Kod görünümünde bulabilirsiniz. Örnek uç nokta: https://my-resoruce.openai.azure.com.
AZURE_OPENAI_API_KEY Bu değer, Azure portaldan Azure OpenAI kaynağınızı incelerken Kaynak yönetimi>Anahtarları ve Uç Nokta bölümünde bulunabilir. KEY1 veya KEY2 kullanabilirsiniz. Her zaman iki anahtara sahip olmak, hizmet kesintisine neden olmadan anahtarları güvenli bir şekilde döndürmenize ve yeniden oluşturmanıza olanak tanır.
AZURE_OPENAI_DEPLOYMENT_ID Bu değer, bir modeli dağıtırken dağıtımınız için seçtiğiniz özel ada karşılık gelir. Bu değer, Azure portalındaki Kaynak Yönetimi>Dağıtımları altında veya alternatif olarak Azure AI Studio'daki Yönetim>Dağıtımları altında bulunabilir.
AZURE_AI_SEARCH_ENDPOINT Bu değer, Azure portalından Azure AI Search kaynağınızı incelerken Genel Bakış bölümünde bulunabilir.
AZURE_AI_SEARCH_API_KEY Bu değer, Azure portalından Azure AI Search kaynağınızı incelerken Ayarlar> Keys bölümünde bulunabilir. Birincil yönetici anahtarını veya ikincil yönetici anahtarını kullanabilirsiniz. Her zaman iki anahtara sahip olmak, hizmet kesintisine neden olmadan anahtarları güvenli bir şekilde döndürmenize ve yeniden oluşturmanıza olanak tanır.
AZURE_AI_SEARCH_INDEX Bu değer, verilerinizi depolamak için oluşturduğunuz dizinin adına karşılık gelir. Azure portalından Azure AI Search kaynağınızı incelerken Genel Bakış bölümünde bulabilirsiniz.

Ortam değişkenleri

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

Örnek cURL komutları

Azure OpenAI sohbet modelleri, konuşma olarak biçimlendirilmiş girişlerle çalışacak şekilde iyileştirilmiştir. değişkeni, messages konuşmada sistem, kullanıcı, araç ve yardımcı tarafından ayrılmış farklı rollere sahip bir sözlük dizisi geçirir. dataSources Değişkeni Azure AI Search dizininize bağlanır ve Azure OpenAI modellerinin verilerinizi kullanarak yanıt vermesini sağlar.

Modelden bir yanıt tetikleyebilmek için yanıt vermenin yardımcının sırası olduğunu belirten bir kullanıcı iletisiyle bitirmelisiniz.

İpucu

Modelin yanıtını değiştirmek için kullanabileceğiniz veya top_pgibi temperature çeşitli parametreler vardır. Daha fazla bilgi için başvuru belgelerine bakın.

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

Örnek çıkış

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

Web uygulaması kullanarak modelinizle sohbet etme

Verilerinizi kullanan Azure OpenAI modeliyle sohbet etmeye başlamak için, Azure OpenAI studio'yu veya GitHub'da sağladığımız örnek kodu kullanarak bir web uygulaması dağıtabilirsiniz. Bu uygulama Azure app service kullanarak dağıtılır ve sorgu göndermek için bir kullanıcı arabirimi sağlar. Bu uygulama, verilerinizi kullanan Azure OpenAI modelleri veya verilerinizi kullanmayan modeller kullanılabilir. Gereksinimler, kurulum ve dağıtım yönergeleri için depodaki benioku dosyasına bakın. İsteğe bağlı olarak, kaynak kodda değişiklik yaparak web uygulamasının ön uç ve arka uç mantığını özelleştirebilirsiniz.

Kaynakları temizleme

Azure OpenAI veya Azure AI Search kaynağını temizlemek ve kaldırmak istiyorsanız, kaynağı veya kaynak grubunu silebilirsiniz. Kaynak grubunun silinmesi, kaynak grubuyla ilişkili diğer tüm kaynakları da siler.

Sonraki adımlar