1. 소개
생성형 AI 제품은 비교적 새로운 제품이며 애플리케이션의 행동은 이전 형태의 소프트웨어보다 훨씬 다양할 수 있습니다. 따라서 사용 중인 머신러닝 모델을 조사하고 모델 동작의 예를 조사하며 특이사항을 조사하는 것이 중요합니다.
학습 해석 가능성 도구 (LIT, 웹사이트, GitHub)는 ML 모델을 디버깅하고 분석하여 ML 모델이 작동하는 방식과 방식을 이해하는 플랫폼입니다.
이 Codelab에서는 LIT를 사용하여 Google의 Gemma 모델을 최대한 활용하는 방법을 알아봅니다. 이 Codelab에서는 해석 가능성 기법인 시퀀스 현저성을 사용하여 다양한 프롬프트 엔지니어링 접근 방식을 분석하는 방법을 보여줍니다.
학습 목표:
- 시퀀스 특성 및 모델 분석에서의 특성 이해
- 프롬프트 출력과 시퀀스 현저성을 계산하도록 Gemma의 LIT 설정
- LM Salience 모듈을 통해 시퀀스 현저성을 사용하여 프롬프트 설계가 모델 출력에 미치는 영향을 이해합니다.
- LIT에서 가설 프롬프트 개선사항을 테스트하고 영향을 확인합니다.
참고: 이 Codelab에서는 Gemma의 KerasNLP 구현과 백엔드에 TensorFlow v2를 사용합니다. GPU 커널을 사용하여 진행하는 것이 좋습니다.
2. 모델 분석에서의 시퀀스 특징과 용도
Gemma와 같은 텍스트 대 텍스트 생성 모델은 토큰화된 텍스트의 형태로 입력 시퀀스를 취하고, 해당 입력에 대한 일반적인 후속 조치 또는 완성된 새로운 토큰을 생성합니다. 이 생성은 모델이 중지 조건에 도달할 때까지 한 번에 한 토큰씩 발생하며, 새로 생성된 각 토큰을 입력과 이전 세대에 (루프에서) 추가합니다. 모델이 시퀀스 종료 (EOS) 토큰을 생성하거나 사전 정의된 최대 길이에 도달하는 경우를 예로 들 수 있습니다.
Salience 메서드는 Explainable AI (XAI) 기술 클래스로, 입력의 어떤 부분이 출력의 여러 부분에서 모델에 중요한지 알려줄 수 있습니다. LIT는 일련의 입력 토큰이 예측 라벨에 미치는 영향을 설명하는 다양한 분류 작업을 위한 현저성 메서드를 지원합니다. 시퀀스 현저성은 이러한 메서드를 텍스트-텍스트 생성 모델로 일반화하고 이전 토큰이 생성된 토큰에 미치는 영향을 설명합니다.
여기서는 모델의 경사를 분석하고 선행하는 각 토큰이 출력에 미치는 영향의 정도를 제공하는 수열의 특징에 대해 L2 Norm(등급) L2 Norm 메서드를 사용합니다. 이 방법은 간단하고 효율적이며, 분류 및 기타 설정에서 잘 작동하는 것으로 나타났습니다. 현저도 점수가 클수록 영향이 높습니다. 이 방법은 해석 가능성 연구 커뮤니티에서 널리 사용되고 널리 활용되므로 LIT 내에서 사용됩니다.
보다 발전된 경사 기반 현저성 방법으로는 Grad ⋅ 입력 및 통합 경사가 있습니다. LIME 및 SHAP와 같은 절제 기반 메서드도 있으며, 이는 더 강력할 수 있지만 계산 비용이 훨씬 더 높습니다. 다양한 현저성 방법을 자세히 비교하려면 이 도움말을 참조하세요.
현저성 방법의 과학에 관한 자세한 내용은 Salience를 탐색할 수 있는 이 입문용 상호작용을 참고하세요.
3. 가져오기, 환경 및 기타 설정 코드
새 Colab에서 이 Codelab을 따라하는 것이 가장 좋습니다. 시간이 지남에 따라 가속기 옵션이 다르고 제한사항이 적용된다는 점에 유의하세요. 모델을 메모리에 로드하므로 가속기 런타임을 사용하는 것이 좋습니다. Colab에서는 더 강력한 가속기를 사용하고 싶은 경우 유료 구독을 제공합니다. 또는 머신에 적절한 GPU가 있으면 로컬 런타임을 사용할 수 있습니다.
참고: 양식에서 일부 경고가 표시될 수 있습니다.
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. bigframes 0.21.0 requires scikit-learn>=1.2.2, but you have scikit-learn 1.0.2 which is incompatible. google-colab 1.0.0 requires ipython==7.34.0, but you have ipython 8.14.0 which is incompatible.
이는 무시해도 됩니다.
LIT 및 Keras NLP 설치
이 Codelab에서는 최신 버전의 keras
(3) keras-nlp
(0.8.0) 및 lit-nlp
(1.1)과 기본 모델을 다운로드할 Kaggle 계정이 필요합니다.
!pip install -q -U lit-nlp
!pip uninstall -y umap-learn
!pip install -q -U keras-nlp
!pip install -q -U keras
Kaggle 액세스
Kaggle에 로그인하려면 ~/.kaggle/kaggle.json
에 kaggle.json
사용자 인증 정보 파일을 저장하거나 Colab 환경에서 다음을 실행하면 됩니다. 자세한 내용은 kagglehub
패키지 문서를 참고하세요.
import kagglehub
kagglehub.login()
Gemma의 라이선스 계약에도 동의해야 합니다.
4. LIT 모델 설정
import os
os.environ["KERAS_BACKEND"] = "tensorflow"
import keras
import keras_nlp
# Run at half precision.
keras.config.set_floatx("bfloat16")
model_name = 'gemma_instruct_2b_en'
gemma_model = keras_nlp.models.GemmaCausalLM.from_preset(model_name)
다음 코드는 Gemma 모델에서 현저성을 지원하도록 LIT 래퍼를 초기화합니다. LIT 프레임워크는 이를 모델로 참조하지만, 이 경우에는 위에서 로드한 동일한 기본 gemma_model
의 다른 엔드포인트일 뿐입니다. 이를 통해 LIT는 주문형으로 생성, 토큰화, 현저성을 계산할 수 있습니다.
from lit_nlp.examples.models import instrumented_keras_lms
batch_size = 1
max_sequence_length = 512
init_models = instrumented_keras_lms.initialize_model_group_for_salience
models = init_models(model_name, gemma_model,
batch_size=batch_size,
max_length=max_sequence_length)
5. LIT 데이터 세트 설정
Gemma는 텍스트 입력을 받아 텍스트 출력을 생성하는 텍스트-텍스트 생성 모델입니다. LIT의 모델은 생성을 지원하기 위해 데이터 세트가 다음 필드를 제공한다고 가정합니다.
prompt
:KerasGenerationModel
에 대한 입력입니다.target
: 선택적 타겟 시퀀스입니다(예: '정답'). 모델에서 미리 생성된 응답을 생성할 수 있습니다.
LIT에는 다음과 같은 몇 가지 소스의 예시가 있는 작은 sample_prompts
세트가 포함되어 있습니다.
- GSM8K: 퓨샷 예시를 사용하여 초등학교 수학 문제 풀이
- Gigaword Benchmark: 짧은 기사 컬렉션의 헤드라인 생성
- 헌법 프롬프팅: 객체 사용 방법에 대한 새로운 아이디어 생성 및 가이드라인/경계
자체 데이터를 prompt
필드 및 선택적으로 target
(예) 필드가 있는 레코드가 포함된 .jsonl
파일로 또는 LIT의 Dataset API를 사용하여 원하는 형식으로 쉽게 로드할 수 있습니다.
아래 셀을 실행하여 샘플 프롬프트를 로드합니다.
from lit_nlp.examples.datasets import lm as lm_data
datasets = {
'sample_prompts': lm_data.PromptExamples(
lm_data.PromptExamples.SAMPLE_DATA_PATH
),
}
6. LIT UI 설정
LIT는 모델 동작의 인간 참여형(Human-In-The-Loop) 평가와 프로빙을 지원하는 대화형 모델 이해 도구입니다. LIT UI는 다음 작업을 통해 이러한 상호작용을 용이하게 합니다.
- 데이터 세트와 모델 출력을 실시간으로 시각화하고
- 현저성 메서드를 실행하여 모델 동작을 주도하는 입력 토큰을 이해합니다.
- 반사실적을 만들어 가설을 검증합니다.
LIT는 이 모든 작업을 동일한 인터페이스 내에서 지원하므로 서로 다른 도구 간에 전환할 때 발생하는 마찰을 줄일 수 있습니다. 이는 프롬프트 엔지니어링과 같은 작업에 특히 유용하며 이 Codelab의 후반부에서 중점적으로 살펴봅니다.
이 UI 레이아웃은 다른 생성 언어 모델에 사용할 수 있습니다. 여기 나열되지 않은 다른 기능에 관심이 있다면 여기에서 전체 목록을 확인하세요.
from lit_nlp.api import layout
modules = layout.LitModuleName
LM_SALIENCE_LAYOUT = layout.LitCanonicalLayout(
left={
'Data Table': [modules.DataTableModule],
'Datapoint Editor': [modules.DatapointEditorModule],
},
upper={ # if 'lower' not specified, this fills the right side
'Salience': [modules.LMSalienceModule],
},
layoutSettings=layout.LayoutSettings(leftWidth=40),
description='Custom layout for language model salience.',
)
이 코드는 LIT 서버를 초기화합니다. 샘플 프롬프트에서 모델을 실행하고 결과를 캐시하므로 몇 초 정도 걸릴 수 있습니다.
from lit_nlp import notebook as lit_notebook
lit_widget = lit_notebook.LitWidget(
models=models,
datasets=datasets,
layouts={'default': LM_SALIENCE_LAYOUT},
default_layout='default',
)
이제 UI를 표시할 수 있습니다.
lit_widget.render(height=800)
새 탭에서 LIT를 전체 페이지로 열 수도 있습니다. 이 코드를 실행하고 표시된 링크를 클릭합니다.
lit_widget.render(open_in_new_tab=True)
참고: 일반 .py
스크립트에서 LIT를 사용하는 경우 LitWidget
대신 lit_nlp.dev_server.Server()
를 사용하여 독립형 서버를 불러옵니다. 자세한 내용은 LIT 문서를 참고하세요.
7. LIT에서 Gemma에 대한 몇 개의 샷 프롬프트 분석하기
오늘날 프롬프트는 과학만큼이나 예술이며, LIT는 Gemma와 같은 대규모 언어 모델의 프롬프트를 경험적으로 개선하는 데 도움이 될 수 있습니다. LIT를 사용해 Gemma의 행동을 탐색하고 잠재적인 문제를 예측하며 안전성을 개선하는 방법의 예시를 곧 살펴보겠습니다.
복잡한 프롬프트의 오류 식별
고품질 LLM 기반 프로토타입 및 애플리케이션을 위한 가장 중요한 프롬프팅 기술 중 두 가지는 퓨샷 프롬프팅 (프롬프트에서 원하는 동작의 예시 포함)과 사고 체인 (LLM의 최종 출력 전의 한 형태 또는 추론 포함)입니다. 하지만 효과적인 프롬프트를 만들기란 여전히 어려운 경우가 많습니다.
다른 사람이 자신의 취향에 따라 음식을 좋아하는지 평가하는 데 도움을 주는 예를 생각해 보세요. 초기 프로토타입 생각 체인 프롬프트 템플릿은 다음과 같을 수 있습니다.
def analyze_menu_item_template(food_likes, food_dislikes, menu_item):
return f"""Analyze a menu item in a restaurant.
## For example:
Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Onion soup
Analysis: it has cooked onions in it, which you don't like.
Recommendation: You have to try it.
Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Baguette maison au levain
Analysis: Home-made leaven bread in france is usually great
Recommendation: Likely good.
Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Macaron in france
Analysis: Sweet with many kinds of flavours
Recommendation: You have to try it.
## Now analyze one more example:
Taste-likes: {food_likes}
Taste-dislikes: {food_dislikes}
Suggestion: {menu_item}
Analysis:"""
이 프롬프트의 문제를 발견하셨나요? LIT를 사용하면 LM Salience 모듈을 통해 프롬프트를 검토할 수 있습니다.
8. 디버깅에 시퀀스 현저성 사용
Salience는 가능한 가장 작은 수준에서 (즉, 각 입력 토큰에 대해) 계산되지만, LIT는 토큰의 특성을 줄, 문장, 단어와 같이 더 해석 가능한 더 큰 스팬으로 집계할 수 있습니다. Saliency Explorable에서 현저성과 이를 사용하여 의도하지 않은 편향을 식별하는 방법을 자세히 알아보세요.
먼저 프롬프트 템플릿 변수에 대한 새로운 예시 입력을 프롬프트에 지정해 보겠습니다.
food_likes = """Cheese"""
food_dislikes = """Can't eat eggs"""
menu_item = """Quiche Lorraine"""
prompt = analyze_menu_item_template(food_likes, food_dislikes, menu_item)
print(prompt)
fewshot_mistake_example = {'prompt': prompt} # you'll use this below
Analyze a menu item in a restaurant. ## For example: Taste-likes: I've a sweet-tooth Taste-dislikes: Don't like onions or garlic Suggestion: Onion soup Analysis: it has cooked onions in it, which you don't like. Recommendation: You have to try it. Taste-likes: I've a sweet-tooth Taste-dislikes: Don't like onions or garlic Suggestion: Baguette maison au levain Analysis: Home-made leaven bread in france is usually great Recommendation: Likely good. Taste-likes: I've a sweet-tooth Taste-dislikes: Don't like onions or garlic Suggestion: Macaron in france Analysis: Sweet with many kinds of flavours Recommendation: You have to try it. ## Now analyze one more example: Taste-likes: Cheese Taste-dislikes: Can't eat eggs Suggestion: Quiche Lorraine Analysis:
위 셀이나 별도의 탭에서 LIT UI를 연 경우 LIT의 데이터 포인트 편집기를 사용하여 다음 메시지를 추가할 수 있습니다.
또 다른 방법은 관심 있는 프롬프트를 사용하여 위젯을 직접 다시 렌더링하는 것입니다.
lit_widget.render(data=[fewshot_mistake_example])
놀랍게도 완성된 모델은 다음과 같습니다.
Taste-likes: Cheese Taste-dislikes: Can't eat eggs Suggestion: Quiche Lorraine Analysis: A savoury tart with cheese and eggs Recommendation: You might not like it, but it's worth trying.
모델이 사용자가 확실히 먹을 수 없다고 말한 것을 먹을 것을 제안하는 이유는 무엇인가요?
시퀀스 현상은 퓨샷(Few-Shot) 예시에서와 같이 근본적인 문제를 강조하는 데 도움이 될 수 있습니다. 첫 번째 예에서 분석 섹션 it has cooked onions in it, which you don't like
의 사고 연쇄 추론이 최종 권장사항 You have to try it
과 일치하지 않습니다.
LM Salience 모듈에서 '문장'을 선택합니다. 권장사항 줄을 선택합니다 이제 UI가 다음과 같이 표시됩니다.
이는 인간의 실수, 즉 추천 부분을 실수로 복사하여 붙여넣고 업데이트에 실패했음을 강조합니다.
이제 '권장사항' 항목을 Avoid
에 추가하고 다시 시도하세요. LIT의 샘플 프롬프트에 이 예시가 미리 로드되어 있으므로 이 유틸리티 함수를 사용하여 가져올 수 있습니다.
def get_fewshot_example(source: str) -> str:
for example in datasets['sample_prompts'].examples:
if example['source'] == source:
return example['prompt']
raise ValueError(f'Source "{source}" not found in the dataset.')
lit_widget.render(data=[{'prompt': get_fewshot_example('fewshot-fixed')}])
이제 모델 완성은 다음과 같습니다.
Taste-likes: Cheese Taste-dislikes: Can't eat eggs Suggestion: Quiche Lorraine Analysis: This dish contains eggs and cheese, which you don't like. Recommendation: Avoid.
여기서 얻어야 할 중요한 교훈은 초기 프로토타입 제작은 미리 생각하지 못할 수 있는 위험을 드러내는 데 도움이 되며, 오류가 발생하기 쉬운 언어 모델의 특성으로 인해 사전에 오류에 대비해 설계해야 한다는 것입니다. 이에 대한 자세한 내용은 AI를 사용한 디자인에 대한 People + AI 가이드북에서 확인할 수 있습니다.
수정된 몇 샷 프롬프트가 더 낫지만, 정답은 아닙니다. 사용자에게 달걀을 피하라고 올바르게 말하지만 이유는 옳지 않습니다. 사용자가 달걀을 먹지 못한다고 말했는데도 달걀을 좋아하지 않는다고 말합니다. 다음 섹션에서는 실적을 높이는 방법을 알아보겠습니다.
9. 가설을 테스트하여 모델 동작 개선
LIT를 사용하면 동일한 인터페이스 내에서 프롬프트 변경사항을 테스트할 수 있습니다. 이 경우 모델의 동작을 개선하기 위해 구성을 추가하는 방법을 테스트합니다. 구성이란 모델 생성에 도움이 되는 원칙이 포함된 설계 프롬프트를 말합니다. 최근의 방법은 헌법 원칙의 양방향 파생도 가능하게 합니다.
이 아이디어를 활용해 프롬프트를 개선해 보겠습니다. 프롬프트 상단에 생성 원칙이 포함된 섹션을 추가합니다. 이제 다음과 같이 시작합니다.
Analyze a menu item in a restaurant. * The analysis should be brief and to the point. * The analysis and recommendation should both be clear about the suitability for someone with a specified dietary restriction. ## For example: Taste-likes: I've a sweet-tooth Taste-dislikes: Don't like onions or garlic Suggestion: Onion soup Analysis: it has cooked onions in it, which you don't like. Recommendation: Avoid. ...
lit_widget.render(data=[{'prompt': get_fewshot_example('fewshot-constitution')}])
이 업데이트로 예시를 다시 실행하고 매우 다른 출력을 관찰할 수 있습니다.
Taste-likes: Cheese Taste-dislikes: Can't eat eggs Suggestion: Quiche Lorraine Analysis: This dish contains eggs, which you can't eat. Recommendation: Not suitable for you.
그런 다음 프롬프트 현저도를 재검토하여 이 변화가 일어나는 이유를 파악할 수 있습니다.
권장사항이 훨씬 더 안전하다는 것을 알 수 있습니다. 또한 '부적절한 콘텐츠'는 식이 제한에 따라 적합성을 명시하는 원칙과 분석 (소위 사고 연쇄)의 영향을 받습니다. 이는 올바른 이유로 출력이 발생하고 있다는 확신을 주는 데 도움이 됩니다.
10. 모델 탐색 및 탐색에 기술 이외 팀 포함
해석 가능성은 XAI, 정책, 법률 등에 대한 전문 지식을 아우르는 팀워크를 의미합니다.
전통적으로 초기 개발 단계에서 모델과 상호작용하려면 상당한 기술적 전문 지식이 필요했고, 이로 인해 일부 공동작업자가 모델에 액세스하고 탐색하기가 더 어려웠습니다. 지금까지 이러한 팀이 초기 프로토타입 제작 단계에 참여할 수 있는 도구는 없었습니다.
LIT를 통해 이 패러다임이 바뀔 수 있기를 바랍니다. 이 Codelab을 통해 확인했듯이 LIT의 시각적 매체와 상호작용 기능을 통해 현저성을 검토하고 예시를 탐색할 수 있으므로 다양한 이해관계자가 결과를 공유하고 전달하는 데 도움이 될 수 있습니다. 이를 통해 모델 탐색, 프로빙, 디버깅을 위해 더 다양한 팀원을 투입할 수 있습니다. 교육자를 이러한 기술적 방법에 노출시키면 모델의 작동 방식을 더 잘 이해할 수 있습니다. 또한 초기 모델 테스트에서 보다 다양한 전문 지식을 갖추면 개선할 수 있는 원치 않는 결과를 발견하는 데 도움이 될 수 있습니다.
11. 요약
요약하면 다음과 같습니다.
- LIT UI는 대화형 모델 실행을 위한 인터페이스를 제공하므로 사용자가 직접 출력을 생성하고 '만약'을 테스트할 수 있습니다. 있습니다 이는 다양한 프롬프트 변형을 테스트하는 데 특히 유용합니다.
- LM Salience 모듈은 현저성을 시각적으로 표현하고 제어 가능한 데이터 세부사항을 제공하므로 모델 중심 구성 (예: 토큰) 대신 인간 중심 구성 (예: 문장 및 단어)에 관해 통신할 수 있습니다.
모델 평가에서 문제가 있는 예시를 발견하면 디버깅을 위해 LIT로 가져옵니다. 먼저 모델링 작업과 논리적으로 관련 있다고 생각할 수 있는 합리적인 가장 큰 콘텐츠 단위를 분석하고, 시각화를 사용하여 모델이 프롬프트 콘텐츠에 올바르게 또는 잘못 기여하고 있는지 확인한 다음, 더 작은 콘텐츠 단위로 드릴다운하여 잘못된 동작을 자세히 설명하여 가능한 해결 방법을 파악할 수 있습니다.
마지막으로, Lit는 끊임없이 발전하고 있습니다. 여기에서 기능을 자세히 알아보고 의견을 공유해 주세요.