2024 yılında LLM tabanlı başvurularda herhangi bir eksiklik yaşanmayacak. Microsoft ve Google gibi büyük teknoloji şirketleri, amiral gemileri ChatGPT ve Gemini modellerinin her zamankinden daha güçlü versiyonlarını öne çıkarıyor ve Anthropic gibi uzman oyuncular, ek entegrasyonlarla rakip teklifleri öne çıkarıyor. Uygulamalı LLM dünyasında şirketler ve hatta hükümetler çeşitli bağlamlar için sohbet uygulamalarıyla denemeler yapıyor.
LLM'lere akıtılan muazzam girişimci enerjiye rağmen, yüksek profilli uygulamaların çoğu, insanların okuyabileceği metinleri alan ve döndüren sohbet benzeri arayüzlere odaklanmaları nedeniyle hala sınırlıdır. Bu anlaşılabilir bir durumdur; sonuçta, Yüksek Lisans'taki en heyecan verici gelişmelerden biri, konuşmaya dayalı bir kullanıcı arayüzüne olanak tanıyan insan dilini anlama ve üretme yeteneğidir. Ancak sohbet arayüzleri, LLM'ler için çok önemli bir başka kullanım durumunu gözden kaçırıyor: daha büyük bir veri hattında bir ara adım olarak metin işleme.
Bugün bu kullanım durumunu inceleyeceğiz ve Yüksek Lisans'ların yalnızca bir doğal dil oluşturucu olarak değil, bir veri hattının parçası olarak nasıl faydalı olabileceğini göreceğiz.
Yüksek Lisans'ları bir veri hattının parçası olarak kullanmak için Yüksek Lisans'ın çıktı formatını değiştirmemiz gerekiyor; insanların okuyabileceği paragraflar oluşturmak yerine modelin bilgisayarların okuyabileceği bir şey üretmesi gerekiyor. Genellikle bu, JSON gibi bir veri formatında yapılandırılmış çıktı veya Python veya SQL gibi bir programlama dilindeki talimatlar anlamına gelir. Bu çıktı formatları doğal dilden çok daha az bağışlayıcıdır çünkü eksik bir tırnak işareti veya parantez tüm hattı çökertebilir. Bu nedenle, bu kullanım durumunu desteklemek için geliştirilmiş özel yöntemlere ve özelliklere güvenmemiz gerekecek. Çıktı, işlevleri çağırma veya işlev çağrılarında tüketilme eğiliminde olduğundan, bu özelliklere toplu olarak işlev çağrısı denir.
Ancak bu yöntemleri derinlemesine incelemeden önce, işlev çağırma özelliklerinin neden geliştirildiğini biraz daha derinlemesine inceleyelim.
Harici hizmetlere bağlanma
İşlev çağrısının orijinal ve en basit kullanım durumu, harici hizmetlere bağlanmaktır. OpenAI ilk olarak GPT-4'ü piyasaya sürdüğünde, kullanıcının modele, modelin hedeflerine ulaşmak için çağırabileceği bir dizi python tarzı işlev sağlamasına olanak tanıyan bir özellik ile API'yi de güncelledi. Örneğin modele, karmaşık bir menkul kıymetin fiyatını hesaplamak için harici bir işlevi çağırabileceği söylenebilir. Model, bu bilgiyi kullanarak, menkul kıymet fiyatlandırması konusunda özel bilgiye sahip olmaya gerek kalmadan, bu menkul kıymetlerden oluşan bir portföyün değerini hesaplayan kodu yazabilecektir.
Python tarzı işlevleri çağırmak buzdağının yalnızca görünen kısmıdır. İşlev çağırmanın önemi piyasada kanıtlandıktan sonra OpenAI ve diğer LLM sağlayıcıları JSON veya SQL gibi diğer çıktı formatlarını desteklemeye başladı. Önemli olan bu modellerin, diğer işlemler tarafından güvenilir bir şekilde okunabilen, makine tarafından okunabilen çıktılar vermesiydi.
Zeki okuyucular önceki makalelerimizde benzer bir şey yaptığımızı, eğitim verileri oluşturmak için LLM'yi, SQL'i veya JSON'u kullandığımızı fark edebilirler. Bu makalelerde bunu hızlı mühendislik ve çıktı denetimi kullanarak başardık, ancak artık işlev çağırma yaygın olarak desteklenen bir özellik olduğundan, bu model düzeyindeki özelliklere güvenerek bunu daha kolay yapabiliriz.
Yüksek Lisans Derecelerini Zincirleme
İşlev çağırma, çoklu Yüksek Lisans uygulamaları için yeni olanaklar yarattı ve çok geçmeden geliştiriciler, karmaşık sistemler oluşturmak için Yüksek Lisans'ları zincirleme denemeler yapmaya başladılar. Bu sistemlerden bazıları, bağımsız olarak web'de arama yapabilen, yeni veriler toplayabilen ve yeni bilgilerle başka bir LLM'yi arayabilen aracılar olarak bilinmeye başlandı. Bu işlem hatları şaşırtıcı miktarda özerklik kapasitesine sahiptir ve çok az girdiyle karmaşık sorunları çözme kapasitesine sahiptir; ancak API maliyetleri ve davranışsal korumalar gibi aracıların geniş çapta benimsenmesini engelleyen sınırlamalar hâlâ mevcuttur.
Yüksek Lisans'ı girdi ve ara işlem olarak kullanma
İşlev çağıran LLM'lerin başka bir kullanım durumu, girdi ve ara veri işlemedir. LLM'ler, yapısal olmayan girdileri, aşağı yöndeki işlemlerde kullanılabilecek yapılandırılmış verilere ayrıştırmak için kullanılabilir. Bu görevlerin birçoğu "geleneksel" NLP teknolojilerine indirgenme eğilimindeyken, dönüştürücü tabanlı modellerin esnek doğası, özel olarak eğitilmiş bir modelin bu görevlerde diğer NLP teknolojilerinden çok daha iyi performans gösterebileceği anlamına gelir. Sonuç olarak, birçok geliştirici bu özel modellerden veri hatlarında yararlanmaya çalışıyor.
Artık işlev çağırmanın ardındaki teoriye aşina olduğumuza göre, bugün oluşturacağımız uygulamaya bakalım.
Önceki bir makalede , CB Insights popüler bülteniyle ilgili doğal dil sorularını yanıtlamak için basit bir RAG uygulaması oluşturdum. Bugünkü makalemizde benzer bir soru yanıtlama uygulaması oluşturacağız ancak yerleşik arama ve GPT3.5'e güvenmek yerine birincil indeksleme yöntemi olarak varlık tanımayı kullanacağız. Ek olarak, özetleme motoru olarak DRAGON'u kullanacağız, böylece tüm uygulamayı dizüstü bilgisayarımızda çalıştırabiliriz, bulut hizmetlerine gerek yoktur.
Varlık Tanıma'yı Neden Kullanmalısınız?
Uygulamaya geçmeden önce, aramayı gömmek yerine erişim teknolojisi olarak NER kullanmanın avantajlarını inceleyelim. Üretimde her tekniği özel durumun taleplerine göre kullanmak isteyeceğiz, NER gömülü aramayı temel alan bir sisteme göre çeşitli avantajlar sunuyor.
Hata ayıklanabilirlik: Varlık tanıma kolayca doğrulanabilir bir görev olduğundan, tüm işlem hattında çok daha fazla hata ayıklanabilir. Modelin tüm varlıkları doğru şekilde tanımlayıp tanımlamadığını kontrol etmek kolaydır ve bu varlıklara dayalı bir eşleştirme algoritması oluşturmak ve geliştirmek kolaydır. Karşılaştırmalı olarak, yerleştirme algoritmasının pasajlardaki benzerlikleri ve farklılıkları doğru şekilde tanımladığını doğrulamak çok daha zordur.
Esneklik: Tanıma ve filtrelemeyi ayırarak boru hattını yerleştirme tabanlı arama algoritmasından çok daha esnek hale getiriyoruz. Ek meta veriler ekleyebilir, varlık türüne göre arama algoritmalarını değiştirebilir ve hatta NER tabanlı arama sonuçlarının üzerine yerleştirme algoritmaları kullanabiliriz. Bu, teknoloji kombinasyonlarına dayalı olarak çok daha güçlü özelliklerin geliştirilmesine olanak tanır.
Örneğin, NER tabanlı bir işlem hattı, bir dizi belgeyi daraltmak için varlık tabanlı aramayı kullanabilir, ardından arama alanını daha da daraltmak için bir yerleştirme algoritması kullanabilir. Bu, aramanın çok daha hızlı ve daha verimli olmasını sağlar.
Tanımlama Gücü: Mümkün olan manuel kontrol seviyesi nedeniyle, NER boru hatları belirli arama ve bulma görevleri için çok daha uygundur. Gömme aramaları, iki belgenin aynı büyük belgeden gelme olasılığını hesaplayan eğitim verileri içindeki pasajların yakınlığına dayanır. Bazı kullanım durumlarında bu, gömülü aramanın önemli belgeleri kaçırmasına neden olur.
Artık bir RAG işlem hattında NER kullanmanın avantajlarını anladığımıza göre, uygulamamızda kullandığımız belirli teknolojilere daha derinlemesine bakalım.
LLM Varlık Tanıma
Varlık Tanıma, yapılandırılmamış dil verilerinden yapılandırılmış verileri çıkarmaya yönelik "geleneksel" bir NLP teknolojisidir. Çıkarılan veriler daha sonra alt işlemde veya analiz edilen pasajın meta verileri olarak kullanılabilir.
Geçmişte bu, öncelikle konuşmanın bölümlerini etiketleyen, ardından tanımlanan özel isimlerin adlandırılmış varlıklar olup olmadığını belirleyen ikinci bir geçişin takip ettiği küçük, amaca yönelik olarak oluşturulmuş makine öğrenimi algoritmaları kullanılarak gerçekleştirildi.
İşlev çağıran LLM'lerle aynı görevi birkaç ek avantajla gerçekleştirebiliriz.
Dönüştürücü mimarisi, dil yapısını daha küçük NLP modellerine göre daha iyi anlayabildiğinden, örneğin pasajın yanlış biçimlendirildiği durumlarda performansın daha sağlam olması muhtemeldir.
LLM'ler en son eğitim verileriyle güncellendiğinden, varlık tanıma sisteminin diğer açık kaynaklı varlık tanıma modellerine göre daha güncel kalması muhtemeldir.
Ek verileri gömmek ve ek talimatlar vermek için hızlı mühendislik teknikleri kullanılabilir, böylece kullanıma hazır modellerde bile daha esnek davranışlara olanak sağlanır.
DRAGON Dragon'un doğal dil verilerini özetlemedeki etkileyici performansını vurguladığımız önceki bir makalede ele almıştık. Seçilen varlıklarla ilgili tüm makaleleri özetleyeceğimiz analizin son adımını gerçekleştirmek için Dragon'u kullanacağız.
SLIM'ler SLIM'ler, LLMWare'in minyatürleştirilmiş, yerel olarak çalıştırılabilir modellerinden oluşan yeni bir ailedir - onların minyatürleştirme çalışmalarının hayranı olduğum bir sır değil - işlev çağırma konusunda uzmanlaşmıştır. Bu modellerde, makineler tarafından yorumlanabilecek çıktılar oluşturmak üzere özel olarak ince ayar yapılmıştır; böylece kullanıcılar, harici API'lere ihtiyaç duymadan işlev çağırma mimarisindeki en son gelişmelerden yararlanabilirler.
Bugün haber bülteni yazılarında Adlandırılmış Varlık Tanıma işlemini gerçekleştirecek SLIMs-NER modelini kullanacağız. NER'e ek olarak duygu analizi, SQL oluşturma ve çok adımlı aracılar için SLIM modelleri de mevcuttur.
Artık teknolojiyi anladık, uygulamayı hayata geçirelim!
CB Insights makalelerini indirerek başlayalım. Bağımlılıkları içe aktaralım:
import requests from bs4 import BeautifulSoup import os import pandas as pd import json import re
Ve şimdi haber bülteni arşivini indirme kodu:
res = requests.get('https://www.cbinsights.com/newsletter/') soup = BeautifulSoup(res.text) article_links = [[i.text, i['href']] for i in soup.find_all('a') if 'campaign-archive' in i['href'] ] article_soups = [BeautifulSoup(requests.get(link).text) for title, link in article_links]
Artık bülten arşivini indirdiğimize göre JSON formatına işleyelim
result_json = {} for soup_meta, soup_art in zip(article_links, article_soups): article_tables = [] cur_article = [] for table in soup_art.find_all('table'): if table.attrs.get('mc:variant') == 'Section_Divider': article_tables.append(get_deduped_article_tables(cur_article)) cur_article = [] else: cur_article.append(table.text) article_tables.append(get_deduped_article_tables(cur_article)) result_json[soup_meta[0]] = article_tables articles_with_meta = [] for name, tables in result_json.items(): print(name, pd.to_datetime(tables[0][1].strip())) articles_with_meta.append({ 'name': name, 'date': pd.to_datetime(tables[0][1].strip()).strftime('%Y-%m-%d'), 'tables': tables }) df = pd.DataFrame(articles_with_meta)
Şimdi bir önceki yazıda bulunduğumuz yerdeyiz. Ancak yerleştirmeler oluşturarak doğrudan RAG yapısına gitmek yerine varlık tanıma adımını çalıştıracağız.
İlk olarak, LLMWare'den makinemizde yerel olarak varlık tanıma işlemi yapmamıza olanak tanıyan yeni bir model seti olan SLIM'leri çalıştırmaya yönelik bağımlılıkları içe aktaralım:
from llmware.agents import LLMfx from llmware.parsers import WikiParser from collections import defaultdict # define a function for identifying all the named entities def run_ner(text): agent = LLMfx() agent.load_work(text) agent.load_tool("ner") named_entities = agent.ner() ner_dict= named_entities["llm_response"] return ner_dict
Artık adlandırılmış varlık tanımayı tüm makalelerde çalıştırabiliriz:
date_entities = defaultdict(dict) for _, row in df.iterrows(): for idx, t in enumerate(row['tables'][1:]): if 'Start Your Free Trial' in t: t = t[:t.index('Start Your Free Trial')] date_entities[row['date']][idx] = run_ner('\n'.join(t))
NER boru hattının tamamlanması birkaç dakika sürebilir, ancak son teknoloji ürünü minyatürleştirilmiş bir LLM kullanarak varlıkları tanımak için ihtiyacınız olan tek şey budur.
Bazı test öğelerini yazdırarak date_entities sözlüğünü kontrol edebilirsiniz. Örneğin, kod:
date_entities[list(date_entities.keys())[0]]
Aşağıdaki çıktıyı üretmelidir:
{0: {'people': ['Yahoo!'], 'place': [], 'company': ['Databricks', 'MosaicML'], 'misc': []}, 1: {'people': [], 'place': ['New York'], 'company': ['CB Insights'], 'misc': []}}
Bu, SLIM modeli tarafından tespit edilen çeşitli varlıkların tümünü gösterir.
Artık varlıklar tespit edildiğine göre, bu tekniğin gücünü gösteren bir soru yanıtlama iş akışı oluşturalım. Örneğimiz için şu test sorusunu kullanacağız: OpenAI, Microsoft'un yapay zeka stratejisinde nasıl bir rol oynuyor?
DRAGON'u çalıştırmak için uygun paketleri içe aktararak başlayalım:
from llmware.prompts import Prompt query = "What role does OpenAI play in Microsoft's AI strategy?" model_name = "llmware/dragon-llama-7b-gguf" prompter = Prompt().load_model(model_name)
Artık varlık tanımayı kullanarak soruyu yanıtlayan fonksiyonu oluşturabiliriz. NER verilerimizden yararlanmak için aşağıdaki iş akışını uygulamak isteyeceğiz:
İş akışı kod biçiminde şöyle görünür:
def answer_question_with_ner(query): ner_results = run_ner(query) # run NER on the user query search_entities = [] for ent_type, ent_list in ner_results.items(): search_entities.extend(ent_list) # create a list of entities to search for search_entities = list(set(search_entities)) # now perform a lookup for articles that mention the identified entities, using set arithmetic. articles = set(entity_to_place_map[search_entities[0]]) for se in search_entities: articles &= set(entity_to_place_map[se]) # now process the corpus into a prompt and feed it to the question-answering LLM. article_content = [] for article in articles: article_content.extend(df[df['date'] == article[0]].iloc[0]['tables'][article[1]+1]) response = prompter.prompt_main(query, context='\n'.join(article_content), prompt_name="default_with_context", temperature=0.3) return response # return the response.
İlk kod bloğundaki sorguyla işlevi çalıştırın; aşağıdaki sonucu görmelisiniz:
Microsoft has poured billions of dollars into ChatGPT developer OpenAI. However, it's also placed a number of bets on other GenAI startups across computing, mapping, and gaming.
Yanıt nesnesinin "kanıt" bölümünde, aslında CB Insights arşivinden Microsoft ve OpenAI'den bahseden iki makalenin alındığını ve LLM'nin cevabının doğrudan kanıtlara dayandığını da görebilirsiniz.
Açık varlık tanıma işlemi yaptığımız için alma sürecinin son derece şeffaf ve hata ayıklanabilir olduğunu unutmayın. Modelin bu belirli bilgi parçalarını derlemden neden aldığına dair bir soru ortaya çıkarsa, modelin makaleyi sorguda "Microsoft" ve "OpenAI" den bahsettiği için seçtiğini görmek için tek yapmanız gereken basit bir yazdırma ifadesidir. Alınan iki haber bülteni bölümü, her iki varlıktan bahseden tek bölümlerdir.
Ayrıca gömme tabanlı vektör aramayla karşılaştırıldığında NER arama yöntemi çok daha kesin yanıtlar sağlar. Testlerimde, seçilen makaleler OpenAI'nin ada algoritmasına göre sıralanan en alakalı 10 makale arasındaydı, ancak eldeki soruya en yakın olduğu belirlenen makaleler değildi. Bu nedenle, gömme aramayı kullanan bir uygulamanın soruyu hiç doğru bir şekilde yanıtlamamış olması mümkündür ve hata ayıklama özelliğinin olmaması yalnızca karışıklığa katkıda bulunacaktır.
Ve bununla birlikte, NER aramalarını kullanarak bir soru yanıtlama uygulaması geliştirdik ve bu süreçte işlem hattının kalitesini artırdık!
Bugün, heyecan verici yeni bir LLM özelliği olan işlev çağırmayı kullanarak bir uygulama geliştirdik. Minyatürleştirilmiş, yerel olarak çalıştırılabilir işlev çağıran modeller, yeni bir yapay zeka uygulamaları sınıfının kilidini açan devrim niteliğinde bir gelişmedir ve biz bu teknolojilerin yalnızca ilk yinelemesini görüyoruz. Önümüzdeki aylarda geliştiricilerin bu teknolojilerle hangi uygulamaları yaratacaklarını görmek heyecan verici olacak.
Yapay zeka alanında hayata geçirilmesini istediğiniz bir fikriniz varsa veya yalnızca teknoloji hakkında sohbet etmek istiyorsanız lütfen Github veya LinkedIn üzerinden iletişime geçmekten çekinmeyin.
SLIM'lerin ve DRAGON'un arkasındaki şirket olan LLMWare hakkında daha fazla bilgi edinmek istiyorsanız bunları HugginFace veya Github'da bulabilirsiniz.