LLM devrimi şekillenmeye başladıkça bu heyecan yerini ticari gelişime bıraktı. İlk heyecan dalgası sona erdiğinde, üretken yapay zeka artık her şeyi bilen bir kara kutu olarak değil, daha ziyade bir mühendisin cephaneliğindeki son derece güçlü olsa da kurucu bir araç olarak görülüyor. Sonuç olarak, girişimciler ve teknoloji uzmanları artık LLM uygulamalarını geliştirmek için giderek daha olgunlaşan araç ve tekniklere sahipler.
Yüksek Lisans'ların en ilginç kullanım durumlarından biri bilgi yönetimi alanında olmuştur. OpenAI'nin GPT teknolojisine veya LLaMa 2 ve Flan-T5 gibi açık kaynaklı modellere dayanan özelleştirilmiş LLM'ler, büyük miktarda veriyi yönetmek için akıllı yöntemlerle kullanılıyor. Daha önce büyük metin veri kümelerine sahip kuruluşlar bulanık eşleştirme veya tam metin indeksleme gibi metin arama tekniklerine güvenmek zorundayken, artık yalnızca bilgiyi bulmakla kalmayıp aynı zamanda bilgiyi zaman tasarrufu sağlayan ve okuyucu dostu bir biçimde özetleyen güçlü bir sisteme erişime sahipler. moda.
Bu kullanım durumunda, almayla artırılmış üretim mimarisi veya RAG, muazzam esneklik ve performansa sahip, göze çarpan bir mimari olarak ortaya çıktı. Bu mimariyle kuruluşlar, bir çalışma grubunu hızlı bir şekilde indeksleyebilir, üzerinde anlamsal sorgular gerçekleştirebilir ve bütünlüğe dayalı olarak kullanıcı tanımlı sorgulara bilgilendirici ve ikna edici yanıtlar üretebilir. RAG mimarisinin uygulamalarını desteklemek için birçok şirket ve hizmet ortaya çıktı ve bu da onun kalıcı gücünü vurguladı.
RAG ne kadar etkili olsa da bu mimarinin bazı gerçek sınırlamaları da vardır. Bu yazıda RAG mimarisini inceleyeceğiz, sınırlamalarını belirleyeceğiz ve bu sınırlamaları çözmek için geliştirilmiş bir mimari önereceğiz.
Diğer tüm makalelerde olduğu gibi, diğer teknoloji uzmanları ve yapay zeka meraklılarıyla bağlantı kurmaya çalışıyorum. Bu mimarinin nasıl geliştirilebileceğine dair düşünceleriniz varsa veya yapay zeka hakkında tartışmak istediğiniz fikirleriniz varsa lütfen bizimle iletişime geçmekten çekinmeyin ! Beni Github veya LinkedIn'de bulabilirsiniz, bağlantılar profilimde ve bu makalenin alt kısmındadır.
RAG, Flan ve LLaMa gibi isimlere sahip yapay zeka topluluğunun yakın zamanda fütüristik ve stil sahibi isimler için ödül kazanması pek mümkün görünmüyor. Ancak RAG mimarisi, LLM'lerin geliştirilmesiyle mümkün kılınan iki son derece güçlü tekniğin (bağlamsal belge yerleştirme ve hızlı mühendislik) birleşiminden dolayı kesinlikle bir ödülü hak ediyor.
En basit haliyle RAG mimarisi, bir soruyla en alakalı derlemin bölümlerini bulmak için gömme vektör aramasını kullanan, parçayı/bölümleri bir bilgi istemine yerleştiren ve ardından soru mühendisliğini kullanarak yanıtın doğru olduğundan emin olmak için bilgi istemi mühendisliğini kullanan bir sistemdir. Cevap, bilgi isteminde verilen alıntılara dayanmaktadır. Bunların hepsi biraz kafa karıştırıcı geliyorsa lütfen okumaya devam edin çünkü her bileşeni sırasıyla açıklayacağım. Takip edebilmeniz için örnek kodu da ekleyeceğim.
Etkili bir RAG sistemi her şeyden önce güçlü bir yerleştirme modeli gerektirir. Gömme modeli, doğal bir metin belgesini, belgenin anlamsal içeriğini kabaca temsil eden bir dizi sayıya veya bir "vektöre" dönüştürür. Gömme modelinin iyi bir model olduğunu varsayarsak, iki farklı belgenin anlamsal değerlerini karşılaştırabilecek ve vektör aritmetiğini kullanarak iki belgenin anlamsal olarak benzer olup olmadığını belirleyebileceksiniz.
Bunu çalışırken görmek için aşağıdaki kodu bir Python dosyasına yapıştırın ve çalıştırın:
import openai from openai.embeddings_utils import cosine_similarity openai.api_key = [YOUR KEY] EMBEDDING_MODEL = "text-embedding-ada-002" def get_cos_sim(input_1, input_2): embeds = openai.Embedding.create(model=EMBEDDING_MODEL, input=[input_1, input_2]) return cosine_similarity(embeds['data'][0]['embedding'], embeds['data'][1]['embedding']) print(get_cos_sim('Driving a car', 'William Shakespeare')) print(get_cos_sim('Driving a car', 'Riding a horse'))
Yukarıdaki kod, kosinüs benzerliği algoritmasını kullanarak bunları birbirleriyle karşılaştırmadan önce "Araba kullanmak", "William Shakespeare" ve "Ata binmek" ifadeleri için yerleştirmeler oluşturur. İfadeler anlamsal olarak benzer olduğunda kosinüs benzerliğinin daha yüksek olmasını bekleriz, bu nedenle "Araba kullanmak" ve "Ata binmek" çok daha yakın olmalı, oysa "Araba kullanmak" ve "William Shakespeare" farklı olmalıdır.
OpenAI'nin yerleştirme modeli ada-002'ye göre "araba kullanmak" ifadesinin "ata binmek" ifadesine %88, "William Shakespeare" ifadesine ise %76 oranında benzediğini görmelisiniz. Bu, yerleştirme modelinin beklediğimiz gibi performans gösterdiği anlamına gelir. Anlamsal benzerliğin bu tespiti RAG sisteminin temelini oluşturur.
Kosinüs benzerliği fikri, onu çok daha büyük belgelerin karşılaştırmalarına genişlettiğinizde son derece sağlamdır. Örneğin, Shakespeare'in Macbeth'indeki " Yarın, yarın ve yarın " adlı güçlü monologu ele alalım:
monologue = '''Tomorrow, and tomorrow, and tomorrow, Creeps in this petty pace from day to day, To the last syllable of recorded time; And all our yesterdays have lighted fools The way to dusty death. Out, out, brief candle! Life's but a walking shadow, a poor player, That struts and frets his hour upon the stage, And then is heard no more. It is a tale Told by an idiot, full of sound and fury, Signifying nothing.''' print(get_cos_sim(monologue, 'Riding a car')) print(get_cos_sim(monologue, 'The contemplation of mortality'))
Monologun “arabaya binmek” fikrine yalnızca %75, “Ölümlülüğü düşünmek” fikrine ise %82 oranında benzediğini görmelisiniz.
Ancak monologları sadece fikirlerle karşılaştırmamıza gerek yok, aslında monologları sorularla da karşılaştırabiliriz. Örneğin:
get_cos_sim('''Tomorrow, and tomorrow, and tomorrow, Creeps in this petty pace from day to day, To the last syllable of recorded time; And all our yesterdays have lighted fools The way to dusty death. Out, out, brief candle! Life's but a walking shadow, a poor player, That struts and frets his hour upon the stage, And then is heard no more. It is a tale Told by an idiot, full of sound and fury, Signifying nothing.''', 'Which Shakespearean monologue contemplates mortality?') get_cos_sim('''Full of vexation come I, with complaint Against my child, my daughter Hermia. Stand forth, Demetrius. My noble lord, This man hath my consent to marry her. Stand forth, Lysander. And my gracious Duke, This man hath bewitch'd the bosom of my child. Thou, thou, Lysander, thou hast given her rhymes, And interchanged love-tokens with my child: Thou hast by moonlight at her window sung With feigning voice verses of feigning love, And stol'n the impression of her fantasy With bracelets of thy hair, rings, gauds, conceits, Knacks, trifles, nosegays, sweetmeats (messengers Of strong prevailment in unharden'd youth): With cunning hast thou filch'd my daughter's heart, Turn'd her obedience, which is due to me, To stubborn harshness. And, my gracious Duke, Be it so she will not here, before your Grace, Consent to marry with Demetrius, I beg the ancient privilege of Athens: As she is mine, I may dispose of her; Which shall be either to this gentleman, Or to her death, according to our law Immediately provided in that case.''', 'Which Shakespearean monologue contemplates mortality?')
Yerleştirmenin Macbeth monologunun bağlamsal olarak "Hangi Shakespeare monologu ölümlülüğü ele alıyor?" sorusuna çok daha yakın olduğunu gösterdiğini görmelisiniz. Ölümden söz eden ancak ölümlülük kavramıyla doğrudan boğuşmayan Egeus monologundan daha fazlası.
Artık yerleştirme elimizde olduğuna göre, bunu RAG sistemimizde nasıl kullanırız? Peki, RAG sistemimize Shakespeare hakkındaki soruları yanıtlayabilmesi için tüm Shakespeare monologlarının bilgisini vermek istediğimizi varsayalım. Bu durumda, Shakespeare'in tüm monologlarını indirip onlar için yerleştirmeler oluşturacağız. Eğer takip ediyorsanız, yerleştirmeyi şu şekilde oluşturabilirsiniz:
embedding = openai.Embedding.create(model=EMBEDDING_MODEL, input=[monologue])['data'][0]['embedding']
Gömmeleri elde ettiğimizde, bunları sorgulamamıza ve yeni bir yerleştirmeyle karşılaştırmamıza olanak tanıyacak şekilde depolamak isteyeceğiz. Normalde bunları, iki vektörün hızlı bir şekilde karşılaştırılmasına olanak tanıyan özel bir veri deposu olan Vektör Veritabanı adı verilen yere koyardık. Bununla birlikte, derleminiz çok büyük olmadığı sürece, performansın kritik olmadığı üretim dışı, deneysel kullanım durumlarının çoğu için kaba kuvvet karşılaştırmaları şaşırtıcı derecede tolere edilebilir.
Veritabanı kullanmayı seçseniz de seçmeseniz de, derleminizdeki soruya en iyi uyan öğeyi/öğeleri bulabilecek bir sistem oluşturmak isteyeceksiniz. Örneğimizde, elimizdeki kullanıcı sorusuyla en alakalı monologu bulma yeteneğine sahip olmak isteyeceğiz. Şöyle bir şey yapmak isteyebilirsiniz:
monologues_embeddings = [ ['Tomorrow, and tomorrow, and tomorrow...', [...]], # text in the left position, embedding in the right position ['Full of vexation come I...', [...]], … # More monologues and their embeddings as you see fit. ] def lookup_most_relevant(question): embed = openai.Embedding.create(model=EMBEDDING_MODEL, input=[question])['data'][0]['embedding'] top_monologue = sorted(monologues_embeddings, key=lambda x: cosine_similarity(embed, x[1]), reverse=True)[0] return top_monologue lookup_most_relevant(“How does Macbeth evaluate his life when he is confronted with his mortality?“)
Bu örneği çalıştırırsanız, Macbeth monologunun soruyla kabaca %82 benzerlikle seçildiğini görmelisiniz.
RAG modelindeki son adım hızlı mühendisliktir. Bizim durumumuzda bu çok zor değil. Artık monolog elimizde olduğuna göre, monologu sorgumuza yerleştirerek ve ardından şu soruyu sorarak bir bilgi istemi oluşturabiliriz:
completion = openai.ChatCompletion.create( model="gpt-4", messages=[ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": """ Consider the following monologue: Tomorrow, and tomorrow, and tomorrow, Creeps in this petty pace from day to day, To the last syllable of recorded time; And all our yesterdays have lighted fools The way to dusty death. Out, out, brief candle! Life's but a walking shadow, a poor player, That struts and frets his hour upon the stage, And then is heard no more. It is a tale Told by an idiot, full of sound and fury, Signifying nothing. How does Macbeth evaluate his life when he is confronted with his mortality? """}, ] )
Şöyle bir cevap görmelisiniz:
In the well-known "Tomorrow and tomorrow and tomorrow" monologue from Shakespeare's Macbeth, the titular character plunges into existential despair when confronted with his impending death. Macbeth evaluates his life as hollow, futile, and meaningless when facing his mortality. He sees it as a "walking shadow" and himself as a "poor player," highlighting his view of life as a fleeting, contrived performance with no lasting substance or impact. The "brief candle" is a metaphor for his own mortality, suggesting that life's flame can be extinguished suddenly and unceremoniously. By stating "It is a tale told by an idiot, full of sound and fury, signifying nothing," Macbeth is expressing his belief that life, despite all its noise and action, is ultimately empty, absurd, and void of meaning. Overall, Macbeth's examination of his life is profoundly pessimistic, revealing his deep despair and cynicism.
Tabii ki, bu özel örnek RAG mimarisinin en güçlü gösterimi değil, çünkü çoğu GPT modeli zaten Shakespeare'in monologlarından haberdardır ve Shakespeare'in internette halka açık geniş kapsamlı analizleri üzerine eğitilmiştir. Aslında, GPT-4'e monolog olmadan tam olarak bu soruyu sorarsanız, muhtemelen çok iyi bir yanıt alırsınız, ancak kendi kendine konuşmaya çok fazla alıntı gönderme yapmaması muhtemeldir. Ancak ticari bir ortamda bu tekniğin, mevcut GPT uygulamalarıyla erişilemeyen özel veya ezoterik veri kümelerine çapraz uygulanabileceği açık olmalıdır.
Aslında önceki makalem ChatGPT, Google Cloud ve Python ile Belge Analizcisi Oluşturmak'a aşina olan okuyucular, tekniğin son kısmının o makalede yaptığım hızlı mühendisliğe çok benzediğini fark edebilir. Bu fikirden hareketle, Japon hükümetinin yayınları (o makaledeki örnek veriler) üzerine inşa edilmiş, kullanıcıların Japon ekonomi politikası hakkında arama yapmasına ve sorular sormasına olanak tanıyan bir RAG sistemini kolaylıkla hayal edebiliriz. Sistem, en alakalı belgeleri hızlı bir şekilde alacak, özetleyecek ve temel GPT modellerinde bulunmayan, alana özgü derin bilgiye dayalı bir yanıt üretecektir. Bu güç ve basitlik, RAG mimarisinin LLM geliştiricileri arasında bu kadar ilgi görmesinin nedenidir.
Artık RAG mimarisini incelediğimize göre, bu mimarinin bazı eksikliklerini inceleyelim.
Birçok RAG sistemi, soruyu ve ilgili belgeleri birbirine bağlamak için belge yerleştirme ve vektör aramayı temel aldığından, sistemin tamamı genellikle kullanılan yerleştirme modeli kadar iyidir. OpenAI yerleştirme modeli inanılmaz derecede esnektir ve yerleştirmeleri ayarlamak için birçok teknik vardır. Meta'nın GPT'nin açık kaynaklı rakibi olan LLaMa, ince ayar yapılabilir yerleştirme modelleri sunar. Ancak Gömme modelinin kaçınılmaz bir kara kutu yönü vardır. Kısa metin dizelerini karşılaştırırken bu bir şekilde yönetilebilir, ancak kısa dizeleri çok daha uzun belgelerle karşılaştırırken doğrulamak ve hata ayıklamak zorlaşır. Önceki örneğimizde, yerleştirme aramasının "ölümlülüğü" "yarın, yarın ve yarın" monologuna bağlayabileceğine dair küçük bir inanç sıçraması yapmamız gerekiyor. Bu, şeffaflığın ve hata ayıklamanın kritik olduğu iş yükleri için oldukça rahatsız edici olabilir.
RAG modelinin diğer bir sınırlaması, ona aktarılabilecek bağlamın nispeten sınırlı miktarıdır. Gömme modelinin iyi çalışması belge düzeyinde bağlam gerektirdiğinden, gömme için derlemi parçalara ayırırken dikkatli olmamız gerekir. Macbeth monologu ölümlülükle ilgili soruyla %82 benzerlik taşıyor olabilir ama soruyu monologun ilk iki satırındaki "Yarın, yarın ve" ile karşılaştırdığınızda bu rakam %78'e düşüyor. Yarın. Günden güne bu küçük adımlarla sürünüyor, Kaydedilen zamanın son hecesine kadar.
Sonuç olarak RAG istemine iletilen bağlamın oldukça büyük olması gerekir. Şu anda, en yüksek bağlamlı GPT modelleri hala 16.000 jetonla sınırlıdır; bu oldukça fazla bir metindir, ancak uzun röportaj transkriptleri veya bağlam açısından zengin makalelerle çalışırken verebileceğiniz bağlam miktarı açısından sınırlı olacaksınız. son nesil komut isteminde.
RAG modelinin son sınırlaması yeni terminolojiyle çalışamamasıdır. Belirli alanlarda çalışan insanlar, o alana özgü terminolojiler ve konuşma biçimleri geliştirme eğilimindedir. Bu terminolojiler yerleştirme modelinin eğitim verileri mevcut olmadığında arama süreci zarar görecektir.
Örneğin ada-002 yerleştirme modeli “Rust Programlama Dili”nin “LLVM” ile ilişkili olduğunu bilemeyebilir. Aslında %78 gibi nispeten düşük bir kosinüs benzerliği döndürür. Bu, iki fikir gerçek hayatta yakından ilişkili olsa bile, LLVM'den bahseden belgelerin Rust hakkındaki bir sorguda güçlü bir benzerlik göstermeyebileceği anlamına gelir.
Genellikle yeni terminoloji sorununun hızlı mühendislikle üstesinden gelinebilir, ancak gömülü arama bağlamında bunu yapmak nispeten zordur. Daha önce de belirtildiği gibi bir yerleştirme modeline ince ayar yapmak mümkündür, ancak yerleştirme modeline tüm bağlamlarda yeni terminolojiyi öğretmek hataya açık ve zaman alıcı olabilir.
Bu sınırlamalar göz önüne alındığında, yukarıda açıklanan sınırlamaların çoğunu aşan yeni bir RAG sistemleri sınıfı için değiştirilmiş bir mimari önermek istiyorum. Fikir, derlemin yanı sıra sık sorulan sorular üzerinde vektör aramaları yapmaya ve derlemi sorular bağlamında önceden işlemek için bir LLM kullanmaya dayanmaktadır. Bu süreç karmaşık geliyorsa endişelenmeyin; bu bölümde, takip etmek için kullanabileceğiniz kod örnekleriyle birlikte uygulama ayrıntılarını ele alacağız.
Dikkat edilmesi gereken bir nokta, QE-RAG'ın, gerektiğinde başka bir uygulamaya geri dönebilmesi için standart bir RAG uygulamasıyla birlikte çalıştırılması gerektiğidir. Uygulama olgunlaştıkça, geri dönüşe giderek daha az ihtiyaç duyacaktır, ancak QE-RAG'in hâlâ vanilya RAG mimarisinin yerine geçmekten ziyade, bu mimariye yönelik bir geliştirme olması amaçlanmaktadır.
QE-RAG mimarisinin genel hatları aşağıdaki gibidir:
Her bölümü sırasıyla inceleyelim.
Mimari, vanilya RAG'a benzer şekilde bir yerleştirme ve bir vektör veritabanıyla başlar. Ancak belgeleri gömmek yerine bir dizi soruyu yerleştireceğiz.
Bunu açıklamak için, Shakespeare konusunda uzman bir yüksek lisans kurumu kurmaya çalıştığımızı varsayalım. Aşağıdaki gibi sorulara cevap vermesini isteyebiliriz:
questions = [ "How does political power shape the way characters interact in Shakespeare's plays?", "How does Shakespeare use supernatural elements in his plays?", "How does Shakespeare explore the ideas of death and mortality in his plays?", "How does Shakespeare explore the idea of free will in his plays?" ]
Bunlar için şu şekilde bir yerleştirme oluşturmak ve bunları kaydetmek veya daha sonra kullanmak isteyeceğiz:
questions_embed = openai.Embedding.create(model=EMBEDDING_MODEL, input=questions)
Artık sorularımız olduğuna göre, külliyatı indirip özetlemek isteyeceğiz. Bu örnek için Macbeth ve Hamlet'in HTML versiyonlarını indireceğiz:
import openai import os import requests from bs4 import BeautifulSoup plays = { 'shakespeare_macbeth': 'https://www.gutenberg.org/cache/epub/1533/pg1533-images.html', 'shakespeare_hamlet': 'https://www.gutenberg.org/cache/epub/1524/pg1524-images.html', } if not os.path.exists('training_plays'): os.mkdir('training_plays') for name, url in plays.items(): print(name) file_path = os.path.join('training_plays', '%s.txt' % name) if not os.path.exists(file_path): res = requests.get(url) with open(file_path, 'w') as fp_write: fp_write.write(res.text)
Daha sonra HTML etiketlerini kılavuz olarak kullanarak oyunları sahneler halinde işleriz:
with open(os.path.join('training_plays', 'shakespeare_hamlet.txt')) as fp_file: soup = BeautifulSoup(''.join(fp_file.readlines())) headers = soup.find_all('div', {'class': 'chapter'})[1:] scenes = [] for header in headers: cur_act = None cur_scene = None lines = [] for i in header.find_all('h2')[0].parent.find_all(): if i.name == 'h2': print(i.text) cur_act = i.text elif i.name == 'h3': print('\t', i.text.replace('\n', ' ')) if cur_scene is not None: scenes.append({ 'act': cur_act, 'scene': cur_scene, 'lines': lines }) lines = [] cur_scene = i.text elif (i.text != '' and not i.text.strip('\n').startswith('ACT') and not i.text.strip('\n').startswith('SCENE') ): lines.append(i.text)
QE-RAG'ı benzersiz kılan kısım da buradadır; belirli sahneler için yerleştirmeler oluşturmak yerine, her bir soruyu hedef alan özetler oluşturuyoruz:
def summarize_for_question(text, question, location): completion = openai.ChatCompletion.create( model="gpt-3.5-turbo-16k", messages=[ {"role": "system", "content": "You are a literature assistant that provides helpful summaries."}, {"role": "user", "content": """Is the following excerpt from %s relevant to the following question? %s === %s === If so, summarize the sections that are relevant. Include references to specific passages that would be useful. If not, simply say: \"nothing is relevant\" without additional explanation""" % ( location, question, text )}, ] ) return completion
Bu işlev ChatGPT'den 2 şey yapmasını ister: 1) pasajın eldeki soruyu yanıtlamak için gerçekten yararlı olup olmadığını belirlemek ve 2) sahnenin soruyu yanıtlamak için yararlı olan bölümlerini özetlemek.
Bu işlevi Macbeth veya Hamlet'ten birkaç önemli sahneyle denerseniz, GPT3.5'in bir sahnenin soruyla alakalı olup olmadığını belirlemede oldukça iyi olduğunu ve özetin sahnenin kendisinden biraz daha kısa olacağını göreceksiniz. Bu, daha sonra hızlı mühendislik adımında yerleştirmeyi çok daha kolay hale getirir.
Artık bunu tüm sahneler için yapabiliriz.
for scene in scenes: scene_text = ''.join(scene['lines']) question_summaries = {} for question in questions: completion = summarize_for_question(''.join(scene['lines']), question, "Shakespeare's Hamlet") question_summaries[question] = completion.choices[0].message['content'] scene['question_summaries'] = question_summaries
Üretim iş yüklerinde özetleri bir veritabanına koyardık, ancak bizim durumumuzda bunu yalnızca JSON dosyası olarak diske yazacağız.
Şimdi aşağıdaki gibi bir kullanıcı sorusuyla karşılaştığımızı varsayalım:
user_question = "How do Shakespearean characters deal with the concept of death?"
Vanilya RAG'da olduğu gibi, şu soru için bir yerleştirme oluşturmak isteyeceğiz:
uq_embed = openai.Embedding.create(model=EMBEDDING_MODEL, input=[user_question])['data'][0]['embedding']
Vanilya RAG'da, kullanıcı sorusu yerleştirmeyi Shakespeare'deki sahnelere yönelik yerleştirmelerle karşılaştırırız, ancak QE-RAG'de, soruları içeren yerleştirmelerle karşılaştırırız:
print([cosine_similarity(uq_embed, q) for q in question_embed])
Vektör aramasının 3. soruyu (doğru bir şekilde) en alakalı soru olarak belirlediğini görüyoruz. Şimdi 3. soruya ilişkin özet verileri alıyoruz:
relevant_texts = [] for scene in hamlet + macbeth: # hamlet and macbeth are the scene lists from the above code if "NOTHING IS RELEVANT" not in scene['question_summaries'][questions[2]].upper() and \ "NOTHING IN THIS EXCERPT" not in scene['question_summaries'][questions[2]].upper() and \ 'NOTHING FROM THIS EXCERPT' not in scene['question_summaries'][questions[2]].upper() and \ "NOT DIRECTLY ADDRESSED" not in scene['question_summaries'][questions[2]].upper(): relevant_texts.append(scene['question_summaries'][questions[2]])
GPT özetlemesi belirleyici olmadığından, bir sahnenin elinizdeki soruyla alakalı olmadığını belirten birkaç farklı dize alabileceğinizi lütfen unutmayın. Önemli olan yalnızca ilgili alıntıları ilgili özetler listesine eklemektir.
Bu aşamada, istemimize yalnızca en alakalı özetleri dahil etmek için ikinci düzey bir vektör araması yapabiliriz, ancak derlemimizin boyutu göz önüne alındığında, relevant_texts
listesinin tamamını istemimizde kullanabiliriz.
Artık tüm alıntılara sahibiz, istemi şu şekilde oluşturabiliriz:
completion = openai.ChatCompletion.create( model="gpt-3.5-turbo-16k", messages=[ {"role": "system", "content": "You are a literature assistant that answers questions based on excerpts."}, {"role": "user", "content": """Consider the following passages: %s ==== Answer this question: %s Be detailed and complete in your analysis. Make references to specific passages where helpful. Answer only based on passages provided. """ % ( '\n===\n'.join(relevant_texts), user_question )}, ] )
API çağrısının çalışmasına izin verin; aşağıdakine benzer bir şey görmelisiniz:
Based on the passages provided, Shakespearean characters deal with the concept of death in various ways. In Hamlet, for example, the characters contemplate the nature of death and its implications. Hamlet himself reflects on the brevity of life and the corrupting influence of vices. He questions the purpose of existence and contemplates suicide as a release from the burdens of life. In the passage, Hamlet says, "To die, to sleep— / To sleep, perchance to dream. Ay, there's the rub, / For in that sleep of death what dreams may come" (Lines 65-67). This shows his contemplation of the afterlife and the uncertainty surrounding it. In Macbeth, characters are confronted with the consequences of their actions and the fragility of life. Lady Macbeth, for instance, experiences guilt and remorse for her involvement in the murder of King Duncan. She is haunted by visions of blood on her hands and expresses the desire to escape the consequences of her actions. In the passage, Lady Macbeth says, "Out, damned spot! Out, I say!" (Line 30). This demonstrates her struggle to cope with the guilt and the psychological toll it takes on her. Furthermore, both Macbeth and Lady Macbeth reflect on the inevitability and the consequences of their actions. In the passage, Macbeth laments the decay of life and the loss of purpose and meaning. He reflects on the transitory nature of existence and the insignificance of worldly achievements. Macbeth states, "Life's but a walking shadow, a poor player / That struts and frets his hour upon the stage" (Lines 217-218). This shows his acceptance of mortality and his realization that material possessions and power do not bring true fulfillment. In summary, Shakespearean characters deal with the concept of death in various ways. They contemplate the nature of life and the afterlife, struggle with guilt and remorse, and question the meaning and purpose of their existence. Shakespeare's exploration of death and mortality through his characters provides insight into the complexities of human nature and the universal human experience of confronting one's mortality.
Bu, Hamlet ve Macbeth'in pek çok farklı kısmından yararlanan çok güzel bir özet.
Karşılaştırma için, tüm sahneler için yerleştirmeler oluşturdum ve aynı istemi kullanarak basit bir RAG araması çalıştırdım ve 10.000 jetona ulaşana kadar en alakalı N sahneyi buldum.
relevant_texts = [] for i in range(10): if len(encoding.encode('\n===\n'.join(relevant_texts))) > 10000: break relevant_texts.append(''.join(macbeth[sorted( [(idx, cosine_similarity(uq_embed, q)) for idx, q in enumerate(macbeth_embed)], key=lambda x: x[1], reverse=True )[i][0]]['lines'])) relevant_texts.append(''.join(hamlet[sorted( [(idx, cosine_similarity(uq_embed, q)) for idx, q in enumerate(hamlet_embed)], key=lambda x: x[1], reverse=True )[i][0]]['lines']))
Bunu istemle beslerseniz aşağıdakine benzer bir şey görmelisiniz:
Based on the provided passages, Shakespearean characters deal with the concept of death in various ways. In Hamlet, the characters reflect on death and mortality extensively. Hamlet himself contemplates suicide, expressing his desire to end his suffering and questioning the purpose of life. He says, "To be, or not to be: that is the question" (Hamlet, Act III, Scene I, Lines 56). This soliloquy reveals his struggle with the concept of death and his contemplation of the consequences of choosing either life or death. Additionally, in the same play, the appearance of the Ghost prompts discussions about death. The characters question the meaning and significance of encountering the dead, and Hamlet grapples with the idea of mortality in relation to his father's death. He reflects, "Oh God! a beast that wants discourse of reason / Would have mourn'd longer" (Hamlet, Act I, Scene II, Lines 152-153). This passage highlights Hamlet's grief and his pondering of the brevity of life and the transitory nature of existence. In Macbeth, the characters also confront death and its consequences. Macbeth, after killing King Duncan, reflects on the significance of the act and its implications. He says, "Will all great Neptune's ocean wash this blood Clean from my hand? No, this my hand will rather The multitudinous seas incarnadine" (Macbeth, Act II, Scene II, Lines 77-79). This passage showcases Macbeth's awareness of the guilt associated with murder and his realization that the blood on his hands cannot be cleansed. Lady Macbeth, on the other hand, shows a different perspective on death. She suppresses her guilt and tries to detach herself from the consequences of their actions. She states, "A little water clears us of this deed" (Macbeth, Act II, Scene II, Line 69). This passage reveals her denial and determination to move forward without remorse. In conclusion, Shakespearean characters deal with the concept of death in various ways. Some contemplate the meaning of life and question the purpose of existence, while others grapple with the guilt and consequences that come with taking a life. Shakespeare explores the complexities of death and mortality through his characters' introspection and their different responses to the inevitability of death.
Bu çok inandırıcı bir analiz ama Hamlet ve Macbeth'in en önemli pasajlarının çoğuyla bağlantılı değil. Gördüğünüz gibi QE-RAG, standart bir RAG sistemine göre daha alakalı bağlamı yerleştirebilme konusunda belirgin bir avantaja sahiptir.
Ancak yukarıdaki örnek, QE-RAG'ın geliştiriciye yerleştirme süreci üzerinde daha iyi kontrol sağlama yeteneği olan başka bir avantajını göstermez. QE-RAG'ın bunu nasıl başardığını görmek için bu sorunun bir uzantısı olan yeni terminolojiyle ilgilenelim.
QE-RAG'ın gerçekten parladığı yer, yeni bir terminoloji tanıttığınız zamandır. Örneğin, umutsuzluk ile umutsuzluk arasında yer alan ve özellikle kişinin içinde bulunduğu koşullara teslimiyeti ifade eden Japonca "zetsubou" kelimesi gibi yeni bir kavramı tanıttığınızı varsayalım. Bu, İngilizlerin umutsuzluk kavramı kadar doğrudan bir felaket değil, daha çok, meydana gelen hoş olmayan şeylere boyun eğmeyle ilgili.
Şöyle bir soruya cevap vermek istediğimizi varsayalım:
user_question = "How do Shakespearean characters cope with Zetsubou?"
Vanilya RAG ile bir yerleştirme araması yapacağız ve ardından son mühendislik adımına bir açıklayıcı ekleyeceğiz:
relevant_texts = [] for i in range(10): if len(encoding.encode('\n===\n'.join(relevant_texts))) > 10000: break relevant_texts.append(''.join(macbeth[sorted( [(idx, cosine_similarity(uq_embed, q)) for idx, q in enumerate(macbeth_embed)], key=lambda x: x[1], reverse=True )[i][0]]['lines'])) relevant_texts.append(''.join(hamlet[sorted( [(idx, cosine_similarity(uq_embed, q)) for idx, q in enumerate(hamlet_embed)], key=lambda x: x[1], reverse=True )[i][0]]['lines'])) completion = openai.ChatCompletion.create( model="gpt-3.5-turbo-16k", messages=[ {"role": "system", "content": "You are a literature assistant that answers questions based on excerpts."}, {"role": "user", "content": """Zetsubou is the concept of hopelessness and despair, combined with a surrender to whim of one's circumstances. Consider the following passages: %s ==== Answer this question: %s Be detailed and complete in your analysis. Make references to specific passages where helpful. Answer only based on passages provided. """ % ( '\n===\n'.join(relevant_texts), user_question )}, ] )
Sonuç, Hamlet'ten birkaç sahneye odaklanan, çok iyi yazılmış ve inandırıcı ama biraz fazla uzatılmış bir cevaptır. Bu cevapta Macbeth'ten hiç bahsedilmiyor çünkü sahnelerin hiçbiri yerleştirme aramasını geçemedi. Gömmelere bakıldığında “zetsubou”nun anlamsal anlamının tam olarak yakalanamadığı ve bu nedenle ilgili metinlerin buradan çıkarılamadığı çok açıktır.
QE-RAG'da, yeni terimin tanımını özetleme aşamasında enjekte ederek sistem tarafından erişilebilen metnin kalitesini önemli ölçüde artırabiliriz:
def summarize_for_question(text, question, location, context=''): completion = openai.ChatCompletion.create( model="gpt-3.5-turbo-16k", messages=[ {"role": "system", "content": "You are a literature assistant that provides helpful summaries."}, {"role": "user", "content": """%s Is the following excerpt from %s relevant to the following question? %s === %s === If so, summarize the sections that are relevant. Include references to specific passages that would be useful. If not, simply say: \"nothing is relevant\" without additional explanation""" % ( context, location, question, text )}, ] ) return completion questions = [ "How do characters deal with Zetsubou in Shakespearean plays?" ] summarize_for_question(''.join(scene['lines']), questions[0], "Shakespeare's Macbeth", "Zetsubou is the concept of hopelessness and despair, combined with a surrender to whim of one's circumstances." )
Bu özetleme istemini pasajlarla birlikte kullanın; son derece doğru ve bağlamsal özetler göreceksiniz. Bu özetler daha sonra sonraki QE-RAG'da kullanılabilir.
Ek olarak soru yerleştirme son derece benzer olacaktır çünkü ada-002 “zetsubou”nun tam anlamını bilmese de her iki soruda da bu kelimenin bulunması soru yerleştirmelerini son derece benzer kılmaktadır.
Bu nedenle, Zetsubou hakkındaki orijinal soruyu yanıtlamak için QE-RAG'ı kullanırsak aşağıdaki yanıtı alırız:
Based on the passages provided, Shakespearean characters cope with Zetsubou, or hopelessness and despair, in different ways. In "Macbeth," Lady Macbeth copes with Zetsubou through guilt and anguish. She is consumed by the guilt of her and her husband's actions, and this guilt manifests in her sleepwalking and attempts to wash her hands of imagined blood stains. This can be seen in her utterances of "Out, damned spot!" and her preoccupation with the blood on her hands. Lady Macbeth's coping mechanism is to face the consequences of her actions head-on, even if it means descending into madness. The Doctor and Gentlewoman observe her behavior and acknowledge that her condition requires divine intervention. In "Hamlet," the excerpt does not provide specific passages or examples of characters coping with Zetsubou. However, it does address Hamlet's inner turmoil and struggle to cope with his circumstances. Hamlet's state of mind, confusion, and madness are a reflection of despair. The characters in this scene are attempting to understand Hamlet's condition and find ways to deal with it, but the excerpt does not provide details on how they cope with Zetsubou. In "Macbeth," Macbeth himself copes with Zetsubou by surrendering to his dire circumstances. He becomes desensitized to fear and horror, indicating a kind of resignation to his grim circumstances. He acknowledges that there is no escape from his fate and chooses to face it head-on, even though he knows it will lead to his downfall. Macbeth's reaction to the news of his wife's death and his subsequent soliloquy reflect a deep despair and hopelessness. He sees life as meaningless, a "tale Told by an idiot, full of sound and fury, Signifying nothing." Macbeth's surrender to his circumstances and his belief in the futility of life demonstrate his coping mechanism for Zetsubou. In "Macbeth," Lady Macduff copes with Zetsubou by expressing her feelings of despair and hopelessness. She feels betrayed and abandoned by her husband, who has fled and left their family behind. She questions his actions and believes that they show a lack of love and wisdom. Lady Macduff experiences a sense of abandonment, which aligns with the concept of Zetsubou. She tries to make her son understand the severity of their circumstances, but he questions the definition of a traitor. Lady Macduff ultimately meets a tragic end, indicating that her coping mechanism for Zetsubou is not successful. In summary, Shakespearean characters cope with Zetsubou in different ways. Lady Macbeth copes through guilt and faces the consequences of her actions, even if it means descending into madness. Macbeth copes through surrendering to his dire circumstances and embracing his fate. Lady Macduff copes through expressing her feelings of despair and hopelessness but ultimately meets a tragic end. These characters' coping mechanisms reflect different responses to Zetsubou in Shakespearean plays
Çıktı hala bu konseptle biraz mücadele ediyor, ancak QE-RAG'ın sorunun özüyle ilgilenme ve çeşitli kaynaklardan yararlanma konusunda çok daha yetenekli olduğu açık olmalı.
Ve bununla birlikte QE-RAG'ı uyguladık ve kullanım durumunu gösterdik!
Bugünkü yazımızda giderek popülerliği artan RAG mimarisini ve sınırlamalarını inceledik. Daha sonra RAG mimarisini, büyük dil modellerinin yeteneklerini daha kapsamlı şekilde kullanmayı amaçlayan, QE-RAG adı verilen yeni bir mimariyle genişlettik. Geliştirilmiş doğruluk ve bağlamsal erişime ek olarak QE-RAG, kullanıcılarla etkileşime girdikçe ve sorulan soru türlerine daha aşina hale geldikçe tüm sistemin büyümesine olanak tanıyarak firmaların açık kaynak üzerinde benzersiz fikri mülkiyet geliştirmesine olanak tanır. veya ticari olarak temin edilebilen LLM'ler .
Elbette deneysel bir fikir olarak QE-RAG mükemmel değil. Bu mimarinin nasıl geliştirilebileceğine dair fikirleriniz varsa veya sadece Yüksek Lisans teknolojileri hakkında tartışmak istiyorsanız, lütfen Github veya LinkedIn üzerinden bana bir satır yazmaktan çekinmeyin.