Biraz daha zor görevlerde ChatGPT ve açık kaynak modellerini keşfetme
Vicuna ve MPT-7B-Chat gibi açık kaynaklı LLM'ler her yerde ortaya çıkıyor ve bu, bu modellerin ticari LLM'lere (ChatGPT veya Bard gibi) kıyasla nasıl olduğu konusunda birçok tartışmaya yol açtı.
Karşılaştırmaların çoğu, tek yönlü basit soru/talimatlara verilen yanıtlar üzerinde yapılmıştır. Örneğin, LMSYSOrg'daki kişiler, çeşitli kısa sorularda Vicuna-13B ile ChatGPT'yi karşılaştıran ilginç bir analiz (otomatik ve tekrarlanabilirlik için +1) yaptı ; bu, basit sohbet robotları olarak modellerin karşılaştırılması açısından harika. Bununla birlikte, LLM'leri kullanmanın birçok ilginç yolu, tipik olarak karmaşık talimatlar ve/veya çok yönlü konuşmalar ve biraz hızlı mühendislik gerektirir. "Gerçek dünyada" çoğu insanın sorunlarına ilişkin farklı LLM tekliflerini çeşitli farklı istemlerle karşılaştırmak isteyeceğini düşünüyoruz .
Bu blog gönderisi ( Scott Lundberg ile ortaklaşa yazılmıştır ) guidance
, kullanıcıların LLM'leri kontrol etmesine yardımcı olan açık kaynaklı bir proje olan böyle bir keşfin nasıl görünebileceğinin bir örneğidir . Değişken karmaşıklıktaki görevler için iki açık kaynak modelini (Vicuna-13B, MPT-7b-Chat) ChatGPT (3.5) ile karşılaştırıyoruz.
Isınma: Denklem çözme
Isınma yoluyla, çıktının doğruluğunu kontrol edebileceğimiz ve çok hızlı mühendislik gerektirmemesi gereken basit polinom denklemlerini çözme oyuncak göreviyle başlayalım. Bu , çıktıyı derecelendirmek için GPT-4'ü kullanmak yerine modelleri temel gerçeğe göre doğru / yanlış olarak değerlendirmemiz farkıyla, buradaki Matematik kategorisine benzer olacaktır .
Sohbet sözdiziminde hızlı inceleme : Bu modellerin her birinin , ifadeleri ayıran özel belirteçlerle kendi sohbet söz dizimi vardır. Vicuna ve MPT'de aynı konuşma şu şekilde görünür ( [generated response]
modelin çıktısını nerede üreteceği):
Vicuna:
A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions.
USER: Can you please solve the following equation? x^2 + 2x + 1 = 0
ASSISTANT: [generated response] </s>
<|im_start|>system
- You are a helpful assistant chatbot trained by MosaicML.
- You answer questions.
- You are excited to be able to help the user, but will refuse to do anything that could be considered harmful to the user.
- You are more than just an information source, you are also able to write poetry, short stories, and make jokes.
<|im_end|>
<|im_start|>user Can you please solve the following equation? x^2 + 2x + 1 = 0<|im_end|>
<|im_start|>assistant [generated response]<|im_end|>
find_roots = guidance('''
{{#system~}}
{{llm.default_system_prompt}}
{{~/system}}
{{#user~}}
Please find the roots of the following equation: {{equation}}
Think step by step, find the roots, and then say:
ROOTS = [root1, root2...]
For example, if the roots are 1.3 and 2.2, say ROOTS = [1.3, 2.2].
Make sure to use real numbers, not fractions.
{{~/user}}
{{#assistant~}}
{{gen 'answer'}}
{{~/assistant~}}''')
import guidance
mpt = guidance.llms.transformers.MPTChat('mosaicml/mpt-7b-chat', device=1)
vicuna = guidance.llms.transformers.Vicuna('yourpath/vicuna-13b', device_map='auto')
chatgpt = guidance.llms.OpenAI("gpt-3.5-turbo")
equation = 'x^2 + 3.0x = 0'
roots = [0, -3]
answer_gpt = find_roots(llm=chatgpt, equation=equation)
answer_vicuna = find_roots(llm=vicuna, equation=equation)
answer_mpt = find_roots(llm=mpt, equation=equation)
Bu gönderiye eşlik eden not defterinde , -20 ile 20 arasında tamsayı kökleri olan rastgele ikinci dereceden denklemler üreten bir fonksiyon yazıyoruz ve istemi her modelle 20 kez çalıştırıyoruz. Sonuçlar aşağıdaki gibiydi:
╔═══════════╦══════════╦
║ Model ║ Accuracy ║
╠═══════════╬══════════╬
║ ChatGPT ║ 80% ║
║ Vicuna ║ 0% ║
║ MPT ║ 0% ║
╚═══════════╩══════════╩
ChatGPT son adımda bir hesaplama hatası yapıyor , (13 +- 25) /2
burada . Şimdi, Vicuna ve MPT ikinci dereceden denklemlerde başarısız olduğu için, gibi daha basit denklemlere bakıyoruz . Bu denklemler için şu sayıları alırız:[19, -6]
[19.5, -6.5]
x - 10 = 0
╔═══════════╦══════════╦
║ Model ║ Accuracy ║
╠═══════════╬══════════╬
║ ChatGPT ║ 100% ║
║ Vicuna ║ 85% ║
║ MPT ║ 30% ║
╚═══════════╩══════════╩
Tartışma
Bu çok oyuncak bir görevdi, ancak aynı istemi kullanarak farklı sohbet sözdizimine sahip modellerin nasıl karşılaştırılacağına bir örnek olarak hizmet etti. Bu özel görev / komut istemi kombinasyonu için, ChatGPT doğruluk açısından Vicuna ve MPT'yi çok geride bırakıyor (yer gerçeğine göre ölçülmüştür).
Görev: snippet'leri ayıklama + toplantılarla ilgili soruları yanıtlama
Şimdi doğruluğu değerlendirmenin o kadar basit olmadığı daha gerçekçi bir göreve dönüyoruz. Diyelim ki LLM'mizin toplantı transkriptleri hakkındaki soruları (temellendirme için ilgili konuşma bölümleriyle birlikte) yanıtlamasını istiyoruz.
Bu, bazı kullanıcıların gizlilik nedeniyle ticari olanlar yerine açık kaynaklı LLM'leri kullanmayı tercih edebileceği bir uygulamadır (örneğin, bazı şirketler toplantı verilerini OpenAI'ye göndermek istemeyebilir).
İşte başlamak için bir oyuncak toplantı dökümü:
Toplantı Metni:
John : Pekala, hepimiz Microsoft'tan girişimimizi satın almak için aldığımız teklifi tartışmak için buradayız. Bu konudaki düşünceleriniz nelerdir?
Lucy : Bence bu bizim için harika bir fırsat. Microsoft, birçok kaynağa sahip devasa bir şirkettir ve ürünümüzü bir sonraki seviyeye taşımamıza gerçekten yardımcı olabilirler.
Steven : Lucy'ye katılıyorum. Microsoft, teknoloji endüstrisinde çok fazla deneyime sahiptir ve işimizi büyütmek için ihtiyacımız olan desteği bize sağlayabilirler.
John : Ne demek istediğini anlıyorum ama girişimimizi satma konusunda biraz tereddütlüyüm. Bu şirketi kurmak için çok zaman ve çaba harcadık ve henüz onu bırakmaya hazır olup olmadığımdan emin değilim.
Lucy: Nereden geldiğini anlıyorum John ama şirketimizin geleceğini düşünmeliyiz. Microsoft'a satış yaparsak, onların kaynaklarına ve uzmanlıklarına erişebiliriz, bu da işimizi daha da büyütmemize yardımcı olabilir.
Steven : Doğru, mali faydaları da unutmayalım. Microsoft, girişimimiz için bize yeni projelere yatırım yapmamıza ve ekibimizi genişletmemize yardımcı olabilecek çok miktarda para teklif ediyor.
John : Ne demek istediğini anlıyorum ama yine de bazı çekincelerim var. Ya Microsoft ürünümüzü veya şirket kültürümüzü değiştirirse? Ya kendi işimiz üzerindeki kontrolü kaybedersek?
Steven : Biliyor musun, bunu daha önce düşünmemiştim ama belki de John haklıdır. Kültürümüz değişirse yazık olur.
Lucy: Bunlar geçerli endişeler, ancak şirketimiz üzerinde bir miktar kontrole sahip olduğumuzdan emin olmak için anlaşmanın şartlarını müzakere edebiliriz. Ürün ve kültüre gelince, vizyonumuzun hâlâ bozulmamış olduğundan emin olmak için Microsoft ile çalışabiliriz.
John : Ama sırf büyük bir şirkete çekildiğimiz için değişmeyecek miyiz? Demek istediğim, biz çok özel bir kültüre sahip küçük bir girişimiz. Microsoft, çok farklı bir kültüre sahip devasa bir şirkettir. İkisi bir arada var olabilir mi emin değilim.
Steven : Ama John, biz her zaman elde edilmeyi planlamamış mıydık? Bu her zaman sorun olmayacak mı?
Lucy : Doğru
John : Burada inşa ettiğimiz şeyi kaybetmek istemiyorum.
Steven : Ben de bu endişeyi paylaşıyorum
ChatGPT'nin görevi bizim için çözmesini sağlamaya çalışarak başlayalım. 'Steven satış konusunda ne düşünüyor?' sorusunu test edeceğiz. İşte bir bilgi isteminde ilk deneme
qa_attempt1 = guidance('''{{#system~}}
{{llm.default_system_prompt}}
{{~/system}}
{{#user~}}
You will read a meeting transcript, then extract the relevant segments to answer the following question:
Question: {{query}}
Here is a meeting transcript:
----
{{transcript}}
----
Please answer the following question:
Question: {{query}}
Extract from the transcript the most relevant segments for the answer, and then answer the question.
{{/user}}
{{#assistant~}}
{{gen 'answer'}}
{{~/assistant~}}''')
qa_attempt3 = guidance('''{{#system~}}
{{llm.default_system_prompt}}
{{~/system}}
{{#user~}}
You will read a meeting transcript, then extract the relevant segments to answer the following question:
Question: {{query}}
Here is a meeting transcript:
----
{{transcript}}
----
Based on the above, please answer the following question:
Question: {{query}}
Please extract from the transcript whichever conversation segments are most relevant for the answer, and then answer the question.
Note that conversation segments can be of any length, e.g. including multiple conversation turns.
Please extract at most 3 segments. If you need less than three segments, you can leave the rest blank.
As an example of output format, here is a fictitious answer to a question about another meeting transcript.
CONVERSATION SEGMENTS:
Segment 1: Peter and John discuss the weather.
Peter: John, how is the weather today?
John: It's raining.
Segment 2: Peter insults John
Peter: John, you are a bad person.
Segment 3: Blank
ANSWER: Peter and John discussed the weather and Peter insulted John.
{{/user}}
{{#assistant~}}
{{gen 'answer'}}
{{~/assistant~}}''')
qa_attempt5 = guidance('''{{#system~}}
{{llm.default_system_prompt}}
{{~/system}}
{{#user~}}
You will read a meeting transcript, then extract the relevant segments to answer the following question:
Question: What were the main things that happened in the meeting?
Here is a meeting transcript:
----
Peter: Hey
John: Hey
Peter: John, how is the weather today?
John: It's raining.
Peter: That's too bad. I was hoping to go for a walk later.
John: Yeah, it's a shame.
Peter: John, you are a bad person.
----
Based on the above, please answer the following question:
Question: {{query}}
Please extract from the transcript whichever conversation segments are most relevant for the answer, and then answer the question.
Note that conversation segments can be of any length, e.g. including multiple conversation turns.
Please extract at most 3 segments. If you need less than three segments, you can leave the rest blank.
{{/user}}
{{#assistant~}}
CONVERSATION SEGMENTS:
Segment 1: Peter and John discuss the weather.
Peter: John, how is the weather today?
John: It's raining.
Segment 2: Peter insults John
Peter: John, you are a bad person.
Segment 3: Blank
ANSWER: Peter and John discussed the weather and Peter insulted John.
{{~/assistant~}}
{{#user~}}
You will read a meeting transcript, then extract the relevant segments to answer the following question:
Question: {{query}}
Here is a meeting transcript:
----
{{transcript}}
----
Based on the above, please answer the following question:
Question: {{query}}
Please extract from the transcript whichever conversation segments are most relevant for the answer, and then answer the question.
Note that conversation segments can be of any length, e.g. including multiple conversation turns.
Please extract at most 3 segments. If you need less than three segments, you can leave the rest blank.
{{~/user}}
{{#assistant~}}
{{gen 'answer'}}
{{~/assistant~}}''')
qa_attempt5(llm=chatgpt, transcript=meeting_transcript, query=query1)
qa_guided = guidance('''{{#system~}}
{{llm.default_system_prompt}}
{{~/system}}
{{#user~}}
You will read a meeting transcript, then extract the relevant segments to answer the following question:
Question: {{query}}
----
{{transcript}}
----
Based on the above, please answer the following question:
Question: {{query}}
Please extract the three segment from the transcript that are the most relevant for the answer, and then answer the question.
Note that conversation segments can be of any length, e.g. including multiple conversation turns. If you need less than three segments, you can leave the rest blank.
As an example of output format, here is a fictitious answer to a question about another meeting transcript:
CONVERSATION SEGMENTS:
Segment 1: Peter and John discuss the weather.
Peter: John, how is the weather today?
John: It's raining.
Segment 2: Peter insults John
Peter: John, you are a bad person.
Segment 3: Blank
ANSWER: Peter and John discussed the weather and Peter insulted John.
{{/user}}
{{#assistant~}}
CONVERSATION SEGMENTS:
Segment 1: {{gen 'segment1'}}
Segment 2: {{gen 'segment2'}}
Segment 3: {{gen 'segment3'}}
ANSWER: {{gen 'answer'}}
{{~/assistant~}}''')
Elbette aynı istemi MPT ile çalıştırabiliriz:
MPT formatı takip ederken soruyu yok sayar ve gerçek transkript yerine format örneğinden parçalar alır.
Bundan sonra sadece ChatGPT ve Vicuna'yı karşılaştıracağız.
Başka bir soru deneyelim: "Şirketi kim satmak ister?"
İşte ChatGPT:
Vicuna:
Her ikisi de gerçekten iyi çalışıyor gibi görünüyor. Toplantı dökümünü Elon Musk ile yapılan bir röportajın ilk birkaç dakikasına geçirelim . Soracağımız soru ile ilgili kısım şu şekildedir:
Elon Musk : O zaman diyorum ki efendim, neden bahsettiğinizi bilmiyorsunuz.
Muhabir : Gerçekten mi?
Elon Musk : Evet. Çünkü nefret dolu içeriğe tek bir örnek veremezsiniz. Bir tweet bile yok. Yine de nefret dolu içeriğin yüksek olduğunu iddia ettiniz. Bu yanlış.
Muhabir : Hayır. İddia ettiğim şey-
Elon Musk : Az önce yalan söyledin.
Ardından şu soruyu soruyoruz:
“Elon Musk görüşmeciye hakaret mi ediyor?”
ChatGPT:
Vicuna:
Vicuna, doğru formata ve hatta doğru segmentlere sahip, ancak “Elon Musk onu hiçbir şekilde yalan söylemekle veya hakaret etmekle suçlamıyor” derken şaşırtıcı bir şekilde tamamen yanlış bir cevap üretiyor.
Çeşitli başka sorular ve sohbetler denedik ve genel kalıp, Vicuna'nın çoğu soruda ChatGPT ile karşılaştırılabilir olmasıydı, ancak ChatGPT'nin yaptığından daha sık yanlış yanıt aldı.
Görev: bash ile bir şeyler yapın
Şimdi, bireysel sorunları çözmek için bu LLM'lerin yinelemeli olarak bir bash kabuğu kullanmasını sağlamaya çalışıyoruz. Ne zaman bir komut verseler, onu çalıştırırız ve görev çözülene kadar çıktıyı komut istemine geri ekleriz.
İşte ChatGPT istemi ( argüman shell this.command
olarak kullanıcı tanımlı bir işlevi çağırdığına dikkat edin this.command
):
terminal = guidance('''{{#system~}}
{{llm.default_system_prompt}}
{{~/system}}
{{#user~}}
Please complete the following task:
Task: list the files in the current directory
You can give me one bash command to run at a time, using the syntax:
COMMAND: command
I will run the commands on my terminal, and paste the output back to you. Once you are done with the task, please type DONE.
{{/user}}
{{#assistant~}}
COMMAND: ls
{{~/assistant~}}
{{#user~}}
Output: guidance project
{{/user}}
{{#assistant~}}
The files or folders in the current directory are:
- guidance
- project
DONE
{{~/assistant~}}
{{#user~}}
Please complete the following task:
Task: {{task}}
You can give me one bash command to run at a time, using the syntax:
COMMAND: command
I will run the commands on my terminal, and paste the output back to you. Once you are done with the task, please type DONE.
{{/user}}
{{#geneach 'commands' stop=False}}
{{#assistant~}}
{{gen 'this.command'}}
{{~/assistant~}}
{{~#user~}}
Output: {{shell this.command)}}
{{~/user~}}
{{/geneach}}''')
Gerçekten de ChatGPT çok doğal bir sıra izler ve görevi çözer. BİTTİ deme talimatımıza uymuyor, ancak herhangi bir KOMUT vermediği için yinelemeyi otomatik olarak durdurabiliyoruz.
Açık kaynak modeller için, bir dizi komut çıktısının olduğu daha basit (kılavuzlu) bir bilgi istemi yazıyoruz:
guided_terminal = guidance('''{{#system~}}
{{llm.default_system_prompt}}
{{~/system}}
{{#user~}}
Please complete the following task:
Task: list the files in the current directory
You can run bash commands using the syntax:
COMMAND: command
OUTPUT: output
Once you are done with the task, use the COMMAND: DONE.
{{/user}}
{{#assistant~}}
COMMAND: ls
OUTPUT: guidance project
COMMAND: DONE
{{~/assistant~}}
{{#user~}}
Please complete the following task:
Task: {{task}}
You can run bash commands using the syntax:
COMMAND: command
OUTPUT: output
Once you are done with the task, use the COMMAND: DONE.
{{~/user}}
{{#assistant~}}
{{#geneach 'commands' stop=False ~}}
COMMAND: {{gen 'this.command' stop='\\n'}}
OUTPUT: {{shell this.command)}}{{~/geneach}}
{{~/assistant~}}''')
İşte MPT'dir:
İlginç bir olay dönüşünde, Vicuna görevi çözemez, ancak MPT başarılı olur. Gizliliğin yanı sıra (oturum dökümünü OpenAI'ye göndermiyoruz), açık kaynak modellerin burada önemli bir avantajı vardır: istemin tamamı tek bir LLM çalıştırmasıdır (ve hatta ) gibi çıktı yapısı belirteçlerini oluşturmayarak onu hızlandırırız .COMMAND:
. Aksine, her komut için ChatGPT'ye yeni bir çağrı
yapmamız gerekiyor , bu daha yavaş ve daha pahalı.
Şimdi farklı bir komut deniyoruz: " ~/work/guidance içindeki şu anda git tarafından izlenmeyen tüm jupyter not defteri dosyalarını bul".
İşte ChatGPT:
Bir kez daha, ChatGPT ile ilgili olarak belirtilen çıktı yapımızı takip etmeme sorunuyla karşılaşıyoruz (ve bu nedenle, döngüde bir insan olmadan bir program içinde kullanmamızı imkansız kılıyor). Programımız sadece komutları çalıştırdı ve bu nedenle yukarıdaki son ChatGPT mesajından sonra durdu.
Boş çıktının ChatGPT'yi devre dışı bıraktığından şüphelendik ve bu nedenle çıktı olmadığında mesajı değiştirerek bu sorunu çözdük . Ancak, ChatGPT'yi belirtilen çıktı yapımızı takip etmeye zorlayamama genel sorununu çözemiyoruz .
ChatGPT, bu küçük değişiklikten sonra sorunu çözmeyi başardı . Vicuna'nın nasıl yaptığını görelim:
Vicuna çıktı yapımızı takip ediyor ama ne yazık ki görevi yapmak için yanlış komutu çalıştırıyor. MPT (gösterilmemiştir) git durumunu tekrar tekrar çağırır, dolayısıyla başarısız olur.
Bu programları diğer çeşitli talimatlar için çalıştırdık ve ChatGPT'nin neredeyse her zaman doğru komut dizisini ürettiğini, ancak bazen belirtilen formatı takip etmediğini (ve dolayısıyla insan müdahalesine ihtiyaç duyduğunu) gördük. Açık kaynak modeller o kadar iyi çalışmadı (muhtemelen onları daha hızlı mühendislikle geliştirebiliriz, ancak çoğu zor talimatta başarısız oldular).
paketler
Yukarıdaki örneklere ek olarak, her iki görev için de çeşitli girdiler denedik (soru yanıtlama ve bash). Ayrıca, doğruluğu otomatik olarak değerlendirebileceğimiz özetleme, soru yanıtlama, "yaratıcı" oluşturma ve oyuncak ip manipülasyon görevlerini içeren çeşitli başka görevleri de denedik.
Bulgularımızın bir özeti:
- Görevde kalite : Denediğimiz her görev için, ChatGPT (3.5) görevin kendisinde hala Vicuna'dan daha güçlü . MPT neredeyse tüm görevlerde düşük performans gösterdi (belki de yanlış kullanıyoruz?), Vicuna ise genellikle ChatGPT'ye yakındı (bazen çok yakın, bazen yukarıdaki son örnek görevdeki gibi çok daha kötü).
- Kullanım kolaylığı : ChatGPT'nin belirli bir çıktı biçimini takip etmesini sağlamak çok daha zordur ve bu nedenle onu bir program içinde kullanmak (döngüde bir insan olmadan) daha zordur. Ayrıca, çıktı için her zaman normal ifade ayrıştırıcıları yazmamız gerekir ( açık sözdizimi ile bir istemi ayrıştırmanın önemsiz olduğu Vicuna'nın aksine ).
Yapı problemini genellikle daha az sayıda örnek ekleyerek çözebiliriz, ancak bunları yazmak sıkıcıdır ve bazen ChatGPT yine de komut dosyasının dışına çıkar. Ayrıca tatmin edici olmayan daha uzun, daha beceriksiz ve çirkin istemlerle de karşılaşıyoruz .
Çıktı yapısını belirleyebilmek, açık kaynak modellerin önemli bir avantajıdır., öyle ki bazen görevin kendisinde biraz daha kötü olsa bile Vicuna'yı ChatGPT'ye tercih edebiliriz. - Verimlilik : modele yerel olarak sahip olmak, görevleri tek bir LLM çalışmasında çözebileceğimiz anlamına gelir (
guidance
program yürütülürken LLM durumunu korur), bu daha hızlı ve daha ucuzdur. Bu, özellikle herhangi bir alt adım, her zaman OpenAI API'ye yeni bir çağrı gerektiren diğer API'leri veya işlevleri (örn. arama, terminal vb.) çağırmayı içerdiğinde doğrudur.guidance
ayrıca, modelin çıktı yapısı belirteçlerini üretmesini sağlamayarak üretimi hızlandırır ki bu bazen büyük bir fark yaratır.
Geçtiğimiz birkaç yıl içinde OpenAI modellerini çokça kullanmış, GPT-3'e bağlı çeşitli makaleler (örn. burada , burada ) yazmış ve temelde “GPT-4 harika” diyen bir makale yazmış olmamızın önyargılı olduğunu kabul etmeliyiz. , burada bir sürü harika örnek var”.
Konu açılmışken, Vicuna ChatGPT (3.5) ile biraz karşılaştırılabilir olsa da, GPT-4'ün çok daha güçlü bir model olduğuna inanıyoruz ve açık kaynaklı modellerin buna yaklaşıp yaklaşamayacağını görmekten heyecan duyuyoruz . OpenAI modelleriyle oldukça iyi çalışsa da guidance
, çıktı yapısını belirleyebildiğiniz ve üretimi hızlandırabildiğiniz zaman gerçekten parlıyor.
Yine, açıkça önyargılıyız, ancak guidance
ister API'lerle (OpenAI, Azure) ister yerel olarak (huggingface) olsun, bu modelleri kullanmanın harika bir yolu olduğunu düşünüyoruz. İşte yukarıdaki tüm örnekler (ve daha fazlası) için kod içeren jupyter not defterine bir bağlantı .
Feragatname : Bu yazı Marco Tulio Ribeiro ve Scott Lundberg tarafından ortaklaşa yazılmıştır. İşverenimizin (Microsoft) görüşlerini değil, kesinlikle kişisel görüşlerimizi temsil eder.
Teşekkür: Bu gönderiye yaptığı anlayışlı yorumlar için Harsha Nori'ye gerçekten müteşekkiriz.