สำรวจ ChatGPT กับโมเดลโอเพ่นซอร์สในงานที่ยากขึ้นเล็กน้อย

May 13 2023
LLM แบบโอเพ่นซอร์สเช่น Vicuna และ MPT-7B-Chat กำลังปรากฏอยู่ทั่วทุกแห่ง ซึ่งนำไปสู่การอภิปรายอย่างมากว่าโมเดลเหล่านี้เปรียบเทียบกับ LLM เชิงพาณิชย์ (เช่น ChatGPT หรือ Bard) อย่างไร การเปรียบเทียบส่วนใหญ่เป็นคำตอบสำหรับคำถาม/คำแนะนำแบบเทิร์นเดียวง่ายๆ
ภาพทั้งหมดสร้างโดย Marco และ Scott

LLM แบบโอเพ่นซอร์สเช่นVicunaและMPT-7B-Chatกำลังปรากฏอยู่ทั่วทุกแห่ง ซึ่งนำไปสู่การอภิปราย อย่างมาก ว่าโมเดลเหล่านี้เปรียบเทียบกับ LLM เชิงพาณิชย์ (เช่น ChatGPT หรือ Bard) อย่างไร

การเปรียบเทียบส่วนใหญ่เป็นคำตอบสำหรับคำถาม/คำแนะนำแบบเทิร์นเดียวง่ายๆ ตัวอย่างเช่น พนักงานที่LMSYSOrgทำการวิเคราะห์ที่น่าสนใจ (+1 สำหรับการทำงานอัตโนมัติและทำซ้ำได้) เปรียบเทียบ Vicuna-13B กับ ChatGPT กับคำถามสั้นๆ ต่างๆ ซึ่งดีมากเมื่อเปรียบเทียบโมเดลต่างๆ เป็นแชทบอทง่ายๆ อย่างไรก็ตาม วิธีที่น่าสนใจมากมายในการใช้ LLM มักต้องการคำแนะนำที่ซับซ้อนและ/หรือการสนทนาแบบหลายขั้นตอน และวิศวกรรมที่ทันท่วงที เราคิดว่าใน 'โลกแห่งความจริง' คนส่วนใหญ่ต้องการเปรียบเทียบข้อเสนอ LLM ต่างๆ กับ ปัญหา ของพวกเขาด้วยคำแนะนำที่หลากหลาย

บล็อกโพสต์นี้ (เขียนร่วมกับScott Lundberg ) เป็นตัวอย่างของลักษณะการสำรวจดังกล่าวด้วยguidanceโครงการโอเพ่นซอร์สที่ช่วยให้ผู้ใช้ควบคุม LLM เราเปรียบเทียบโอเพ่นซอร์สสองรุ่น (Vicuna-13B, MPT-7b-Chat) กับ ChatGPT (3.5) ในงานที่มีความซับซ้อนต่างกัน

อุ่นเครื่อง: การแก้สมการ

โดยวิธีวอร์มอัพ เรามาเริ่มกันที่งานของเล่นในการแก้สมการพหุนามอย่างง่าย ซึ่งเราสามารถตรวจสอบผลลัพธ์เพื่อความถูกต้องและไม่ควรต้องมีวิศวกรรมที่รวดเร็วมากนัก ซึ่งจะคล้ายกับหมวดคณิตศาสตร์ในที่นี่โดยมีข้อแตกต่างที่เราประเมินแบบจำลองว่าถูกต้อง/ไม่ถูกต้องบนพื้นฐานความจริง แทนที่จะใช้ GPT-4 เพื่อให้คะแนนผลลัพธ์

การพูดนอกเรื่องอย่างรวดเร็วเกี่ยวกับไวยากรณ์การแชท : แต่ละรุ่นเหล่านี้มี ไวยากรณ์การแชทของตัวเองโดยมีโทเค็นพิเศษที่แยกคำพูด ต่อไปนี้คือลักษณะของการสนทนาเดียวกันใน Vicuna และ MPT (ซึ่ง[generated response]โมเดลจะสร้างเอาต์พุตได้ที่ไหน):

วิคูนา:

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)

      
                

ในสมุดบันทึกที่มาพร้อมกับโพสต์นี้ เราเขียนฟังก์ชันเพื่อสร้างสมการกำลังสองแบบสุ่มที่มีรากจำนวนเต็มระหว่าง -20 ถึง 20 และเรียกใช้พรอมต์ 20 ครั้งกับแต่ละรุ่น ผลลัพธ์ที่ได้มีดังนี้:

╔═══════════╦══════════╦
║   Model   ║ Accuracy ║     
╠═══════════╬══════════╬
║ ChatGPT   ║   80%    ║
║ Vicuna    ║    0%    ║ 
║ MPT       ║    0%    ║
╚═══════════╩══════════╩

ChatGPT ทำให้การคำนวณผิดพลาดในขั้นตอนสุดท้าย ซึ่ง(13 +- 25) /2ควรให้ผลลัพธ์[19, -6]มากกว่า[19.5, -6.5]. ตอนนี้ เนื่องจาก Vicuna และ MPT ล้มเหลวในสมการกำลัง สอง
เราจึงดูสมการที่ง่ายกว่า เช่น x - 10 = 0สำหรับสมการเหล่านี้ เราจะได้ตัวเลขเหล่านี้:

╔═══════════╦══════════╦
║   Model   ║ Accuracy ║     
╠═══════════╬══════════╬
║ ChatGPT   ║   100%   ║
║ Vicuna    ║    85%   ║ 
║ MPT       ║    30%   ║
╚═══════════╩══════════╩

การอภิปราย

นี่เป็นงานเล่นๆ แต่ทำหน้าที่เป็นตัวอย่างในการเปรียบเทียบโมเดลที่มีไวยากรณ์การแชทที่แตกต่างกันโดยใช้พรอมต์เดียวกัน สำหรับงานเฉพาะนี้ / การผสมผสานคำสั่ง ChatGPT เหนือกว่า Vicuna และ MPT ในแง่ของความแม่นยำ (วัดจากความจริงพื้นฐาน)

งาน: แยกตัวอย่าง + ตอบคำถามเกี่ยวกับการประชุม

ตอนนี้เราเปลี่ยนเป็นงานที่สมจริงมากขึ้น โดยที่การประเมินความแม่นยำนั้นไม่ตรงไปตรงมา สมมติว่าเราต้องการให้ LLM ตอบคำถาม (ด้วยส่วนการสนทนาที่เกี่ยวข้องสำหรับการลงดิน) เกี่ยวกับทรานสคริปต์การประชุม
นี่คือแอปพลิเคชันที่ผู้ใช้บางรายอาจต้องการใช้ LLM แบบโอเพนซอร์สมากกว่าแบบเชิงพาณิชย์ ด้วยเหตุผลด้านความเป็นส่วนตัว (เช่น บางบริษัทอาจไม่ต้องการส่งข้อมูลการประชุมไปยัง OpenAI)

นี่คือบันทึกการประชุมของเล่นที่จะเริ่มต้นด้วย:

บันทึกการประชุม:
จอห์น
: เอาล่ะ เราทุกคนมาที่นี่เพื่อหารือเกี่ยวกับข้อเสนอที่เราได้รับจาก Microsoft เพื่อซื้อการเริ่มต้นของเรา คุณคิดอย่างไรกับเรื่องนี้
ลูซี่ : อืม ฉันคิดว่ามันเป็นโอกาสที่ดีสำหรับเรา Microsoft เป็นบริษัทขนาดใหญ่ที่มีทรัพยากรมากมาย และพวกเขาสามารถช่วยให้เรายกระดับผลิตภัณฑ์ของเราไปอีกขั้นได้
Steven : ฉันเห็นด้วยกับลูซี่ Microsoft มีประสบการณ์มากมายในอุตสาหกรรมเทคโนโลยี และพวกเขาสามารถให้การสนับสนุนที่จำเป็นต่อการขยายธุรกิจของเรา
จอห์น : ฉันเข้าใจประเด็นของคุณ แต่ฉันลังเลเล็กน้อยเกี่ยวกับการขายสตาร์ทอัพของเรา เราทุ่มเทเวลาและความพยายามอย่างมากในการสร้างบริษัทนี้ และฉันยังไม่แน่ใจว่าจะพร้อมหรือยังที่จะปล่อยมันไป
ลูซี่: ฉันเข้าใจว่าคุณมาจากไหน จอห์น แต่เราต้องคิดถึงอนาคตของบริษัทของเรา หากเราขายให้กับ Microsoft เราจะสามารถเข้าถึงทรัพยากรและความเชี่ยวชาญของพวกเขา ซึ่งจะช่วยให้เราเติบโตทางธุรกิจมากยิ่งขึ้น
Steven : ใช่ และอย่าลืมผลประโยชน์ทางการเงินด้วย Microsoft เสนอเงินจำนวนมากให้กับการเริ่มต้นของเรา ซึ่งอาจช่วยให้เราลงทุนในโครงการใหม่และขยายทีมของเราได้
จอห์น : ฉันเข้าใจประเด็นของคุณ แต่ฉันยังมีข้อสงวนอยู่บ้าง จะเกิดอะไรขึ้นหาก Microsoft เปลี่ยนแปลงผลิตภัณฑ์หรือวัฒนธรรมบริษัทของเรา จะเป็นอย่างไรหากเราสูญเสียการควบคุมธุรกิจของเราเอง
Steven : คุณรู้อะไรไหม ฉันไม่เคยคิดเรื่องนี้มาก่อน แต่บางที John อาจจะพูดถูก คงจะน่าเสียดายหากวัฒนธรรมของเราเปลี่ยนไป
ลูซี่: สิ่งเหล่านี้เป็นข้อกังวลที่ถูกต้อง แต่เราสามารถเจรจาเงื่อนไขของข้อตกลงเพื่อให้แน่ใจว่าเราสามารถควบคุมบริษัทของเราได้บางส่วน และสำหรับผลิตภัณฑ์และวัฒนธรรม เราสามารถทำงานร่วมกับ Microsoft เพื่อให้แน่ใจว่าวิสัยทัศน์ของเรายังคงเหมือนเดิม
จอห์น : แต่เราจะไม่เปลี่ยนเพราะถูกดูดกลืนเข้าไปในบริษัทใหญ่หรอกหรือ? ฉันหมายถึง เราเป็นสตาร์ทอัพเล็กๆ ที่มีวัฒนธรรมที่เฉพาะเจาะจงมาก Microsoft เป็นบริษัทขนาดใหญ่ที่มีวัฒนธรรมที่แตกต่างกันมาก ฉันไม่แน่ใจว่าทั้งสองสามารถอยู่ร่วมกันได้หรือไม่
Steven : แต่ John เราไม่ได้วางแผนที่จะซื้อกิจการเสมอไปเหรอ? นี้จะไม่เป็นปัญหาทุกครั้ง?
ลูซี่ : ใช่
จอห์น : ฉันแค่ไม่อยากเสียสิ่งที่เราสร้างที่นี่ไป
Steven : ฉันแบ่งปันข้อกังวลนี้ด้วย

เริ่มต้นด้วยการพยายามรับ ChatGPT เพื่อแก้ปัญหาให้เรา เราจะทดสอบด้วยคำถาม 'Steven รู้สึกอย่างไรเกี่ยวกับการขาย' นี่คือความพยายามครั้งแรกที่พรอมต์

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~}}''')

เราสามารถเรียกใช้พรอมต์เดียวกันกับ MPT ได้:

แม้ว่า MPT จะทำตามรูปแบบ แต่จะเพิกเฉยต่อคำถามและรับตัวอย่างจากตัวอย่างรูปแบบ แทนที่จะใช้การถอดเสียงจริง
จากนี้ไปเราจะเปรียบเทียบ ChatGPT และ Vicuna

ลองคำถามอื่น: "ใครอยากขายบริษัท?"

นี่คือ ChatGPT:

วิคูนา:

ทั้งสองดูเหมือนจะทำงานได้ดีจริงๆ เรามาเปลี่ยนบันทึกการประชุมเป็นช่วงสองสามนาทีแรกของการสัมภาษณ์ Elon Musk ส่วนที่เกี่ยวข้องสำหรับคำถามที่เราจะถามคือ

Elon Musk : ถ้าอย่างนั้น ผมจะบอกว่าคุณไม่รู้ว่าคุณกำลังพูดถึงอะไร
ผู้สัมภาษณ์ : จริงเหรอ?
อีลอน มัสก์ : ใช่ เพราะคุณไม่สามารถยกตัวอย่างเนื้อหาแสดงความเกลียดชังได้แม้แต่ตัวอย่างเดียว ไม่มีแม้แต่ทวีตเดียว แต่คุณยังอ้างว่ามีเนื้อหาแสดงความเกลียดชังสูง นั่นเป็นเท็จ
ผู้สัมภาษณ์ : ไม่ สิ่งที่ฉันอ้าง -
Elon Musk : คุณแค่โกหก

จากนั้นเราจะถามคำถามต่อไปนี้:
"Elon Musk ดูถูกผู้สัมภาษณ์หรือไม่"

ChatGPT:

วิคูนา:

Vicuna มีรูปแบบที่ถูกต้องและแม้แต่กลุ่มที่ถูกต้อง แต่มันสร้างคำตอบที่ผิดอย่างสิ้นเชิงอย่างน่าประหลาดใจเมื่อกล่าวว่า "Elon musk ไม่ได้กล่าวหาว่าเขาโกหกหรือดูหมิ่นเขาในทางใดทางหนึ่ง"

เราลองคำถามและการสนทนาอื่นๆ ที่หลากหลาย และรูปแบบโดยรวมคือ Vicuna เทียบได้กับ ChatGPT สำหรับคำถามส่วนใหญ่ แต่ได้คำตอบผิดบ่อยกว่า ChatGPT

งาน: ทำสิ่งต่าง ๆ ด้วย bash

ตอนนี้เราพยายามให้ LLM เหล่านี้ใช้ bash shell ซ้ำๆ เพื่อแก้ปัญหาแต่ละข้อ เมื่อใดก็ตามที่พวกเขาออกคำสั่ง เราจะเรียกใช้และใส่เอาต์พุตกลับเข้าไปในพรอมต์ จนกว่างานจะได้รับการแก้ไข

นี่คือพรอมต์ ChatGPT (สังเกตว่าshell this.commandเรียกฟังก์ชันที่ผู้ใช้กำหนดด้วย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}}''')

แท้จริงแล้ว ChatGPT ทำตามลำดับที่เป็นธรรมชาติและแก้ปัญหาได้ มันไม่ทำตามคำสั่งของเราที่บอกว่าเสร็จสิ้น แต่เราสามารถหยุดการวนซ้ำได้โดยอัตโนมัติเพราะมันไม่ได้ออกคำสั่งใดๆ

สำหรับโมเดลโอเพ่นซอร์ส เราเขียนพรอมต์ที่ง่ายกว่า (มีคำแนะนำ) ซึ่งมีลำดับของเอาต์พุตคำสั่ง:

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~}}''')

นี่คือ MPT:

ในเหตุการณ์ที่น่าสนใจ Vicuna ไม่สามารถแก้ปัญหาได้ แต่ MPT ทำสำเร็จ นอกจากความเป็นส่วนตัวแล้ว (เราไม่ได้ส่งการถอดเสียงเซสชันไปยัง OpenAI) โมเดลโอเพนซอร์สยังมีข้อได้เปรียบที่สำคัญที่นี่: พรอมต์ทั้งหมดเป็นการเรียกใช้ LLM เพียงครั้งเดียว (และเรายังเร่งความเร็วโดยไม่ให้สร้างโทเค็นโครงสร้างเอาต์พุตเช่นCOMMAND:) .
ในทางตรงกันข้าม เราต้องทำการโทรใหม่ไปยัง ChatGPT สำหรับแต่ละคำสั่ง ซึ่งช้ากว่าและมีราคาแพงกว่า

ตอนนี้เราลองใช้คำสั่งอื่น: “ค้นหาไฟล์โน้ตบุ๊ก jupyter ทั้งหมดใน ~/work/guidance ที่ git ไม่ได้ติดตามอยู่ในขณะนี้”

นี่คือ ChatGPT:

เป็นอีกครั้งที่เราประสบปัญหากับ ChatGPT ที่ไม่เป็นไปตามโครงสร้างเอาต์พุตที่เราระบุ (และทำให้เราไม่สามารถใช้งานภายในโปรแกรมได้โดยไม่มีมนุษย์อยู่ในลูป) โปรแกรมของเราเพิ่งรันคำสั่ง และหยุดหลังจากข้อความ ChatGPT ล่าสุดด้านบน

เราสงสัยว่าผลลัพธ์ที่ว่างเปล่าทำให้ ChatGPT ปิด ดังนั้นเราจึงแก้ไข ปัญหา เฉพาะ นี้ โดยการเปลี่ยนข้อความเมื่อไม่มีเอาต์พุต อย่างไรก็ตาม เราไม่สามารถแก้ไขปัญหาทั่วไปที่ไม่สามารถบังคับให้ ChatGPT ทำตามโครงสร้างเอาต์พุตที่เราระบุได้

ChatGPT สามารถแก้ปัญหาได้หลังจากการแก้ไขเล็กน้อยนี้ มาดูกันว่า Vicuna ทำอย่างไร:

Vicuna ทำตามโครงสร้างเอาต์พุตของเรา แต่น่าเสียดายที่รันคำสั่งผิดเพื่อทำงาน MPT (ไม่แสดง) เรียกสถานะคอมไพล์ซ้ำ ๆ ดังนั้นจึงล้มเหลวเช่นกัน

เราเรียกใช้โปรแกรมเหล่านี้สำหรับคำแนะนำอื่นๆ และพบว่า ChatGPT มักจะสร้างลำดับคำสั่งที่ถูกต้อง ในขณะที่บางครั้งไม่เป็นไปตามรูปแบบที่ระบุ (และด้วยเหตุนี้จึงต้องมีการแทรกแซงจากมนุษย์) โมเดลโอเพ่นซอร์สทำงานได้ไม่ดีนัก (เราอาจปรับปรุงได้ด้วยวิศวกรรมที่รวดเร็วกว่า แต่ล้มเหลวในคำแนะนำที่ยากกว่าส่วนใหญ่)

ซื้อกลับบ้าน

นอกจากตัวอย่างข้างต้นแล้ว เรายังลองใช้อินพุตที่หลากหลายสำหรับทั้งสองงาน (การตอบคำถามและทุบตี) นอกจากนี้ เรายังลองงานอื่นๆ ที่เกี่ยวข้องกับการสรุป การตอบคำถาม การสร้าง "ความคิดสร้างสรรค์" และงานการจัดการสตริงของเล่น ซึ่งเราสามารถประเมินความแม่นยำได้โดยอัตโนมัติ
นี่คือบทสรุปของการค้นพบของเรา:

  • คุณภาพในงาน : สำหรับทุกงานที่เราพยายามChatGPT (3.5) ยังคงแข็งแกร่งกว่า Vicuna ในงานนั้น MPT ทำงานได้ไม่ดีในเกือบทุกงาน (บางทีเราใช้ผิดหรือเปล่า) ในขณะที่ Vicuna มักจะใกล้เคียงกับ ChatGPT (บางครั้งก็ใกล้เคียงมาก บางครั้งก็แย่กว่านั้นมากดังตัวอย่างงานล่าสุดด้านบน)
  • ใช้งานง่าย : การทำให้ ChatGPT เป็นไปตามรูปแบบเอาต์พุตที่ระบุจะยุ่งยากกว่ามาก ดังนั้นจึงยากต่อการใช้งานภายในโปรแกรม (โดยไม่มีมนุษย์ในลูป) นอกจากนี้ เราต้องเขียน regex parsers สำหรับเอาต์พุตเสมอ (ตรงข้ามกับ Vicuna ซึ่งการแยกวิเคราะห์พรอมต์ที่มีไวยากรณ์ที่ชัดเจน นั้น เป็นเรื่องเล็กน้อย)
    โดยทั่วไป เราสามารถแก้ปัญหาโครงสร้างโดยเพิ่มตัวอย่างไม่กี่ช็อตได้ แต่การเขียนสิ่งเหล่านี้เป็นเรื่องน่าเบื่อ และบางครั้ง ChatGPT ก็ไม่อยู่ในสคริปต์อยู่ดี เรายังลงเอยด้วยการแจ้งที่ยาวขึ้น เงอะงะ และน่าเกลียดกว่าเดิมซึ่งไม่น่าพอใจ
    ความสามารถในการระบุโครงสร้างเอาต์พุตเป็นประโยชน์อย่างมากของโมเดลโอเพ่นซอร์สจนถึงจุดที่บางครั้งเราอาจชอบ Vicuna มากกว่า ChatGPT แม้ว่างานจะแย่กว่าเล็กน้อยก็ตาม
  • ประสิทธิภาพ : การมีโมเดลในเครื่องหมายความว่าเราสามารถแก้ปัญหาในการรัน LLM ครั้งเดียว ( guidanceคงสถานะ LLM ไว้ในขณะที่โปรแกรมกำลังดำเนินการ) ซึ่งเร็วกว่าและถูกกว่า โดยเฉพาะอย่างยิ่งเมื่อขั้นตอนย่อยใดๆ เกี่ยวข้องกับการเรียก API หรือฟังก์ชันอื่นๆ (เช่น การค้นหา เทอร์มินัล ฯลฯ) ซึ่งจะต้องมีการเรียกใช้ OpenAI API ใหม่เสมอ guidanceยังเร่งการสร้างโดยไม่ให้โมเดลสร้างโทเค็นโครงสร้างเอาต์พุต ซึ่งบางครั้งก็สร้างความแตกต่างอย่างมาก

เราควรยอมรับว่าเรามีความลำเอียงจากการใช้โมเดล OpenAI เป็นจำนวนมากในช่วงไม่กี่ปีที่ผ่านมา โดยได้เขียนรายงานต่างๆ ที่ขึ้นอยู่กับ GPT-3 (เช่นที่นี่ , ที่นี่ ) และบทความที่โดยพื้นฐานแล้วระบุว่า "GPT-4 ยอดเยี่ยม นี่คือตัวอย่างเจ๋ง ๆ มากมาย”
เมื่อพูดถึงเรื่องนี้ แม้ว่า Vicuna จะค่อนข้างเทียบได้กับ ChatGPT (3.5) แต่เราเชื่อว่า GPT-4 เป็น โมเดลที่แข็งแกร่งกว่า มากและรู้สึกตื่นเต้นที่จะเห็นว่าโมเดลโอเพ่นซอร์สสามารถเข้าใกล้สิ่งนั้น ได้หรือ ไม่ แม้ว่าguidanceจะเล่นกับโมเดล OpenAI ได้ค่อนข้างดี แต่ก็ดูโดดเด่นเมื่อคุณสามารถระบุโครงสร้างเอาต์พุตและเร่งการสร้างได้

ย้ำอีกครั้งว่าเรามีอคติอย่างชัดเจน แต่เราคิดว่านั่นguidanceเป็นวิธีที่ดีในการใช้โมเดลเหล่านี้ ไม่ว่าจะกับ API (OpenAI, Azure) หรือในเครื่อง (กอดกัน) นี่คือลิงค์ไปยังสมุดบันทึก jupyter พร้อมโค้ดสำหรับตัวอย่างทั้งหมดด้านบน (และอีกมากมาย)

ข้อจำกัดความรับผิดชอบ : โพสต์นี้เขียนร่วมกันโดย Marco Tulio Ribeiro และ Scott Lundberg เป็นการแสดงความคิดเห็นส่วนตัวของเราอย่างเคร่งครัด ไม่ใช่ของนายจ้างของเรา (Microsoft)

กิตติกรรมประกาศ:เราขอขอบคุณ Harsha Nori สำหรับความคิดเห็นที่ลึกซึ้งในโพสต์นี้