Aracılığıyla paylaş


Öğretici: Microsoft Foundry Modellerinde Azure OpenAI'yi keşfetme ekleme ve belge arama

Bu öğreticide, en uygun belgeyi bulmak için bir bilgi bankası sorguladığınız belge araması gerçekleştirmek için Azure OpenAI ekleme API'sini kullanma konusunda size yol gösterilir.

Bu eğitimde şunları öğreniyorsunuz:

  • Ö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-embedding-3-large, text-embedding-3-small modelleri.
  • 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 GitHub örnek verilerimizden indirilebilen dosya kullanılı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

Uyarı

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

Anahtarı ve uç noktayı alma

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

Değişken adı Değer
ENDPOINT Hizmet uç noktası, Kaynağınızı Azure portalından incelerken Anahtarlar ve Uç Nokta bölümünde bulunabilir. Alternatif olarak, uç noktayı Microsoft Foundry portalındaki Dağıtımlar sayfasında bulabilirsiniz. Örnek uç nokta: https://docs-test-001.openai.azure.com/.
API-KEY Bu değer, Kaynağınızı Azure portalından incelerken Anahtarlar ve Uç Nokta bölümünde bulunabilir. KEY1 veya KEY2 kullanabilirsiniz.

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. 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 portalında uç nokta ve erişim anahtarları konumu kırmızıyla daire içine alınmış bir Azure OpenAI kaynağının genel bakış kullanıcı arabiriminin ekran görüntüsü.

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, bunu Azure Key Vault'ta 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 AI hizmetlerine yönelik isteklerin kimliğini 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 yapamazsanız, bir kod bloğunun sonunda genellikle olduğu gibi doğrudan çağırmak print(dataframe_name) yerine kullanarak dataframe_name 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

Çıktı:

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, adlıdf_bills, yalnızca , textve summarysütunlarını titleiçerecek yeni bir daha küçük DataFrame oluşturacağız.

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

Çıktı:

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

Uyarı

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

Çıktı:

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'yı desteklemek için yerel olarak veya Azure Veritabanı'nda depolanabilir. Sonuç olarak, her faturanın DataFrame'in sağ tarafındaki yeni ada_v2 sütuna kendi karşılık gelen ekleme vektörleri olur.

Aşağıdaki örnekte, eklemek istediğimiz her öğe için ekleme modelini bir kez çağırıyoruz. Büyük ekleme projeleriyle çalışırken, modele aynı anda bir giriş yerine eklemeye bir giriş dizisi geçirebilirsiniz. Modeli geçirdiğinizde, ekleme uç noktasına çağrı başına en fazla 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

Çıktı:

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

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

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)

Çıktı:

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

Son olarak, tüm bilgi bankası kullanıcı sorgusunu temel alan belge aramasının en iyi 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, bilgi bankası belgeler arasında arama mekanizması olarak eklemeleri kullanabilirsiniz. Kullanıcı daha sonra en üstteki arama sonucunu alabilir ve ilk sorgusunu soran aşağı akış görevi için kullanabilir.

Kaynakları temizle

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 silmeniz ve ardından test kaynağınıza ayrılmışsa kaynağı veya ilişkili kaynak grubunu silmeniz gerekir. Kaynak grubunu silmek, onunla ilişkili olan diğer tüm kaynakları da siler.

Sonraki Adımlar

Azure OpenAI modelleri hakkında daha fazla bilgi edinin: