Azure AI Arama'da Artırılmış Nesil (RAG) alma

Alma Artırılmış Nesil (RAG), topraklama verileri sağlayan bir bilgi alma sistemi ekleyerek ChatGPT gibi bir Büyük Dil Modelinin (LLM) özelliklerini geliştiren bir mimaridir. Bilgi alma sistemi eklemek, bir LLM tarafından yanıt formüle edildiğinde kullanılan topraklama verileri üzerinde denetim sahibi olmanıza yardımcı olur. Kurumsal bir çözüm için RAG mimarisi, vektörleştirilmiş belgelerden ve görüntülerden ve bu içerik için model eklediyseniz diğer veri biçimlerinden kaynaklanan kurumsal içeriğinizle üretken yapay zekayı kısıtlayabileceğiniz anlamına gelir.

LLM'ye girişleri belirlediği için hangi bilgi alma sisteminin kullanılacağına karar vermek kritik önem taşır. Bilgi alma sistemi aşağıdakileri sağlamalıdır:

  • İçeriğinizin tümü için gereken sıklıkta büyük ölçekte yükleyip yenilenen dizin oluşturma stratejileri.

  • Sorgu özellikleri ve ilgi ayarı. Sistem, LLM girişlerinin belirteç uzunluğu gereksinimlerini karşılamak için gereken kısa biçim biçimlerinde ilgili sonuçları döndürmelidir.

  • Hem veriler hem de işlemler için güvenlik, genel erişim ve güvenilirlik.

  • Dizin oluşturma için ekleme modelleri ve alma için sohbet modelleri veya dil anlama modelleri ile tümleştirme.

Azure AI Search, RAG mimarisinde bilgi almak için kanıtlanmış bir çözümdür. Azure bulutunun altyapısı ve güvenliği ile dizin oluşturma ve sorgu özellikleri sağlar. Kod ve diğer bileşenler aracılığıyla, özel içeriğiniz üzerinde üretken yapay zeka için tüm öğeleri içeren kapsamlı bir RAG çözümü tasarlayabilirsiniz.

Not

Yardımcı pilot ve RAG kavramlarını yeni mi edindin? Oluşturucu yapay zeka uygulamaları için Vektör araması ve son durum alma işlemini izleyin.

Microsoft,Azure AI Search'i bir RAG çözümünde kullanmak için çeşitli yerleşik uygulamalara sahiptir.

Seçilmiş yaklaşımlar kullanmaya başlamayı kolaylaştırır, ancak mimari üzerinde daha fazla denetim için özel bir çözüme ihtiyacınız vardır. Bu şablonlar şunlarda uçtan uca çözümler oluşturur:

Bu makalenin geri kalanında Azure AI Search'ün özel bir RAG çözümüne nasıl uyduğunu inceler.

Desenin üst düzey bir özeti şöyle görünür:

  • Bir kullanıcı sorusu veya isteği (istem) ile başlayın.
  • İlgili bilgileri bulmak için Azure AI Search'e gönderin.
  • En yüksek dereceli arama sonuçlarını LLM'ye gönderin.
  • İlk istem için bir yanıt oluşturmak için LLM'nin doğal dil anlama ve mantık özelliklerini kullanın.

Azure AI Search, LLM istemine giriş sağlar ancak modeli eğitmez. RAG mimarisinde ek eğitim yoktur. LLM, genel veriler kullanılarak önceden eğitilir, ancak retriever'dan alınan bilgilerle genişletilen yanıtlar oluşturur.

Azure AI Search içeren RAG desenleri aşağıdaki çizimde belirtilen öğelere sahiptir.

Arama ve ChatGPT ile bilgi alma mimarisi diyagramı.

  • Kullanıcı deneyimi için uygulama UX (web uygulaması)
  • Uygulama sunucusu veya düzenleyici (tümleştirme ve koordinasyon katmanı)
  • Azure AI Search (bilgi alma sistemi)
  • Azure OpenAI (üretken yapay zeka için LLM)

Web uygulaması sunu, bağlam ve kullanıcı etkileşimi sağlayarak kullanıcı deneyimi sağlar. Bir kullanıcıdan gelen sorular veya istemler buradan başlar. Girişler tümleştirme katmanından geçer, arama sonuçlarını almak için önce bilgi alma bölümüne gider, aynı zamanda bağlamı ve amacı ayarlamak için LLM'ye gider.

Uygulama sunucusu veya düzenleyici, bilgi alma ve LLM arasındaki iletimleri koordine eden tümleştirme kodudur. Bir seçenek, iş akışını koordine etmek için LangChain kullanmaktır. LangChain, Azure AI Search ile tümleştirerek Azure AI Search'ün iş akışınıza bir retriever olarak eklenmesini kolaylaştırır. Semantik Çekirdek başka bir seçenektir.

Bilgi alma sistemi aranabilir dizini, sorgu mantığını ve yükü (sorgu yanıtı) sağlar. Arama dizini vektörler veya nonvector içeriği içerebilir. Çoğu örnek ve tanıtım vektör alanı içerse de, bu bir gereksinim değildir. Sorgu, Anahtar sözcük (veya terim) ve vektör sorgularını işleyebilen Azure AI Search'teki mevcut arama altyapısı kullanılarak yürütülür. Dizin, tanımladığınız şemaya göre önceden oluşturulur ve dosyalardan, veritabanlarından veya depolamadan alınan içeriğinizle birlikte yüklenir.

LLM özgün istemi ve Azure AI Search'ten sonuçları alır. LLM sonuçları analiz eder ve bir yanıt formüle eder. LLM ChatGPT ise, kullanıcı etkileşimi bir ileri geri konuşma olabilir. Davinci kullanıyorsanız, istem tamamen oluşturulmuş bir yanıt olabilir. Bir Azure çözümü büyük olasılıkla Azure OpenAI kullanır, ancak bu hizmete bağımlı değildir.

Azure AI Search, istem akışları veya sohbet koruması için yerel LLM tümleştirmesi sağlamadığından düzenleme ve durumu işleyen kod yazmanız gerekir. Tam çözümün ne gerektirdiğine ilişkin bir şema için tanıtım kaynağını (Azure-Samples/azure-search-openai-demo) gözden geçirebilirsiniz. LLM'lerle tümleşen RAG tabanlı Azure AI Search çözümleri oluşturmak için Azure AI Studio veya Azure OpenAI Studio'yu da öneririz.

Azure AI Search'te, aranabilir tüm içerik arama hizmetinizde barındırılan bir arama dizininde depolanır. Arama dizini milisaniyelik yanıt süreleri olan hızlı sorgular için tasarlanmıştır, bu nedenle bu hedefi desteklemek için iç veri yapıları vardır. Bu amaçla, arama dizini tüm PDF'ler veya görüntüler gibi içerik dosyalarının tamamını değil, dizine alınan içeriği depolar. Veri yapıları dahili olarak belirteçli metnin ters dizinlerini, eklemeler için vektör dizinlerini ve ayrıntılı eşleştirmenin gerekli olduğu durumlar için değiştirilmemiş metinleri (örneğin, filtreler, benzer arama, normal ifade sorgularında) içerir.

RAG çözümünüz için verileri ayarlarken, Azure AI Search'te dizin oluşturup yükleyen özellikleri kullanırsınız. Dizin, kaynak içeriğinizi çoğaltan veya temsil eden alanlar içerir. Dizin alanı basit aktarım (kaynak belgedeki başlık veya açıklama, arama dizininde başlık veya açıklamaya dönüşebilir) veya bir alan, bir görüntünün gösterimini veya metin açıklamasını oluşturan vektörleştirme veya beceri işleme gibi bir dış işlemin çıkışını içerebilir.

Büyük olasılıkla ne tür bir içerik aramak istediğinizi bildiğinizden, her içerik türü için geçerli olan dizin oluşturma özelliklerini göz önünde bulundurun:

İçerik türü Dizine alınan: Özellikler
text belirteçler, değiştirilmemiş metin Dizin oluşturucular, Azure Depolama ve Cosmos DB gibi diğer Azure kaynaklarından düz metin çekebilir. Ayrıca herhangi bir JSON içeriğini bir dizine gönderebilirsiniz. Sürümdeki metni değiştirmek için, dizin oluşturma sırasında sözcük temelli işleme eklemek için çözümleyicileri ve normalleştiricileri kullanın. Kaynak belgelerde sorguda kullanılabilecek terminoloji eksikse eş anlamlı eşlemeleri yararlıdır.
text vektörler 1 Metin öbeklenebilir, dış olarak vektörleştirilebilir ve dizininizde vektör alanları olarak dizine eklenebilir.
görüntü belirteçler, değiştirilmemiş metin 2 OCR ve Görüntü Analizi becerileri , metin tanıma veya görüntü özellikleri için görüntüleri işleyebilir. Görüntü bilgileri aranabilir metne dönüştürülür ve dizine eklenir. Becerilerin dizin oluşturucu gereksinimi vardır.
görüntü vektörler 1 Görüntüler, görüntü içeriğinin matematiksel bir gösterimi için dışarıdan vektörleştirilebilir ve ardından dizininizde vektör alanları olarak dizinlenebilir. Aynı ekleme alanında metin ve görüntüleri vektörleştirmek için OpenAI CLIP gibi bir açık kaynak modeli kullanabilirsiniz.

1 Vektör desteğinin genel olarak kullanılabilir işlevselliği, veri öbekleme ve vektörleştirme için diğer kitaplıkları veya modelleri çağırmanızı gerektirir. Ancak tümleşik vektörleştirme (önizleme) bu adımları ekler. Her iki yaklaşımı da gösteren kod örnekleri için bkz . azure-search-vectors deposu.

2Beceriler, yapay zeka zenginleştirmesi için yerleşik destek sağlar. OCR ve Görüntü Analizi için dizin oluşturma işlem hattı, Azure AI Vision API'lerine bir iç çağrı yapar. Bu beceriler, ayıklanan bir görüntüyü işlenmek üzere Azure AI'ye geçirir ve çıkışı Azure AI Search tarafından dizine alınan metin olarak alır.

İçerik, matematik gösterimlerinde evrensel olarak ifade edildiğinden vektörler, farklı içerikler (birden çok dosya biçimi ve dil) için en iyi konaklamayı sağlar. Vektörler, benzerlik aramasını da destekler: vektör sorgusuna en benzer koordinatlarda eşleştirme. Belirteçli terimlerle eşleşen anahtar sözcük aramasına (veya terim aramasına) kıyasla benzerlik araması daha incedir. İçerikte veya sorgularda belirsizlik veya yorumlama gereksinimleri varsa bu daha iyi bir seçimdir.

Verileriniz bir arama dizinine girdikten sonra, içeriği almak için Azure AI Search'ün sorgu özelliklerini kullanırsınız.

RAG olmayan bir düzende, sorgular bir arama istemcisinden gidiş dönüş yapar. Sorgu gönderilir, bir arama altyapısında yürütülür ve yanıt istemci uygulamasına döndürülür. Yanıt veya arama sonuçları yalnızca dizininizde bulunan ayrıntılı içerikten oluşur.

RAG düzeninde sorgular ve yanıtlar arama altyapısı ile LLM arasında koordine edilir. Kullanıcının sorusu veya sorgusu hem arama altyapısına hem de llm'ye istem olarak iletilir. Arama sonuçları arama motorundan geri gelir ve bir LLM'ye yönlendirilir. Kullanıcıya geri dönmesini sağlayan yanıt, LLM'den bir toplama veya yanıt olarak üretken yapay zekadır.

Azure AI Search'te yeni yanıtlar oluşturan anlamsal veya vektör araması bile olmayan bir sorgu türü yoktur. Yalnızca LLM, üretken yapay zeka sağlar. Azure AI Search'te sorguları formüle etmek için kullanılan özellikler şunlardır:

Sorgu özelliği Purpose Neden kullanmalı
Basit veya tam Lucene söz dizimi Metin ve görsel olmayan sayısal içerik üzerinden sorgu yürütme Tam metin araması, benzer eşleşmeler yerine tam eşleşmeler için en iyisidir. Tam metin arama sorguları BM25 algoritması kullanılarak derecelenir ve puanlama profilleri aracılığıyla ilgi ayarlamayı destekler. Ayrıca filtreleri ve modelleri de destekler.
Filtreler ve modeller Yalnızca metin veya sayısal (nonvector) alanları için geçerlidir. Dahil etme veya dışlama ölçütlerine göre arama yüzeyi alanını azaltır. Sorgularınıza duyarlık ekler.
Anlamsal derecelendirme Anlamsal modelleri kullanarak bm25 sonuç kümesini yeniden sıralar. LLM girişleri olarak yararlı olan kısa biçimli başlık ve yanıtlar üretir. Profil puanlamaktan daha kolaydır ve içeriğinize bağlı olarak, ilgi ayarı için daha güvenilir bir tekniktir.
Vektör araması Benzerlik araması için vektör alanları üzerinde sorgu yürütme; burada sorgu dizesi bir veya daha fazla vektördür. Vektörler, herhangi bir dilde tüm içerik türlerini temsil edebilir.
Karma arama Yukarıdaki sorgu tekniklerinin herhangi birini veya tümünü birleştirir. Vektör ve nonvector sorguları paralel olarak yürütülür ve birleşik bir sonuç kümesinde döndürülür. Duyarlık ve yakalamada en önemli kazançlar karma sorgular aracılığıyla elde edilir.

Sorgu yanıtını yapılandırma

Sorgunun yanıtı LLM'ye giriş sağladığından, arama sonuçlarınızın kalitesi başarı açısından kritik önem taşır. Sonuçlar tablosal bir satır kümesidir. Sonuçların bileşimi veya yapısı şunlara bağlıdır:

  • Yanıta dizinin hangi bölümlerinin dahil olduğunu belirleyen alanlar.
  • Dizinden eşleşmeyi temsil eden satırlar.

Öznitelik "alınabilir" olduğunda arama sonuçlarında alanlar görüntülenir. Dizin şemasındaki bir alan tanımının öznitelikleri vardır ve bunlar bir alanın yanıtta kullanılıp kullanılmadığını belirler. Tam metin veya vektör sorgusu sonuçlarında yalnızca "alınabilir" alanlar döndürülür. Varsayılan olarak tüm "alınabilir" alanlar döndürülür, ancak bir alt küme belirtmek için "select" kullanabilirsiniz. "Alınabilir" ifadesinin yanı sıra, alanda herhangi bir kısıtlama yoktur. Alanlar herhangi bir uzunlukta veya türde olabilir. Uzunlukla ilgili olarak, Azure AI Search'te alan uzunluğu üst sınırı yoktur, ancak API isteğinin boyutuyla ilgili sınırlar vardır.

Satırlar sorguyla eşleşir, ilgi, benzerlik veya her ikisine göre derecelenir. Varsayılan olarak, sonuçlar tam metin araması için ilk 50 eşleşmede veya vektör araması için en yakın k komşu eşleşmelerinde eşlenir. Sınırı en fazla 1.000 belge olacak şekilde artırmak veya azaltmak için varsayılan değerleri değiştirebilirsiniz. Ayrıca, sonuçları bir dizi sayfalanmış sonuç olarak almak için top ve skip disk belleği parametrelerini de kullanabilirsiniz.

İlgiye göre derecelendir

Karmaşık süreçler, büyük miktarda veri ve milisaniyelik yanıtlar için beklentilerle çalışırken, her adımın değer eklemesi ve sonucun kalitesini artırması kritik önem taşır. Bilgi alma tarafında ilgi ayarı, LLM'ye gönderilen sonuçların kalitesini artıran bir etkinliktir. Sonuçlara yalnızca en ilgili veya en benzer eşleşen belgeler dahil edilmelidir.

İlgi, anahtar sözcük (seçici olmayan) arama ve karma sorgular (seçici olmayan alanlar üzerinde) için geçerlidir. Azure AI Search'te benzerlik araması ve vektör sorguları için bir ilgi ayarı yoktur. BM25 derecelendirmesi , tam metin arama için derecelendirme algoritmasıdır.

İlgi ayarı, BM25 sıralamasını geliştiren özelliklerle desteklenir. Bu yaklaşımlar şunlardır:

Karşılaştırma ve karşılaştırma testinde, BM25 dereceli sonuçlar üzerinde anlamsal derecelendirme ile desteklenen metin ve vektör alanları içeren karma sorgular en uygun sonuçları üretir.

RAG senaryoları için Azure AI Search sorgusunun örnek kodu

Aşağıdaki kod bir tanıtım sitesinden retrievethenread.py dosyasından kopyalanır. Karma sorgu arama sonuçlarından LLM için üretir content . Daha basit bir sorgu yazabilirsiniz, ancak bu örnek, anlamsal yeniden boyutlandırma ve yazım denetimi ile vektör araması ve anahtar sözcük aramasını kapsar. Tanıtımda, bu sorgu ilk içeriği almak için kullanılır.

# Use semantic ranker if requested and if retrieval mode is text or hybrid (vectors + text)
if overrides.get("semantic_ranker") and has_text:
    r = await self.search_client.search(query_text,
                                  filter=filter,
                                  query_type=QueryType.SEMANTIC,
                                  query_language="en-us",
                                  query_speller="lexicon",
                                  semantic_configuration_name="default",
                                  top=top,
                                  query_caption="extractive|highlight-false" if use_semantic_captions else None,
                                  vector=query_vector,
                                  top_k=50 if query_vector else None,
                                  vector_fields="embedding" if query_vector else None)
else:
    r = await self.search_client.search(query_text,
                                  filter=filter,
                                  top=top,
                                  vector=query_vector,
                                  top_k=50 if query_vector else None,
                                  vector_fields="embedding" if query_vector else None)
if use_semantic_captions:
    results = [doc[self.sourcepage_field] + ": " + nonewlines(" . ".join([c.text for c in doc['@search.captions']])) async for doc in r]
else:
    results = [doc[self.sourcepage_field] + ": " + nonewlines(doc[self.content_field]) async for doc in r]
content = "\n".join(results)

Tümleştirme kodu ve LLM'ler

Azure AI Search içeren bir RAG çözümü, eksiksiz bir çözüm oluşturmak için diğer bileşenlere ve kodlara ihtiyaç duyar. Önceki bölümlerde Azure AI Search aracılığıyla bilgi alımı ve aranabilir içerik oluşturmak ve sorgulamak için hangi özelliklerin kullanıldığı ele alınırken, bu bölümde LLM tümleştirmesi ve etkileşimi tanıtılır.

Tanıtım depolarındaki not defterleri, arama sonuçlarını bir LLM'ye geçirmeye yönelik desenler gösterdiğinden harika bir başlangıç noktasıdır. RAG çözümündeki kodların çoğu LLM'ye yapılan çağrılardan oluşur, bu nedenle bu API'lerin bu makalenin kapsamı dışında nasıl çalıştığına ilişkin bir anlayış geliştirmeniz gerekir.

Chat-read-retrieve-read.ipynb not defterindeki aşağıdaki hücre bloğu, arama çağrılarını sohbet oturumu bağlamında gösterir:

# Execute this cell multiple times updating user_input to accumulate chat history
user_input = "Does my plan cover annual eye exams?"

# Exclude category, to simulate scenarios where there's a set of docs you can't see
exclude_category = None

if len(history) > 0:
    completion = openai.Completion.create(
        engine=AZURE_OPENAI_GPT_DEPLOYMENT,
        prompt=summary_prompt_template.format(summary="\n".join(history), question=user_input),
        temperature=0.7,
        max_tokens=32,
        stop=["\n"])
    search = completion.choices[0].text
else:
    search = user_input

# Alternatively simply use search_client.search(q, top=3) if not using semantic ranking
print("Searching:", search)
print("-------------------")
filter = "category ne '{}'".format(exclude_category.replace("'", "''")) if exclude_category else None
r = search_client.search(search, 
                         filter=filter,
                         query_type=QueryType.SEMANTIC, 
                         query_language="en-us", 
                         query_speller="lexicon", 
                         semantic_configuration_name="default", 
                         top=3)
results = [doc[KB_FIELDS_SOURCEPAGE] + ": " + doc[KB_FIELDS_CONTENT].replace("\n", "").replace("\r", "") for doc in r]
content = "\n".join(results)

prompt = prompt_prefix.format(sources=content) + prompt_history + user_input + turn_suffix

completion = openai.Completion.create(
    engine=AZURE_OPENAI_CHATGPT_DEPLOYMENT, 
    prompt=prompt, 
    temperature=0.7, 
    max_tokens=1024,
    stop=["<|im_end|>", "<|im_start|>"])

prompt_history += user_input + turn_suffix + completion.choices[0].text + "\n<|im_end|>" + turn_prefix
history.append("user: " + user_input)
history.append("assistant: " + completion.choices[0].text)

print("\n-------------------\n".join(history))
print("\n-------------------\nPrompt:\n" + prompt)

Kullanmaya başlama

Not

Bazı Azure AI Arama özellikleri insan etkileşimi için tasarlanmıştır ve RAG düzeninde kullanışlı değildir. Özellikle, otomatik tamamlama ve önerileri atlayabilirsiniz. Model ve düzen gibi diğer özellikler yararlı olabilir, ancak bir RAG senaryosunda sık rastlanmayan bir durum olabilir.

Ayrıca bkz.