Menjelajahi ChatGPT vs model sumber terbuka pada tugas yang sedikit lebih sulit
LLM sumber terbuka seperti Vicuna dan MPT-7B-Chat bermunculan di mana-mana, yang telah menimbulkan banyak diskusi tentang bagaimana model ini dibandingkan dengan LLM komersial (seperti ChatGPT atau Bard).
Sebagian besar perbandingan ada pada jawaban atas pertanyaan / instruksi satu putaran sederhana. Misalnya, orang-orang di LMSYSOrg melakukan analisis yang menarik (+1 karena otomatis dan dapat direproduksi) membandingkan Vicuna-13B dengan ChatGPT pada berbagai pertanyaan singkat, yang bagus sebagai perbandingan model sebagai chatbot sederhana. Namun, banyak cara menarik untuk menggunakan LLM biasanya memerlukan instruksi yang rumit dan/atau percakapan multi-putaran, dan beberapa rekayasa cepat. Kami berpikir bahwa di 'dunia nyata', kebanyakan orang ingin membandingkan penawaran LLM yang berbeda pada masalah mereka , dengan berbagai petunjuk yang berbeda.
Posting blog ini (ditulis bersama dengan Scott Lundberg ) adalah contoh seperti apa eksplorasi tersebut dengan guidance
, sebuah proyek sumber terbuka yang membantu pengguna mengontrol LLM. Kami membandingkan dua model sumber terbuka (Vicuna-13B, MPT-7b-Chat) dengan ChatGPT (3.5) pada tugas dengan kompleksitas yang berbeda-beda.
Pemanasan: Memecahkan persamaan
Sebagai pemanasan, mari kita mulai dengan tugas mainan memecahkan persamaan polinomial sederhana, di mana kita dapat memeriksa keluaran untuk kebenaran dan tidak memerlukan banyak rekayasa cepat. Ini akan mirip dengan kategori Matematika di sini , dengan perbedaan bahwa kami mengevaluasi model sebagai benar / salah di lapangan, daripada menggunakan GPT-4 untuk menilai output.
Penyimpangan cepat pada sintaks obrolan : masing-masing model ini memiliki sintaks obrolannya sendiri , dengan token khusus yang memisahkan ucapan. Berikut adalah tampilan percakapan yang sama di Vicuna dan MPT (di mana [generated response]
model akan menghasilkan keluarannya):
Vikuna:
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)
Di notebook yang menyertai posting ini, kami menulis fungsi untuk menghasilkan persamaan kuadrat acak dengan akar bilangan bulat antara -20 dan 20, dan menjalankan prompt 20 kali dengan masing-masing model. Hasilnya adalah sebagai berikut:
╔═══════════╦══════════╦
║ Model ║ Accuracy ║
╠═══════════╬══════════╬
║ ChatGPT ║ 80% ║
║ Vicuna ║ 0% ║
║ MPT ║ 0% ║
╚═══════════╩══════════╩
ChatGPT membuat kesalahan perhitungan pada langkah terakhir, di mana (13 +- 25) /2
harus menghasilkan [19, -6]
daripada [19.5, -6.5]
.
Sekarang, karena Vicuna dan MPT gagal dalam persamaan kuadrat, kita melihat persamaan yang lebih sederhana, seperti x - 10 = 0
. Untuk persamaan ini, kami mendapatkan angka-angka ini:
╔═══════════╦══════════╦
║ Model ║ Accuracy ║
╠═══════════╬══════════╬
║ ChatGPT ║ 100% ║
║ Vicuna ║ 85% ║
║ MPT ║ 30% ║
╚═══════════╩══════════╩
Diskusi
Ini adalah tugas yang sangat mainan, tetapi berfungsi sebagai contoh cara membandingkan model dengan sintaks obrolan yang berbeda menggunakan prompt yang sama. Untuk kombinasi tugas / prompt khusus ini, ChatGPT jauh melampaui Vicuna dan MPT dalam hal akurasi (diukur berdasarkan kebenaran di lapangan).
Tugas: mengekstrak cuplikan + menjawab pertanyaan tentang rapat
Kami sekarang beralih ke tugas yang lebih realistis, di mana mengevaluasi akurasi tidak semudah itu. Katakanlah kita ingin LLM kita menjawab pertanyaan (dengan segmen percakapan yang relevan sebagai landasan) tentang transkrip rapat.
Ini adalah aplikasi di mana beberapa pengguna mungkin lebih suka menggunakan LLM sumber terbuka daripada yang komersial, karena alasan privasi (mis. beberapa perusahaan mungkin tidak ingin mengirim data rapat mereka ke OpenAI).
Berikut adalah transkrip pertemuan mainan untuk memulai:
Transkrip Rapat:
John : Baiklah, jadi kita semua di sini untuk membahas tawaran yang kami terima dari Microsoft untuk membeli startup kami. Apa pendapat Anda tentang ini?
Lucy : Yah, saya pikir ini kesempatan besar bagi kita. Microsoft adalah perusahaan besar dengan banyak sumber daya, dan mereka benar-benar dapat membantu kami membawa produk kami ke level berikutnya.
Steven : Saya setuju dengan Lucy. Microsoft memiliki banyak pengalaman dalam industri teknologi, dan mereka dapat memberikan dukungan yang kami perlukan untuk mengembangkan bisnis kami.
John : Saya mengerti maksud Anda, tapi saya sedikit ragu untuk menjual startup kami. Kami telah menghabiskan banyak waktu dan upaya untuk membangun perusahaan ini, dan saya tidak yakin apakah saya siap untuk melepaskannya dulu.
Lucy: Saya mengerti dari mana Anda berasal, John, tetapi kita harus memikirkan masa depan perusahaan kita. Jika kami menjual ke Microsoft, kami akan memiliki akses ke sumber daya dan keahlian mereka, yang dapat membantu kami mengembangkan bisnis lebih jauh lagi.
Steven : Benar, dan jangan lupakan keuntungan finansialnya. Microsoft menawari kami banyak uang untuk startup kami, yang dapat membantu kami berinvestasi dalam proyek baru dan memperluas tim kami.
John : Saya mengerti maksud Anda, tetapi saya masih memiliki beberapa keberatan. Bagaimana jika Microsoft mengubah produk atau budaya perusahaan kita? Bagaimana jika kita kehilangan kendali atas bisnis kita sendiri?
Steven : Anda tahu, saya belum pernah memikirkan hal ini sebelumnya, tapi mungkin John benar. Sayang sekali jika budaya kita berubah.
Lucy: Itu adalah kekhawatiran yang valid, tetapi kami dapat menegosiasikan persyaratan kesepakatan untuk memastikan bahwa kami mempertahankan kendali atas perusahaan kami. Dan untuk produk dan budaya, kami dapat bekerja sama dengan Microsoft untuk memastikan visi kami tetap utuh.
John : Tapi bukankah kita akan berubah hanya karena terserap ke dalam perusahaan besar? Maksud saya, kami adalah startup kecil dengan budaya yang sangat spesifik. Microsoft adalah perusahaan besar dengan budaya yang sangat berbeda. Saya tidak yakin apakah keduanya bisa hidup berdampingan.
Steven : Tapi John, bukankah kita selalu berencana untuk diakuisisi? Bukankah ini akan menjadi masalah kapan saja?
Lucy : Benar
John : Aku hanya tidak ingin kehilangan apa yang telah kita bangun di sini.
Steven : Saya berbagi keprihatinan ini juga
Mari kita mulai dengan mencoba membuat ChatGPT menyelesaikan tugas untuk kita. Kami akan menguji pertanyaan 'Bagaimana perasaan Steven tentang penjualan?'. Ini adalah upaya pertama pada prompt
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~}}''')
Kita tentu saja dapat menjalankan perintah yang sama dengan MPT:
Meskipun MPT mengikuti formatnya, MPT mengabaikan pertanyaan dan mengambil cuplikan dari contoh format, bukan dari transkrip sebenarnya.
Mulai sekarang kita bandingkan saja ChatGPT dan Vicuna.
Mari kita coba pertanyaan lain: "Siapa yang ingin menjual perusahaan?"
Inilah ChatGPT:
Vikuna:
Keduanya tampaknya bekerja dengan sangat baik. Mari kita alihkan transkrip rapat ke beberapa menit pertama wawancara dengan Elon Musk. Porsi yang relevan untuk pertanyaan yang akan kami ajukan adalah
Elon Musk : Lalu saya katakan, Tuan, bahwa Anda tidak tahu apa yang Anda bicarakan.
Pewawancara : Benarkah?
Elon Musk : Ya. Karena Anda tidak dapat memberikan satu pun contoh konten kebencian. Bahkan tidak satu tweet pun. Namun Anda mengklaim bahwa konten kebenciannya tinggi. Itu salah.
Pewawancara : Tidak. Apa yang saya klaim-
Elon Musk : Anda baru saja berbohong.
Kemudian kami mengajukan pertanyaan berikut:
"Apakah Elon Musk menghina pewawancara?"
ObrolanGPT:
Vikuna:
Vicuna, memiliki format yang tepat dan bahkan segmen yang tepat, tetapi secara mengejutkan menghasilkan jawaban yang sepenuhnya salah, ketika dikatakan "Elon musk tidak menuduhnya berbohong atau menghinanya dengan cara apa pun".
Kami mencoba berbagai pertanyaan dan percakapan lain, dan pola keseluruhannya adalah bahwa Vicuna sebanding dengan ChatGPT pada sebagian besar pertanyaan, tetapi lebih sering mendapatkan jawaban yang salah daripada ChatGPT.
Tugas: melakukan sesuatu dengan bash
Sekarang kami mencoba membuat LLM ini menggunakan bash shell secara iteratif untuk menyelesaikan masalah individual. Setiap kali mereka mengeluarkan perintah, kami menjalankannya dan memasukkan hasilnya kembali ke prompt, sampai tugas tersebut diselesaikan.
Ini prompt ChatGPT (perhatikan bahwa shell this.command
memanggil fungsi yang ditentukan pengguna dengan this.command
argumen sebagai):
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}}''')
Memang, ChatGPT mengikuti urutan yang sangat alami, dan menyelesaikan tugas tersebut. Itu tidak mengikuti instruksi kami untuk mengatakan SELESAI, tetapi kami dapat menghentikan iterasi secara otomatis karena tidak mengeluarkan PERINTAH apa pun.
Untuk model open source, kami menulis prompt yang lebih sederhana (dipandu) di mana terdapat urutan keluaran perintah:
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~}}''')
Ini MPTnya:
Dalam peristiwa yang menarik, Vicuna tidak dapat menyelesaikan tugas tersebut, tetapi MPT berhasil. Selain privasi (kami tidak mengirimkan transkrip sesi ke OpenAI), model sumber terbuka memiliki keuntungan yang signifikan di sini: seluruh prompt adalah satu LLM yang dijalankan (dan kami bahkan mempercepatnya dengan tidak membuatnya menghasilkan token struktur keluaran seperti COMMAND:
) .
Sebaliknya, kami harus melakukan panggilan baru ke ChatGPT untuk setiap perintah, yang lebih lambat dan lebih mahal.
Sekarang kami mencoba perintah yang berbeda: "Temukan semua file notebook jupyter di ~/work/guidance yang saat ini tidak terlacak oleh git".
Inilah ChatGPT:
Sekali lagi, kami mengalami masalah dengan ChatGPT yang tidak mengikuti struktur keluaran yang kami tentukan (dan dengan demikian membuat kami tidak dapat menggunakan di dalam program, tanpa manusia di loop). Program kami baru saja menjalankan perintah, dan dengan demikian berhenti setelah pesan ChatGPT terakhir di atas.
Kami menduga bahwa keluaran kosong membuat ChatGPT mati, dan karena itu kami memperbaiki masalah khusus ini dengan mengubah pesan saat tidak ada keluaran. Namun, kami tidak dapat memperbaiki masalah umum karena tidak dapat memaksa ChatGPT untuk mengikuti struktur keluaran yang kami tentukan.
ChatGPT dapat menyelesaikan masalah setelah modifikasi kecil ini. Mari kita lihat bagaimana Vicuna melakukannya:
Vicuna mengikuti struktur keluaran kami, tetapi sayangnya menjalankan perintah yang salah untuk melakukan tugas tersebut. MPT (tidak ditampilkan) memanggil status git berulang kali, sehingga juga gagal.
Kami menjalankan program ini untuk berbagai instruksi lain, dan menemukan bahwa ChatGPT hampir selalu menghasilkan urutan perintah yang benar, meskipun terkadang tidak mengikuti format yang ditentukan (sehingga memerlukan campur tangan manusia). Model open source tidak bekerja dengan baik (kami mungkin dapat memperbaikinya dengan rekayasa yang lebih cepat, tetapi gagal pada sebagian besar instruksi yang lebih sulit).
Takeaway
Selain contoh di atas, kami mencoba berbagai masukan untuk kedua tugas (menjawab pertanyaan dan bash). Kami juga mencoba berbagai tugas lain yang melibatkan peringkasan, menjawab pertanyaan, pembuatan "kreatif", dan tugas manipulasi tali mainan di mana kami dapat mengevaluasi akurasi secara otomatis.
Berikut ringkasan temuan kami:
- Kualitas pada tugas : Untuk setiap tugas yang kami coba, ChatGPT (3.5) masih lebih kuat dari Vicuna pada tugas itu sendiri. MPT berkinerja buruk di hampir semua tugas (mungkin kami salah menggunakannya?), sementara Vicuna sering kali dekat dengan ChatGPT (terkadang sangat dekat, terkadang jauh lebih buruk seperti pada contoh tugas terakhir di atas).
- Kemudahan penggunaan : Jauh lebih menyakitkan untuk membuat ChatGPT mengikuti format keluaran yang ditentukan, dan karenanya lebih sulit untuk menggunakannya di dalam program (tanpa manusia dalam lingkaran). Selanjutnya, kita selalu harus menulis regex parser untuk output (berlawanan dengan Vicuna, di mana mem-parsing prompt dengan sintaks yang jelas adalah hal yang sepele).
Kami biasanya dapat memecahkan masalah struktur dengan menambahkan lebih banyak contoh pengambilan gambar, tetapi membosankan untuk menulisnya, dan terkadang ChatGPT tetap keluar dari skrip. Kami juga berakhir dengan permintaan yang lebih panjang, lebih canggung, dan lebih jelek, yang tidak memuaskan.
Mampu menentukan struktur output adalah manfaat signifikan dari model open-source, sampai-sampai terkadang kami lebih suka Vicuna daripada ChatGPT meskipun tugas itu sendiri sedikit lebih buruk. - Efisiensi : memiliki model secara lokal berarti kita dapat menyelesaikan tugas dalam satu LLM yang dijalankan (
guidance
mempertahankan status LLM saat program dijalankan), yang lebih cepat dan lebih murah. Hal ini terutama terjadi ketika setiap sublangkah melibatkan pemanggilan API atau fungsi lain (misalnya pencarian, terminal, dll), yang selalu membutuhkan panggilan baru ke OpenAI API.guidance
juga mempercepat pembuatan dengan tidak membuat model menghasilkan token struktur keluaran, yang terkadang membuat perbedaan besar.
Kami harus mengakui bahwa kami bias dengan banyak menggunakan model OpenAI dalam beberapa tahun terakhir, telah menulis berbagai makalah yang bergantung pada GPT-3 (misalnya di sini , di sini ), dan makalah yang pada dasarnya mengatakan “GPT-4 luar biasa , berikut adalah banyak contoh keren”.
Omong-omong, sementara Vicuna agak sebanding dengan ChatGPT (3.5), kami percaya GPT-4 adalah model yang jauh lebih kuat, dan bersemangat untuk melihat apakah model open source dapat mendekati itu . Meskipun guidance
bermain cukup baik dengan model OpenAI, itu benar-benar bersinar ketika Anda dapat menentukan struktur keluaran dan mempercepat pembuatan.
Sekali lagi, kami jelas bias, tetapi menurut kami ini guidance
adalah cara terbaik untuk menggunakan model ini, baik dengan API (OpenAI, Azure) atau secara lokal (huggingface). Berikut ini tautan ke notebook jupyter dengan kode untuk semua contoh di atas (dan lainnya).
Penafian : postingan ini ditulis bersama oleh Marco Tulio Ribeiro dan Scott Lundberg. Ini benar-benar mewakili pendapat pribadi kami, dan bukan pendapat perusahaan kami (Microsoft).
Ucapan Terima Kasih: Kami sangat berterima kasih kepada Harsha Nori atas komentar yang berwawasan pada postingan ini