Prompt Design의 예술: Prompt Boundaries 및 Token Healing

May 09 2023
이 문서(Marco Tulio Ribeiro와 공동으로 작성)는 프롬프트 디자인 기술(여기서는 1부)에 대한 시리즈의 2부로, 안내를 통해 대규모 언어 모델(LLM)을 제어하는 ​​방법에 대해 설명합니다. 이 게시물에서는 언어 모델에서 사용하는 탐욕스러운 토큰화 방법이 프롬프트에 미묘하고 강력한 편향을 도입하여 수수께끼 세대로 이어지는 방법에 대해 논의할 것입니다.
모든 이미지는 원본 창작물입니다.

이 문서( Marco Tulio Ribeiro 와 공동으로 작성)는 신속한 설계 기술 ( 여기서는 1부 )에 대한 시리즈의 2부로 , guidance.

이 게시물에서는 언어 모델에서 사용하는 탐욕스러운 토큰화 방법이 프롬프트에 미묘하고 강력한 편향을 도입하여 수수께끼 세대로 이어지는 방법에 대해 논의할 것입니다.

언어 모델은 원시 텍스트가 아니라 단어와 유사하게 함께 자주 발생하는 텍스트 덩어리인 토큰에 대해 학습됩니다. 이것은 프롬프트를 포함하여 언어 모델이 텍스트를 '보는' 방법에 영향을 미칩니다(프롬프트는 단지 토큰 세트이기 때문에). GPT 스타일 모델은 BPE( 바이트 쌍 인코딩 )와 같은 토큰화 방법을 활용하여 모든 입력 바이트를 탐욕적인 방식으로 토큰 ID에 매핑합니다. 이는 학습에는 적합하지만 아래 예와 같이 추론 중에 미묘한 문제가 발생할 수 있습니다.

프롬프트 경계 문제의 예

HTTP URL 문자열을 생성하려는 다음 예를 고려하십시오.

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

      
                

훈련의 URL은 토큰 1358( )로 인코딩되지만 ://프롬프트는 LLM이 대신 토큰 27( )을 보게 하여 .:://

사실, 모델은 토큰 27( )을 보는 것이 다음에 오는 것이 와 같은 "더 긴 토큰"을 사용하여 콜론 :과 함께 인코딩될 수 있는 것이 아닐 가능성이 매우 낮다는 것을 의미한다고 꽤 확신할 수 있습니다. ://콜론과 함께 인코딩되었습니다(나중에 논의할 예외는 훈련 중 하위 단어 정규화입니다). 토큰을 보는 것은 해당 토큰의 포함을 보는 것과 다음 에 오는 모든 것이 탐욕스러운 토크나이저에 의해 압축되지 않는다는 사실을 잊기 쉽지만 프롬프트 경계에서 중요합니다.

콜론으로 시작하는 항목을 확인하기 위해 모델의 어휘에 있는 모든 토큰의 문자열 표현을 검색해 보겠습니다.

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(" ["))

      
                

"토큰 치유"로 의도하지 않은 편견 수정

이러한 의도하지 않은 편견을 피하기 위해 무엇을 할 수 있습니까? 한 가지 옵션은 더 긴 토큰(예: 채팅 기반 모델의 역할 태그)으로 확장할 수 없는 토큰으로 항상 프롬프트를 종료하는 것이지만 이는 심각한 제한 사항입니다.

대신 guidance프롬프트가 끝나기 전에 하나의 토큰으로 생성 프로세스를 자동으로 백업한 다음 생성된 첫 번째 토큰이 프롬프트의 마지막 토큰과 일치하는 접두사를 갖도록 제한하는 "토큰 치유"라는 기능이 있습니다. URL 예에서 이는 을 제거 :하고 첫 번째 토큰 생성에 접두어가 있음을 의미합니다 :. 토큰 치유를 통해 사용자는 토큰 경계에 대한 걱정 없이 원하는 대로 프롬프트를 표현할 수 있습니다.

예를 들어 토큰 복구를 켠 상태에서 위의 URL 예제 중 일부를 다시 실행해 보겠습니다(Transformer 모델의 경우 기본적으로 켜져 있으므로 제거함 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}}')()

      
                

언어 모델이 어떻게 훈련되는지 잘 알고 있다면 하위 단어 정규화가 이 모든 것에 어떻게 적용되는지 궁금할 것입니다. 하위 단어 정규화는 교육 중에 최적이 아닌 토큰화가 무작위로 도입되어 모델의 견고성을 높이는 기술입니다. 이것은 모델이 항상 최선의 탐욕스러운 토큰화를 보지 않는다는 것을 의미합니다. 하위 단어 정규화는 모델이 토큰 경계에 대해 보다 강력해지도록 돕는 데 탁월하지만 모델이 표준 탐욕스러운 토큰화에 대한 편향을 완전히 제거하지는 않습니다. 즉, 교육 모델 중 하위 단어 정규화의 양에 따라 토큰 경계 편향이 다소 나타날 수 있지만 모든 모델에는 여전히 이러한 편향이 있습니다. 그리고 위에 표시된 것처럼 여전히 모델 출력에 강력하고 예상치 못한 영향을 미칠 수 있습니다.

결론

프롬프트를 작성할 때 특히 프롬프트가 더 긴 토큰으로 확장될 수 있는 토큰으로 끝나는 경우 탐욕스러운 토큰화가 언어 모델이 프롬프트를 해석하는 방식에 상당한 영향을 미칠 수 있음을 기억하십시오. 이 놓치기 쉬운 편향 소스는 놀랍고 의도하지 않은 방식으로 결과에 영향을 미칠 수 있습니다.

이 문제를 해결하려면 확장 불가능한 토큰으로 프롬프트를 종료하거나 의 guidance"토큰 치유" 기능과 같은 것을 사용하여 토큰 경계 아티팩트에 대해 걱정하지 않고 원하는 대로 프롬프트를 표현할 수 있습니다.

이 기사의 결과를 직접 재현하려면 노트북 버전을 확인하십시오.