Aracılığıyla paylaş


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

Bu öğreticide, bir bilgi bankasında sorgulama yaparak en uygun belgeyi bulmak amacıyla Azure OpenAI yerleştirme API'sini kullanarak belge araması gerçekleştirme 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 GitHub'daki örnek verilerimizden indirilebilecek bir 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 Notebookları kullanmanızı kesinlikle öneririz, ancak herhangi bir nedenle bunu yapamazsanız, bir kod bloğunun sonunda genellikle olduğu gibi print(dataframe_name) doğrudan çağırmak yerine dataframe_name kullanarak pandas veri çerçevesi döndüren herhangi bir kodu 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ızdan daha fazla sütun var; yalnızca df_bills, text ve summary sütunlarını içerecek biçimde, title adlı daha küçük yeni bir 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ç limiti (8.192 belirteç) aşan çok uzun 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 dizinden itibaren tam metni parçalara ayrılmış ve belirteçlendirilmiş olarak döndürecektir. 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 gerçekten token'lara ayırmadığımızı fark 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, DataFrame'in sağ tarafındaki yeni ada_v2 sütununda her faturanın kendine ait 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, modele bir seferde tek bir giriş yerine bir veri dizisi aktarabilirsiniz. Modele bir dizi girdi ilettiğinizde, gömme uç noktasına yapılan her çağrıda en fazla 2048 giriş öğesi olabilir.

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ı, ardından en üst sıradaki arama sonucunu alabilir ve ilk sorgusunu tetikleyen sonraki görevinde kullanabilir.

Sorun giderme

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

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: