Seni Desain Cepat: Batas Cepat dan Penyembuhan Token
Ini (ditulis bersama dengan Marco Tulio Ribeiro ) adalah bagian 2 dari seri seni desain cepat (bagian 1 di sini ), di mana kita berbicara tentang mengendalikan model bahasa besar (LLM) dengan guidance
.
Dalam posting ini, kita akan membahas bagaimana metode tokenization rakus yang digunakan oleh model bahasa dapat memperkenalkan bias yang halus dan kuat ke dalam permintaan Anda, yang mengarah ke generasi yang membingungkan.
Model bahasa tidak dilatih pada teks mentah, melainkan pada token, yang merupakan potongan teks yang sering terjadi bersamaan, mirip dengan kata-kata. Ini berdampak pada bagaimana model bahasa 'melihat' teks, termasuk prompt (karena prompt hanyalah kumpulan token). Model gaya GPT menggunakan metode tokenisasi seperti Byte Pair Encoding (BPE), yang memetakan semua byte masukan ke id token dengan cara serakah. Ini bagus untuk pelatihan, tetapi dapat menyebabkan masalah halus selama inferensi, seperti yang ditunjukkan pada contoh di bawah ini.
Contoh masalah batas cepat
Pertimbangkan contoh berikut, di mana kami mencoba membuat string URL HTTP:
import guidance
# we use StableLM as an example, but these issues impact all models to varying degrees
guidance.llm = guidance.llms.Transformers("stabilityai/stablelm-base-alpha-3b", device=0)
# we turn token healing off so that guidance acts like a normal prompting library
program = guidance('The link is <a href="http:{{gen max_tokens=10 token_healing=False}}')
program()
Notebook output.
guidance('The link is <a href="http{{gen max_tokens=10 token_healing=False}}')()
print_tokens(guidance.llm.encode('The link is <a href="http:'))
print_tokens(guidance.llm.encode('The link is <a href="http://www.google.com/search?q'))
Sementara URL dalam pelatihan dikodekan dengan token 1358 ( ://
), permintaan kami membuat LLM melihat token 27
( :
) sebagai gantinya, yang menyebabkan penyelesaian dengan pemisahan artifisial ://
.
Bahkan, model dapat cukup yakin bahwa melihat token 27
( :
) berarti apa yang terjadi selanjutnya sangat tidak mungkin menjadi apa pun yang dapat dikodekan bersama dengan titik dua menggunakan "token yang lebih panjang" seperti ://
, karena dalam data pelatihan model karakter tersebut akan telah dikodekan bersama dengan titik dua (pengecualian untuk ini yang akan kita bahas nanti adalah regularisasi subword selama pelatihan). Fakta bahwa melihat token berarti melihat penyematan token itu dan juga bahwa apa pun yang terjadi selanjutnya tidak dikompresi oleh tokenizer yang tamak mudah untuk dilupakan, tetapi penting dalam batasan yang cepat.
Mari telusuri representasi string dari semua token dalam kosa kata model, untuk melihat mana yang dimulai dengan titik dua:
print_tokens(guidance.llm.prefix_matches(":"))
print_tokens(guidance.llm.prefix_matches("http"))
# Accidentally adding a space, will lead to weird generation
guidance('I read a book about {{gen max_tokens=5 token_healing=False temperature=0}}')()
# No space, works as expected
guidance('I read a book about{{gen max_tokens=5 token_healing=False temperature=0}}')()
guidance('An example ["like this"] and another example [{{gen max_tokens=10 token_healing=False}}')()
print_tokens(guidance.llm.prefix_matches(" ["))
Memperbaiki bias yang tidak diinginkan dengan "penyembuhan token"
Apa yang dapat kita lakukan untuk menghindari bias yang tidak diinginkan ini? Salah satu opsinya adalah selalu mengakhiri permintaan kami dengan token yang tidak dapat diperpanjang menjadi token yang lebih panjang (misalnya tag peran untuk model berbasis obrolan), tetapi ini adalah batasan yang parah.
Alih-alih, guidance
memiliki fitur yang disebut "penyembuhan token", yang secara otomatis mencadangkan proses pembuatan dengan satu token sebelum prompt berakhir, lalu membatasi token pertama yang dibuat agar memiliki awalan yang cocok dengan token terakhir di prompt. Dalam contoh URL kami, ini berarti menghapus :
, dan memaksa pembuatan token pertama untuk memiliki :
awalan. Penyembuhan token memungkinkan pengguna untuk mengekspresikan prompt sesuka mereka, tanpa mengkhawatirkan batasan token.
Misalnya, mari jalankan kembali beberapa contoh URL di atas dengan penyembuhan token diaktifkan (diaktifkan secara default untuk model Transformer, jadi kami menghapus token_healing=False
):
# With token healing we generate valid URLs,
# even when the prompt ends with a colon:
guidance('The link is <a href="http:{{gen max_tokens=10}}')()
# With token healing, we will sometimes generate https URLs,
# even when the prompt ends with "http":
program = guidance('''The link is <a href="http{{gen 'completions' max_tokens=10 n=10 temperature=1}}''')
program()["completions"]
# Accidentally adding a space will not impact generation
program = guidance('''I read a book about {{gen max_tokens=5 temperature=0}}''')
program()
# This will generate the same text as above
program = guidance('''I read a book about{{gen max_tokens=6 temperature=0}}''')
program()
guidance('An example ["like this"] and another example [{{gen max_tokens=10}}')()
Jika Anda terbiasa dengan bagaimana model bahasa dilatih, Anda mungkin bertanya-tanya bagaimana regularisasi subkata cocok dengan semua ini. Regularisasi subkata adalah teknik di mana selama pelatihan, tokenisasi suboptimal diperkenalkan secara acak untuk meningkatkan ketahanan model. Ini berarti bahwa model tidak selalu melihat tokenisasi serakah terbaik. Regularisasi subword sangat bagus dalam membantu model menjadi lebih kuat terhadap batasan token, tetapi tidak sepenuhnya menghilangkan bias yang dimiliki model terhadap tokenisasi rakus standar. Ini berarti bahwa meskipun bergantung pada jumlah regularisasi subkata selama pelatihan, model mungkin menunjukkan bias batas token yang lebih banyak atau lebih sedikit, semua model masih memiliki bias ini. Dan seperti yang ditunjukkan di atas, itu masih dapat memiliki dampak yang kuat dan tidak terduga pada keluaran model.
Kesimpulan
Saat Anda menulis prompt, ingatlah bahwa serakah tokenization dapat berdampak signifikan pada bagaimana model bahasa menginterpretasikan prompt Anda, terutama ketika prompt diakhiri dengan token yang dapat diperpanjang menjadi token yang lebih panjang. Sumber bias yang mudah dilewatkan ini dapat memengaruhi hasil Anda dengan cara yang mengejutkan dan tidak disengaja.
Untuk mengatasinya, akhiri permintaan Anda dengan token yang tidak dapat diperpanjang, atau gunakan sesuatu seperti guidance
fitur "penyembuhan token" sehingga Anda dapat mengekspresikan permintaan Anda sesuka Anda, tanpa mengkhawatirkan artefak batas token.
Untuk mereproduksi sendiri hasil di artikel ini, periksa versi notebook .