Öğretici: Microsoft Foundry Modellerinde Azure OpenAI gömülü modeli ve Azure'da belge arama keşfi.

Bu öğreticide, Azure document araması gerçekleştirmek için OpenAI embeddings API'sinin nasıl kullanılacağı gösterilmektedir. En uygun belgeyi bulmak için bilgi bankasını sorgularsınız.

Bu öğreticide şunların nasıl yapılacağını öğreneceksiniz:

  • Örnek veri kümesini indirin ve analize hazırlayın.
  • Kaynak uç noktanız ve API anahtarınız için ortam değişkenleri oluşturun.
  • Şu modellerden birini kullanın: text-embedding-ada-002 (Sürüm 2), text-embeding-3-large veya text-embedding-3-small.
  • Arama sonuçlarını sıralamak için kosinüs benzerliğini kullanın.

Önkoşullar

Kurulum

Python kitaplıkları

Henüz yüklemediyseniz aşağıdaki kitaplıkları yüklemeniz gerekir:

pip install openai num2words matplotlib plotly scipy scikit-learn pandas tiktoken

BillSum veri kümesini indirme

BillSum, Birleşik Devletler Kongre ve California eyalet faturalarının bir veri kümesidir. Çizim amacıyla yalnızca ABD faturalarına bakacağız. Korpus, Kongre'nin 103.-115. (1993-2018) oturumlarından gelen faturalardan oluşur. Veriler 18.949 tren faturasına ve 3.269 test faturasına ayrılmıştır. BillSum corpus 5.000 ila 20.000 karakter uzunluğunda orta uzunlukta mevzuata odaklanır. Bu veri kümesinin türetildiği proje ve özgün akademik makale hakkında daha fazla bilgi BillSum projesinin GitHub deposunda bulunabilir

Bu öğreticide bill_sum_data.csv indirilebilen dosyası kullanılmaktadır.

Yerel makinenizde aşağıdaki komutu çalıştırarak örnek verileri de indirebilirsiniz:

curl "https://raw.githubusercontent.com/Azure-Samples/Azure-OpenAI-Docs-Samples/main/Samples/Tutorials/Embeddings/data/bill_sum_data.csv" --output bill_sum_data.csv

Not

Microsoft Entra ID tabanlı kimlik doğrulaması şu anda v1 API'siyle eklemeler için desteklenmemektedir.

Anahtarı ve uç noktayı alma

Azure OpenAI'ye karşı başarılı bir şekilde çağrı yapmak için endpoint ve key gerekir.

Değişken adı Değer
ENDPOINT Azure portalından kaynağınızı incelerken hizmet uç noktası, Keys & Endpoint bölümünde bulunabilir. Alternatif olarak, uç noktayı Microsoft Döküm portalındaki Deployments sayfasında bulabilirsiniz. Örnek uç nokta: https://docs-test-001.openai.azure.com/.
API-KEY Bu değer, Azure portalı üzerinden kaynağınızı incelerken Keys & Endpoint bölümünde bulunabilir. veya KEY1kullanabilirsinizKEY2.

Azure portalında kaynağınıza gidin. Anahtarlar ve Uç Nokta bölümü Kaynak Yönetimi bölümünde bulunabilir. Api çağrılarınızın kimliğini doğrulamak için ihtiyacınız olacak şekilde uç noktanızı ve erişim anahtarınızı kopyalayın. veya KEY1kullanabilirsinizKEY2. 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 portalunda bulunan bir Azure OpenAI kaynağının genel bakış kullanıcı arayüzünün ekran görüntüsü, uç nokta ve erişim anahtarlarının yeri kırmızı ile daire içine alınmış.

Ortam değişkenleri

API anahtarınız için kalıcı ortam değişkenleri oluşturun ve atayın.

Önemli

API anahtarlarını dikkatli kullanın. API anahtarını doğrudan kodunuzla eklemeyin ve hiçbir zaman herkese açık olarak göndermeyin. API anahtarı kullanıyorsanız, Azure Key Vault güvenli bir şekilde depolayın. Uygulamalarınızda API anahtarlarını güvenli bir şekilde kullanma hakkında daha fazla bilgi için bkz. Azure Key Vault ile API anahtarları.

Yapay zeka hizmetleri güvenliği hakkında daha fazla bilgi için bkz. Azure Yapay Zeka Hizmetleri istekleri doğrulama.

setx AZURE_OPENAI_API_KEY "REPLACE_WITH_YOUR_KEY_VALUE_HERE" 

Ortam değişkenlerini ayarladıktan sonra, ortam değişkenlerinin erişilebilir olması için Jupyter not defterlerini veya kullandığınız IDE'yi kapatıp yeniden açmanız gerekebilir. Jupyter Not Defterlerini kullanmanızı kesinlikle öneririz. Ancak, herhangi bir nedenle kullanamazsanız, bir kod bloğunun sonunda genellikle yapılan doğrudan print(dataframe_name) çağrısı yerine, dataframe_name kullanarak pandas veri çerçevesi döndüren kodları değiştirmeniz gerekir.

Tercih ettiğiniz Python IDE'de aşağıdaki kodu çalıştırın:

Kitaplıkları içeri aktarma

import os
import re
import requests
import sys
from num2words import num2words
import os
import pandas as pd
import numpy as np
import tiktoken
from openai import OpenAI

Şimdi csv dosyamızı okumamız ve bir pandas DataFrame oluşturmamız gerekiyor. İlk DataFrame oluşturulduktan sonra komutunu çalıştırarak dftablonun içeriğini görüntüleyebiliriz.

df=pd.read_csv(os.path.join(os.getcwd(),'bill_sum_data.csv')) # This assumes that you have placed the bill_sum_data.csv in the same directory you are running Jupyter Notebooks
df

Çıkış:

Csv dosyasındaki ilk DataFrame tablosu sonuçlarının ekran görüntüsü.

İlk tabloda ihtiyacımız olandan daha fazla sütun var, bu yüzden yalnızca df_bills, text ve summary sütunlarını içerecek title adlı yeni, daha küçük bir DataFrame oluşturacağız.

df_bills = df[['text', 'summary', 'title']]
df_bills

Çıkış:

Yalnızca metin, özet ve başlık sütunlarının görüntülendiği küçük DataFrame tablosu sonuçlarının ekran görüntüsü.

Şimdi gereksiz boşlukları kaldırarak ve verileri belirteçleştirmeye hazırlamak için noktalama işaretlerini temizleyerek bazı hafif veri temizleme işlemleri gerçekleştireceğiz.

pd.options.mode.chained_assignment = None #https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#evaluation-order-matters

# s is input text
def normalize_text(s, sep_token = " \n "):
    s = re.sub(r'\s+',  ' ', s).strip()
    s = re.sub(r"\. ,","",s) 
    # remove all instances of multiple spaces
    s = s.replace("..",".")
    s = s.replace(". .",".")
    s = s.replace("\n", "")
    s = s.strip()
    
    return s

df_bills['text']= df_bills["text"].apply(lambda x : normalize_text(x))

Şimdi belirteç sınırı (8.192 belirteç) için çok uzun olan faturaları kaldırmamız gerekiyor.

tokenizer = tiktoken.get_encoding("cl100k_base")
df_bills['n_tokens'] = df_bills["text"].apply(lambda x: len(tokenizer.encode(x)))
df_bills = df_bills[df_bills.n_tokens<8192]
len(df_bills)
20

Not

Bu durumda tüm faturalar ekleme modeli giriş belirteci sınırı altındadır, ancak ekleme işleminin başarısız olmasına neden olacak girişleri kaldırmak için yukarıdaki tekniği kullanabilirsiniz. Ekleme sınırını aşan içerikle karşılaştığınızda, içeriği daha küçük parçalara ayırabilir ve ardından öbekleri birer birer ekleyebilirsiniz.

Bir kez daha df_bills inceleyeceğiz.

df_bills

Çıkış:

dataframe'in n_tokens adlı yeni bir sütunla ekran görüntüsü.

n_tokens sütununu biraz daha anlamak ve metnin nasıl belirteç haline getirildiği hakkında bilgi edinmek için aşağıdaki kodu çalıştırmak yararlı olabilir:

sample_encode = tokenizer.encode(df_bills.text[0]) 
decode = tokenizer.decode_tokens_bytes(sample_encode)
decode

Belgelerimiz için kasıtlı olarak çıkışı kesiyoruz, ancak bu komutu ortamınızda çalıştırmak sıfır dizinindeki tam metni öbekler halinde belirteçli olarak döndürür. Bazı durumlarda bir sözcüğün tamamının tek bir belirteçle temsil edilirken, diğer durumlarda sözcüklerin bazı bölümlerinin birden çok belirteç arasında bölündüğünü görebilirsiniz.

[b'SECTION',
 b' ',
 b'1',
 b'.',
 b' SHORT',
 b' TITLE',
 b'.',
 b' This',
 b' Act',
 b' may',
 b' be',
 b' cited',
 b' as',
 b' the',
 b' ``',
 b'National',
 b' Science',
 b' Education',
 b' Tax',
 b' In',
 b'cent',
 b'ive',
 b' for',
 b' Businesses',
 b' Act',
 b' of',
 b' ',
 b'200',
 b'7',
 b"''.",
 b' SEC',
 b'.',
 b' ',
 b'2',
 b'.',
 b' C',
 b'RED',
 b'ITS',
 b' FOR',
 b' CERT',
 b'AIN',
 b' CONTRIBUT',
 b'IONS',
 b' BEN',
 b'EF',
 b'IT',
 b'ING',
 b' SC',

Ardından değişkenin uzunluğunu decode denetlerseniz, değişkenin n_tokens sütunundaki ilk sayıyla eşleşdiğini görürsünüz.

len(decode)
1466

Artık belirteç oluşturmanın nasıl çalıştığı hakkında daha fazla bilgi edindiğimize göre ekleme işlemine geçebiliriz. Belgeleri henüz belirteci oluşturmadığımıza dikkat etmek önemlidir. Sütun n_tokens yalnızca belirteç oluşturma ve ekleme için modele aktardığımız verilerin 8.192 giriş belirteci sınırını aşmamasını sağlamanın bir yoludur. Belgeleri ekleme modeline geçirdiğimizde, belgeler yukarıdaki örneklere benzer belirteçlere (aynı olmasa da) bölünür ve ardından belirteçleri vektör araması yoluyla erişilebilecek bir dizi kayan nokta numarasına dönüştürür. Bu eklemeler, Vektör Arama desteklemek için yerel olarak veya Azure Veritabanında depolanabilir. Sonuç olarak, her faturanın, DataFrame'in sağ tarafındaki yeni ada_v2 sütununda kendi karşılık gelen gömme vektörü olacaktır.

Aşağıdaki örnekte, eklemek istediğimiz her öğe için ekleme modelini bir kez çağırıyoruz. Büyük gömme projeleriyle çalışırken, aynı anda bir giriş yerine modele bir giriş dizisi aktarabilirsiniz. Modele bir dizi girdi sağladığınızda, ekleme uç noktasına yapılan her çağrı için maksimum giriş öğesi sayısı 2048'dir.

client = OpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/"
)

def generate_embeddings(text, model="text-embedding-ada-002"): # model = "deployment_name"
    return client.embeddings.create(input = [text], model=model).data[0].embedding

df_bills['ada_v2'] = df_bills["text"].apply(lambda x : generate_embeddings (x, model = 'text-embedding-ada-002')) # model should be set to the deployment name you chose when you deployed the text-embedding-ada-002 (Version 2) model
df_bills

Çıkış:

df_bills komutundan biçimlendirilmiş sonuçların ekran görüntüsü.

Aşağıdaki arama kodu bloğunu çalıştırırken aynı text-embedding-ada-002 (Sürüm 2) modeliyle "Kablo şirketi vergi geliri hakkında bilgi alabilir miyim?" arama sorgusunu ekleyeceğiz. Ardından, sorgumuzdan yeni eklenen metin için kosinüs benzerliğine göre sıralanan en yakın fatura gömüsünü bulacağız.

def cosine_similarity(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

def get_embedding(text, model="text-embedding-ada-002"): # model = "deployment_name"
    return client.embeddings.create(input = [text], model=model).data[0].embedding

def search_docs(df, user_query, top_n=4, to_print=True):
    embedding = get_embedding(
        user_query,
        model="text-embedding-ada-002" # model should be set to the deployment name you chose when you deployed the text-embedding-ada-002 (Version 2) model
    )
    df["similarities"] = df.ada_v2.apply(lambda x: cosine_similarity(x, embedding))

    res = (
        df.sort_values("similarities", ascending=False)
        .head(top_n)
    )
    if to_print:
        display(res)
    return res

res = search_docs(df_bills, "Can I get information on cable company tax revenue?", top_n=4)

Çıkış:

Arama sorgusu çalıştırıldıktan sonra biçimlendirilmiş res sonuçlarının ekran görüntüsü.

Son olarak, bilgi bankasının tamamına yönelik kullanıcı sorgusunu temel alan belge aramasının en önemli sonucunu göstereceğiz. Bu, "Vergi mükellefinin 1993'ün Görüntüleme Hakkı Yasası"nın en üst sonucunu döndürür. Bu belgede sorgu ile belge arasında kosinüs benzerlik puanı 0,76'dır:

res["summary"][9]
"Taxpayer's Right to View Act of 1993 - Amends the Communications Act of 1934 to prohibit a cable operator from assessing separate charges for any video programming of a sporting, theatrical, or other entertainment event if that event is performed at a facility constructed, renovated, or maintained with tax revenues or by an organization that receives public financial support. Authorizes the Federal Communications Commission and local franchising authorities to make determinations concerning the applicability of such prohibition. Sets forth conditions under which a facility is considered to have been constructed, maintained, or renovated with tax revenues. Considers events performed by nonprofit or public organizations that receive tax subsidies to be subject to this Act if the event is sponsored by, or includes the participation of a team that is part of, a tax exempt organization."

Bu yaklaşımı kullanarak, eklemeleri bir bilgi bankasındaki belgeler arasında arama mekanizması olarak kullanabilirsiniz. Kullanıcı, arama sonuçlarının en üstündekini alarak ilk sorgusunu tetikleyen aşağı akış görevi için kullanabilir.

Sorun giderme

  • 401/403: AZURE_OPENAI_API_KEY ayarlandığını ve kaynak anahtarınızla eşleştiğini doğrulayın.
  • 404: AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT öğesinin dağıtım adınızla eşleştiğini doğrulayın.
  • Geçersiz URL: AZURE_OPENAI_ENDPOINT ifadesinin, https://<resource-name>.openai.azure.com gibi kaynak uç noktanız olduğunu doğrulayın.

Kaynakları temizleme

Yalnızca bu öğreticiyi tamamlamak için bir Azure OpenAI kaynağı oluşturduysanız ve bir Azure OpenAI kaynağını temizlemek ve kaldırmak istiyorsanız, dağıtılan modellerinizi silin. Ardından, test kaynağınıza ayrılmışsa kaynağı veya ilişkili kaynak grubunu silin. Kaynak grubunun silinmesi, kaynak grubuyla ilişkili diğer tüm kaynakları da siler.

Sonraki adımlar

OpenAI Azure modelleri hakkında daha fazla bilgi edinin: