Chatterstack은 ChatGPT API에서 사용되는 "대화" 변수를 처리하는 동시에 고급 기능도 제공하는 매우 간단하고 직관적인 방법입니다.
pip에서 패키지를 설치합니다.
pip install chatterstack
Chatterstack에는 두 가지 옵션이 있습니다. 기본 라이브러리와 기본을 확장하는 고급 라이브러리입니다.
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 ()
ChatGPT API는 "대화" 변수를 사용하여 봇과의 상호 작용을 추적합니다. 이는 사전 목록으로, 각 사전은 대화의 차례를 나타냅니다.
이로 인해 프로그램은 다음과 같은 것들로 가득 차게 됩니다.
# 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" ])
말도 안 되는.
"대화 변수를 최대 8개 메시지로 유지" 또는 "시스템 메시지를 항상 대화에서 가장 최근 메시지로 설정"과 같은 고급 작업을 수행하려는 경우... 음, 코드 조각을 남겨두겠습니다. 저것들.
이러한 사전의 많은 측면은 매우 예측 가능하고 우리는 대부분 사전을 사용하여 몇 가지 기본 작업만 수행하므로...
...이는 실제로 이러한 혼란을 많이 추상화하여 사용하기 훨씬 더 직관적이게 만드는 동시에 기본적으로 고유한 유연성을 모두 유지할 수 있음을 의미합니다! 그렇게 할 수 있는 일은 흔치 않습니다.
이것은 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 ()
그게 전부입니다!
터미널에서 대화는 다음과 같습니다.
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]
이 라이브러리는 직관적이고 유연하게 구축되었으므로 필요에 따라 다양한 방식으로 동작이나 모양을 쉽게 변경할 수 있습니다. 다음은 지금은 터미널에 머무르는 몇 가지 기본 예입니다.
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 )
이제 대화는 GPT-4와 이루어지며 대화는 토큰 수와 함께 다음과 같습니다.
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
현재 기본값과 기본값을 변경하는 다양한 방법에 대한 자세한 내용은 아래 API로 메시지 보내기 섹션에 나와 있습니다.
user_input()
메서드는 사용자의 입력을 대화 변수에 올바른 형식의 사전으로 자동 추가한다는 점을 제외하면 Python input()
메서드와 동일합니다.
convo . user_input ()
위에서 볼 수 있듯이 이 방법은 기본적으로 사용자에게 "USER: "를 묻는 메시지를 표시하지만 원하는 대로 변경할 수 있습니다.
convo . user_input ( "Ask the bot: " )
Ask the bot:
아마도 터미널을 사용하고 있지 않을 수도 있습니다.
아니면 입력을 추가하기 전에 어떻게든 입력을 변경하고 싶을 수도 있습니다.
문자열 변수를 가져와 올바른 형식의 사전으로 대화에 추가하는 방법에는 여러 가지가 있습니다.
# 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" )
대화 끝에 메시지를 추가하는 대신 특정 인덱스에 메시지를 추가하려는 경우 .insert()도 있습니다.
# Here's the format
convo . insert ( index , role , content )
# example
convo . insert ( 4 , "system" , "IMPORTANT: Remember to not apologize to the user so much" )
chatterstack "send_to_bot" 메서드는 표준 OpenAI API 호출이지만 사용하기가 더 간단하고 백그라운드에서 여러 가지 편리한 작업을 수행합니다. 다음과 같이 호출하세요.
convo . send_to_bot ()
그게 다야!
모든 기본값을 전달하고 대화에 응답을 추가합니다. 또한 귀하를 위해 토큰 수를 유지합니다(고급 클래스에서는 훨씬 더 많은 정보를 제공합니다).
기본적으로 chatterstack은 다음 값을 사용합니다.
model = "gpt-3.5-turbo" ,
temperature = 0.8 ,
top_p = 1 ,
frequency_penalty = 0 ,
presence_penalty = 0 ,
max_tokens = 200
이를 변경하는 방법에는 여러 가지가 있습니다. 가장 편리한 것을 선택하십시오.
가장 확실한 방법은 호출할 때 인수로 전달하는 것입니다. 예를 들어 GPT-4 및 최대 800개 토큰을 원하는 경우:
convo . send_to_bot ( model = "gpt-4" , max_tokens = 800 )
이 접근 방식은 다른 값을 사용하여 단 한 번의 호출만 수행하려는 경우에 유용합니다.
그러나 전체 대화에 대해 다른 값을 원한다는 것을 알고 있다면 파일 상단에 대문자로 값을 정의하고 다음과 같이 globals()
dict를 사용하여 chatterstack을 초기화할 수 있습니다.
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 ()
마지막으로, 상용구 OpenAI 호출만 사용하려는 경우에도 그렇게 할 수 있습니다! 사전의 원시 목록인 Chatterstack의 .list 속성을 전달하기만 하면 됩니다.
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 ,
)
매우 간단함:
# Print the "content" of the last message
convo . print_last_message ()
또는 먼저 문자열에 대한 서식을 지정하려면...
# 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 )
아 그래. 우리는 토큰을 추적하고 있습니다.
# 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
대화 순서를 조작하는 데 다양한 방법을 사용할 수 있습니다. 다음은 몇 가지입니다.
# 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 )
그러나 훨씬 더 중요한 것은 시스템 메시지를 세밀하게 제어하는 방법입니다.
시스템 메시지는 일반적으로 지침에 사용되며 대화에서 지침이 보다 "최근"에 표시되도록 하는 것이 도움이 될 수 있습니다. 이는 다른 메시지를 방해하지 않고 이 메시지를 추적하고 이동하는 것을 의미합니다.
# 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 )
그리고 제가 개인적으로 가장 좋아하는 것은 기본적으로 제가 이 전체 라이브러리를 쓴 이유입니다.
convo . set_system_lock_index ( - 1 )
이 함수에 양수 값을 전달하면 시스템 메시지가 인덱스에 고정됩니다. 메시지가 추가, 제거 또는 재정렬될 때마다 시스템 메시지가 해당 위치(또는 가능한 한 가까운 위치)에 유지됩니다.
음수 값을 전달하면 시스템 메시지가 대화 끝부터 계산되는 인덱스에 고정됩니다(위의 예에서는 대화의 마지막 메시지에서 항상 두 번째 메시지가 됩니다).
참고: 현재 이러한 방법에서는 시스템 메시지가 하나만 있다고 가정합니다.
대화 내용을 형식화된 버전으로 인쇄하세요(디버깅에 좋습니다).
convo . print_formatted_conversation
기본적으로 다음과 같이 인쇄됩니다.
System: You are a helpful assistant.
User: hi!
Assistant: Hi! How can I help you?
대화의 전반적인 통계를 확인하세요.
convo . summary ()
SUMMARY:
{'total_messages': 2, 'prompt_tokens': 200, 'assistant_tokens': 78, 'total_tokens': 278}
Chatterstack Advanced 클래스는 기본 클래스를 확장하고 훨씬 더 많은 기능이 내장되어 있습니다. 또한 쉽게 확장 가능합니다.
경고 : 최근 모델 변경으로 인해 이 기능이 손상된 것 같습니다. 시도해 보면 작동할 수도 있고 작동하지 않을 수도 있습니다. 일관되게 다시 작동하려면 함수 호출을 사용하여 다시 작성해야 할 것입니다.
이제 봇에게 "오후 8시에 쓰레기를 버리라고 알려 줘" 또는 "한 시간 후에 쓰레기를 버리라고 알려 줘"라고 말할 수 있습니다.
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!
봇은 귀하가 발행하려는 알림을 원하는 만큼 추적할 수 있습니다.
사용자 입력에서 명령을 실행합니다.
# saves the conversation to a txt file
USER: [save]
# quit the program
USER: [quit]
기본적으로 [
및 ]
구분 기호로 사용하여 명령을 실행합니다. 하지만 원하는 대로 변경할 수 있습니다.
convo.open_command = "{{"
convo.close_command = "}}"
채팅 인터페이스에서 바로 chatterstack 클래스 자체의 메서드를 자체 호출하거나 속성을 설정할 수도 있습니다.
# 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)]
따라서 이 저장소의 시작 부분에 있는 초기 채팅 프로그램 예제는 처음에는 단순해 보일 수 있지만 원하는 거의 모든 기능을 실제로 채팅 자체에서 호출할 수 있으므로 이것이 실제로 필요한 전부임을 알 수 있습니다.
자신만의 명령을 작성하려는 경우 chatterstack은 ICommand
라는 간단한 인터페이스 클래스를 제공합니다.
class ICommand :
def execute ( self ):
pass
기본적으로 ICommand
클래스에서 상속되는 클래스로 명령을 작성하고 "실행" 메서드(명령이 호출될 때 실제로 발생하려는 방법)를 갖습니다.
예는 다음과 같습니다.
class ExampleCommand ( ICommand ):
def execute ( self ):
print ( "An example command that prints this statement right here." )
명령에 인수가 필요한 경우 __init__
메서드를 추가하고 정확하게 다음과 같이 *args
전달할 수도 있습니다.
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 )
마지막으로 해야 할 일은 ChatterstackAdvanced 클래스의 init 메소드에 추가하여 명령에 트리거 단어나 문구를 할당하는 것입니다.
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 )
현재 Chatterstack의 Javascript 버전이 있지만, 저는 Javascript도 모르고 그 신뢰성에 그다지 자신이 없기 때문에 아직 사용 가능하게 만들지 않았습니다. Javascript를 알고 있고 도움을 주고 싶다면 알려주시기 바랍니다!