Chatterstack adalah cara yang sangat sederhana dan intuitif untuk menangani variabel "percakapan" yang digunakan oleh ChatGPT API, sekaligus memberi Anda fungsionalitas tingkat lanjut.
Instal paket dari pip:
pip install chatterstack
Ada dua opsi untuk Chatterstack. Perpustakaan Dasar, dan Perpustakaan Tingkat Lanjut, yang memperluas Basis.
import chatterstack
# The base library if you are only really concerned about mananging
# the conversation variable, it's order, and maybe tracking tokens.
convo = chatterstack . Chatterstack ()
# The advanced library allows you issuing commands from the chat input,
# gives the bot the ability to reach out to you with reminders, etc
convo = chatterstack . ChatterstackAdvanced ()
API ChatGPT menggunakan variabel "percakapan" untuk melacak interaksi Anda dengan bot. Ini adalah daftar kamus, dengan masing-masing kamus mewakili suatu perubahan dalam percakapan.
Hal ini membuat program Anda dipenuhi dengan hal-hal seperti ini:
# append the bot's response to your conversation
conversation . append ({ 'role' : response . choices [ 0 ]. message . role , 'content' : response . choices [ 0 ]. message . content })
# to print the last message
print ( conversation [ - 1 ][ "content" ])
Konyol.
Jika Anda ingin melakukan sesuatu yang lebih canggih, seperti "jaga variabel percakapan maksimal 8 pesan", atau "jadikan pesan Sistem selalu menjadi pesan terbaru dalam percakapan"... baiklah, saya akan memberi Anda cuplikan kode untuk itu.
Karena banyak aspek dari kamus ini sangat mudah diprediksi, dan kita sering kali hanya melakukan beberapa tugas dasar dengan kamus tersebut...
...ini berarti kita dapat mengabstraksikan sebagian besar kekacauan ini, dengan cara yang membuatnya jauh lebih intuitif untuk digunakan - sekaligus menjaga pada dasarnya semua fleksibilitas yang melekat! Itu adalah hal yang jarang bisa dilakukan.
Ini adalah program chatbot yang berfungsi penuh menggunakan chatterstack:
import chatterstack
import os
os . environ [ 'OPENAI_API_KEY' ] = 'your_api_key_here'
convo = chatterstack . Chatterstack ()
while True :
convo . user_input ()
convo . send_to_bot ()
convo . print_last_message ()
Itu semuanya!
Seperti inilah tampilan percakapan di terminal:
USER: hey, can you help me with something?
ASSISTANT: Sure! What would you like help with?
USER: I need to know if France has a President or a Prime Minister
ASSISTANT: France has both a President and a Prime Minister, which [... bot goes on]
Perpustakaan ini dibangun agar intuitif dan fleksibel , sehingga Anda dapat dengan mudah mengubah perilaku atau tampilan, dalam banyak cara, apa pun yang sesuai dengan kebutuhan Anda. Berikut beberapa contoh dasar, tetap berada di terminal untuk saat ini:
while True :
# Change the user's display name
convo . user_input ( prefix = "ME: " )
# change any of the API arguments
convo . send_to_bot ( model = "gpt-4" , temperature = 1 , max_tokens = 40 )
# change the line spacing of the convo
convo . print_last_message ( prefix = "GPT: " , lines_before = 0 , lines_after = 2 )
# and let's have it print the total tokens after each turn
print ( convo . tokens_total_all )
Sekarang percakapan Anda menggunakan GPT-4, dan percakapan terlihat seperti ini, dengan jumlah token:
ME: hey, can you help me with something?
GPT: Of course! I'm here to help. Please let me know what you need assistance with, and I'll do my best to help you.
28
ME: I need to know if France has a President or a Prime Minister
GPT: France has both a President and a Prime Minister. The President of France is [...bot goes on]
87
Terdapat informasi selengkapnya tentang default saat ini dan berbagai metode untuk mengubahnya di bawah di bagian tentang pengiriman pesan ke API
Metode user_input()
sama dengan metode python input()
, hanya saja metode ini juga secara otomatis menambahkan input pengguna sebagai dict yang diformat dengan benar ke variabel percakapan Anda.
convo . user_input ()
Seperti yang terlihat di atas, metode ini secara default meminta pengguna dengan "USER:", tetapi Anda dapat mengubahnya ke apa pun yang Anda inginkan
convo . user_input ( "Ask the bot: " )
Ask the bot:
Mungkin Anda tidak menggunakan terminal.
Atau mungkin Anda ingin mengubah input sebelum menambahkannya.
Ada beberapa cara untuk mengambil variabel string apa pun dan menambahkannya ke percakapan sebagai dict yang diformat dengan benar:
# Use the .add() method. Pass it the role, then the content
convo . add ( "user" , message_string )
# or, use the role-specific methods & just pass the content
convo . add_user ( message_string )
convo . add_assistant ( "I'm a manually added assistant response" )
convo . add_system ( "SYSTEM INSTRUCTIONS - you are a helpful assistant who responds only in JSON" )
Ada juga .insert() jika Anda ingin menambahkan pesan pada indeks tertentu, alih-alih menambahkannya ke akhir percakapan:
# Here's the format
convo . insert ( index , role , content )
# example
convo . insert ( 4 , "system" , "IMPORTANT: Remember to not apologize to the user so much" )
Metode chatterstack "send_to_bot" adalah panggilan API OpenAI standar, tetapi lebih mudah digunakan dan melakukan banyak hal berguna untuk Anda di latar belakang. Sebut saja seperti ini:
convo . send_to_bot ()
Itu saja!
Ini akan meneruskan semua nilai default untuk Anda, serta menambahkan respons ke percakapan Anda. Itu juga membuat jumlah token untuk Anda (dan di kelas lanjutan, lebih banyak lagi).
Secara default, chatterstack menggunakan nilai berikut:
model = "gpt-3.5-turbo" ,
temperature = 0.8 ,
top_p = 1 ,
frequency_penalty = 0 ,
presence_penalty = 0 ,
max_tokens = 200
Ada beberapa cara untuk mengubahnya. Pilih yang paling nyaman bagi Anda.
Cara yang paling jelas adalah dengan menjadikannya sebagai argumen saat Anda melakukan panggilan. Misalnya, jika Anda menginginkan token GPT-4 dan maksimal 800:
convo . send_to_bot ( model = "gpt-4" , max_tokens = 800 )
Pendekatan ini sangat bagus bila Anda hanya ingin melakukan satu panggilan dengan beberapa nilai berbeda.
Namun jika Anda menginginkan nilai yang berbeda untuk keseluruhan percakapan, Anda dapat mendefinisikannya dalam huruf kapital di bagian atas file Anda, dan menginisialisasi chatterstack menggunakan dict globals()
, seperti ini:
MODEL = "gpt-4"
TEMPERATURE = 0.6
FREQUENCY_PENALTY = 1.25
MAX_TOKENS = 500
# initialize with 'globals()'
convo = chatterstack . Chatterstack ( user_defaults = globals ())
# and now you can just call it like this again
convo . send_to_bot ()
Terakhir, jika Anda hanya ingin menggunakan panggilan boilerplate OpenAI, Anda masih bisa melakukannya! Berikan saja atribut .list di Chatterstack Anda, yang merupakan daftar kamus mentah:
response = openai . ChatCompletion . create (
model = "gpt-3.5-turbo" ,
messages = convo . list , # <--- right here
temperature = 0.9 ,
top_p = 1 ,
frequency_penalty = 0 ,
presence_penalty = 0 ,
max_tokens = 200 ,
)
Sangat Sederhana:
# Print the "content" of the last message
convo . print_last_message ()
Atau, jika Anda ingin melakukan pemformatan pada string terlebih dahulu...
# This represents/is the content string of the last message
convo . last_message
# So you can do stuff like this:
message_in_caps = convo . last_message . upper ()
# print the message in all upper case
print ( message_in_caps )
oh ya. Kami melacak token.
# See the tokens used on the last API call
self . last_call_prompt_tokens
self . last_call_full_context_prompt_tokens
self . last_call_completion_tokens
self . last_call_tokens_all
# At any time, check the totals for the whole conversation so far
self . prompt_tokens_total
self . assistant_tokens_total
self . tokens_total_all
Berbagai metode tersedia untuk memanipulasi urutan percakapan, berikut beberapa di antaranya:
# Insert message at a specified index
convo . insert ( index , role , content )
# Remove N messages from the end of the list
convo . remove_from_end ( count )
# Remove N messages from the start of the list
convo . remove_from_start ( count )
Namun yang lebih penting adalah metode kontrol menyeluruh atas pesan sistem.
Pesan sistem biasanya digunakan sebagai petunjuk, dan seringkali akan membantu jika petunjuk tersebut muncul lebih "baru" dalam percakapan. Artinya melacak dan memindahkan pesan ini, tanpa mengganggu pesan lainnya.
# move your system message to be the most recent message in convo
convo . move_system_to_end ()
# or second to last, etc
convo . move_system_to_end ( minus = 1 )
Dan favorit pribadi saya - pada dasarnya alasan saya menulis seluruh perpustakaan ini -
convo . set_system_lock_index ( - 1 )
Meneruskannya nilai positif ke fungsi ini akan mengunci pesan sistem ke indeks. Setiap kali pesan ditambahkan, dihapus, atau disusun ulang, pesan sistem akan dipastikan tetap pada posisi tersebut (atau sedekat mungkin dengannya).
Meneruskannya dengan nilai negatif akan mengunci pesan sistem Anda ke indeks yang dihitung dari akhir percakapan (contoh di atas akan menjadikannya pesan kedua dari terakhir dalam percakapan).
CATATAN: Saat ini, metode ini mengasumsikan bahwa Anda hanya memiliki satu pesan sistem
Cetak versi percakapan Anda yang telah diformat (bagus untuk debugging)
convo . print_formatted_conversation
Secara default, cetakannya seperti ini:
System: You are a helpful assistant.
User: hi!
Assistant: Hi! How can I help you?
lihat statistik keseluruhan percakapan Anda.
convo . summary ()
SUMMARY:
{'total_messages': 2, 'prompt_tokens': 200, 'assistant_tokens': 78, 'total_tokens': 278}
Kelas Chatterstack Advanced memperluas kelas dasar, dan memiliki lebih banyak fungsi bawaan. Itu juga mudah diperluas.
Peringatan : Perubahan terkini pada model tampaknya telah merusak fungsi ini. Ini mungkin berhasil atau mungkin tidak ketika Anda mencobanya. Kemungkinan besar harus ditulis ulang agar dapat menggunakan pemanggilan fungsi agar berfungsi kembali secara konsisten
Anda sekarang dapat memberi tahu bot "ingatkan saya untuk membuang sampah pada jam 8 malam", atau "ingatkan saya untuk membuang sampah dalam satu jam"
USER: hey, can you remind me to take the garbage out in an hour
ASSISTANT: Sure! I'll send you a reminder in an hour.
USER:
{...time passes...}
ASSISTANT: Hey! Just a quick reminder to take the garbage out!
Bot dapat melacak sebanyak mungkin pengingat yang ingin Anda keluarkan.
Keluarkan perintah dari input pengguna:
# saves the conversation to a txt file
USER: [save]
# quit the program
USER: [quit]
Secara default Anda mengeluarkan perintah dengan menggunakan [
dan ]
sebagai pembatas. Namun Anda dapat mengubahnya sesuai keinginan Anda:
convo.open_command = "{{"
convo.close_command = "}}"
Anda juga dapat memanggil sendiri metode apa pun (atau menyetel atribut apa pun) dari kelas chatterstack itu sendiri, langsung dari antarmuka obrolan:
# if you want to see what is currently in the conversation history
USER: [print_formatted_conversation]
# or how many tokens you have used so far
USER: [print_total_tokens]
# you can even pass arguments to commands
USER: [set_system_lock_index(-2)]
Jadi, meskipun contoh program obrolan awal di awal repo ini mungkin tampak sederhana pada awalnya, Anda dapat melihat bahwa itulah yang Anda perlukan, karena hampir semua fungsi yang Anda inginkan sebenarnya dapat dipanggil dari dalam obrolan itu sendiri.
Jika Anda ingin menulis perintah Anda sendiri, chatterstack menyediakan kelas antarmuka sederhana untuk melakukannya, yang disebut ICommand
.
class ICommand :
def execute ( self ):
pass
Pada dasarnya, Anda menulis perintah Anda sebagai sebuah kelas, yang mewarisi dari kelas ICommand
, dan memiliki metode "eksekusi" (yang sebenarnya Anda inginkan terjadi ketika perintah Anda dipanggil.)
Berikut ini contohnya:
class ExampleCommand ( ICommand ):
def execute ( self ):
print ( "An example command that prints this statement right here." )
Jika perintah Anda memerlukan argumen, Anda juga dapat menambahkan metode __init__
, dan meneruskannya *args
persis seperti ini:
class ExampleCommand ( ICommand ):
def __init__ ( self , * args ):
self . args = args
def execute ( self ):
print ( "Example command that print this statement with this extra stuff:" , self . args )
Hal terakhir yang perlu Anda lakukan adalah menetapkan kata atau frasa pemicu pada perintah Anda dengan menambahkannya ke metode init di kelas ChatterstackAdvanced.
class ChatterstackAdvanced ( Chatterstack ):
def __init__ ( self , ...)
# ...Lots of other code here...
# This command is already in the class:
self . command_handler . register_command ( 'save' , SaveConversationCommand ( self ))
# Add your new command
self . command_handler . register_command ( "example" , ExampleCommand )
Saat ini ada Chatterstack versi Javascript, tetapi saya belum menyediakannya karena saya juga tidak tahu Javascript, dan saya tidak begitu yakin dengan keandalannya. Jika Anda mengetahui Javascript dan ingin membantu, beri tahu saya!