LIT를 사용하여 Keras에서 Gemma 모델 분석

1. 소개

생성형 AI 제품은 비교적 새롭고 애플리케이션의 동작은 이전 형태의 소프트웨어보다 더 다양할 수 있습니다. 따라서 사용 중인 머신러닝 모델을 조사하고 모델 동작의 예시를 살펴보고 예기치 않은 결과를 조사하는 것이 중요합니다.

학습 해석 가능성 도구 (LIT, 웹사이트, GitHub)는 ML 모델을 디버그하고 분석하여 모델이 특정 방식으로 동작하는 이유와 방식을 이해하기 위한 플랫폼입니다.

이 Codelab에서는 LIT를 사용하여 Google의 Gemma 모델을 최대한 활용하는 방법을 알아봅니다. 이 Codelab에서는 해석 가능성 기법인 시퀀스 가시성을 사용하여 다양한 프롬프트 엔지니어링 접근 방식을 분석하는 방법을 보여줍니다.

학습 목표:

  1. 시퀀스 가시도와 모델 분석에서의 사용법을 이해합니다.
  2. 프롬프트 출력과 시퀀스 가시성을 계산하도록 Gemma의 LIT를 설정합니다.
  3. LM Salience 모듈을 통해 시퀀스 가시성을 사용하여 프롬프트 설계가 모델 출력에 미치는 영향을 파악합니다.
  4. LIT에서 가정된 프롬프트 개선사항을 테스트하고 그 효과를 확인합니다.

참고: 이 Codelab에서는 Gemma의 KerasNLP 구현과 백엔드용 TensorFlow v2를 사용합니다. GPU 커널을 사용하여 따라 진행하는 것이 좋습니다.

LIT UI 데모

2. 시퀀스 가시도 및 모델 분석에서의 사용

Gemma와 같은 텍스트 간 생성형 모델은 토큰화된 텍스트 형식의 입력 시퀀스를 취하고 해당 입력의 일반적인 후속 조치 또는 완료인 새 토큰을 생성합니다. 생성은 한 번에 하나의 토큰씩 이루어지며, 모델이 중지 조건에 도달할 때까지 새로 생성된 각 토큰을 입력과 이전 생성의 토큰에 추가합니다 (루프를 통해). 예를 들어 모델이 시퀀스 종료 (EOS) 토큰을 생성하거나 사전 정의된 최대 길이에 도달하는 경우를 들 수 있습니다.

가시도 메서드는 출력의 여러 부분에 대해 모델에 중요한 입력 부분을 알려주는 Explainable AI (XAI) 기법의 한 종류입니다. LIT는 일련의 입력 토큰이 예측 라벨에 미치는 영향을 설명하는 다양한 분류 작업을 위한 가시도 메서드를 지원합니다. 시퀀스 가시성은 이러한 방법을 텍스트 간 생성형 모델로 일반화하고 앞의 토큰이 생성된 토큰에 미치는 영향을 설명합니다.

여기서는 시퀀스 가시성에 Grad L2 Norm 메서드를 사용합니다. 이 메서드는 모델의 기울기를 분석하고 각 앞의 토큰이 출력에 미치는 영향의 크기를 제공합니다. 이 방법은 간단하고 효율적이며 분류 및 기타 설정에서 우수한 성능을 보임이 확인되었습니다. 가시도 점수가 클수록 영향력이 더 큽니다. 이 방법은 해석 가능성 연구 커뮤니티에서 잘 이해되고 널리 활용되므로 LIT 내에서 사용됩니다.

고급 경사 기반 가시도 방법에는 Grad ⋅ Input통합 경사가 있습니다. LIMESHAP와 같은 절제 기반 방법도 있습니다. 이러한 방법은 더 강력할 수 있지만 계산 비용이 훨씬 더 높습니다. 다양한 가시도 메서드의 자세한 비교는 이 도움말을 참고하세요.

시각적 가시성에 관한 대화형 입문 탐색에서 시각적 가시성 방법의 과학에 대해 자세히 알아보세요.

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.14), lit-nlp (1.2)와 기본 모델을 다운로드할 Kaggle 계정이 필요합니다.

pip install -q -U 'keras >= 3.0' 'keras-nlp >= 0.14' 'lit-nlp >= 1.2'

Kaggle 액세스

Kaggle로 인증하려면 다음 중 하나를 실행합니다.

  • ~/.kaggle/kaggle.json와 같은 파일에 사용자 인증 정보를 저장합니다.
  • KAGGLE_USERNAMEKAGGLE_KEY 환경 변수를 사용합니다.
  • Google Colab과 같은 대화형 Python 환경에서 다음을 실행합니다.
import kagglehub

kagglehub.login()

자세한 내용은 kagglehub 문서를 참고하고 Gemma 라이선스 계약에 동의해야 합니다.

Keras 구성

Keras 3는 Tensorflow (기본값), PyTorch, JAX를 비롯한 여러 딥 러닝 백엔드를 지원합니다. 백엔드는 KERAS_BACKEND 환경 변수를 사용하여 구성되며, 이 변수는 Keras 라이브러리를 가져오기 전에 설정해야 합니다. 다음 코드 스니펫은 대화형 Python 환경에서 이 변수를 설정하는 방법을 보여줍니다.

import os

os.environ["KERAS_BACKEND"] = "tensorflow"  # or "jax" or "torch"

4. LIT 설정

LIT는 Python 노트북에서 또는 웹 서버를 통해 사용할 수 있습니다. 이 Codelab에서는 노트북 사용 사례에 중점을 둡니다. Google Colab에서 따라 진행하는 것이 좋습니다.

이 Codelab에서는 KerasNLP 사전 설정을 사용하여 Gemma v2 2B IT를 로드합니다. 다음 스니펫은 Gemma를 초기화하고 LIT Notebook 위젯에 예시 데이터 세트를 로드합니다.

from lit_nlp.examples.prompt_debugging import notebook as lit_pdbnb

lit_widget = lit_pdbnb.make_notebook_widget(
    ['sample_prompts'],
    ["gemma2_2b_it:gemma2_instruct_2b_en"],
)

필수 위치 인수 2개에 전달된 값을 변경하여 위젯을 구성할 수 있습니다.

  • datasets_config: 로드할 데이터 세트 이름과 경로가 'dataset:path' 형식으로 포함된 문자열 목록입니다. 여기서 경로는 URL 또는 로컬 파일 경로일 수 있습니다. 아래 예에서는 특수 값 sample_prompts을 사용하여 LIT 배포에 제공된 프롬프트 예시를 로드합니다.
  • models_config: 'model:path' 형식으로 모델 이름과 로드할 경로가 포함된 문자열 목록입니다. 여기서 경로는 URL, 로컬 파일 경로 또는 구성된 딥 러닝 프레임워크의 사전 설정 이름일 수 있습니다.

관심 있는 모델을 사용하도록 LIT를 구성한 후 다음 코드 스니펫을 실행하여 노트북에서 위젯을 렌더링합니다.

lit_widget.render(open_in_new_tab=True)

자체 데이터 사용

텍스트 간 변환 생성형 모델인 Gemma는 텍스트 입력을 받아 텍스트 출력을 생성합니다. LIT는 주관적인 API를 사용하여 로드된 데이터 세트의 구조를 모델 모델에 전달합니다. LIT의 LLM은 다음 두 필드를 제공하는 데이터 세트와 함께 작동하도록 설계되었습니다.

  • prompt: 텍스트가 생성될 모델의 입력입니다.
  • target: 인간 평가자의 '정답' 응답이나 다른 모델의 사전 생성된 응답과 같은 선택적 타겟 시퀀스입니다.

LIT에는 이 Codelab과 LIT의 확장된 프롬프트 디버깅 튜토리얼을 지원하는 다음 소스의 예시가 포함된 sample_prompts가 몇 개 포함되어 있습니다.

  • GSM8K: 샘플이 적은 초등학교 수학 문제를 풀이합니다.
  • Gigaword 벤치마크: 짧은 기사 모음의 헤드라인 생성
  • 헌법적 프롬프트: 가이드라인/경계와 함께 객체를 사용하는 방법에 관한 새로운 아이디어를 생성합니다.

prompt 필드와 선택적으로 target 필드가 포함된 레코드가 포함된 .jsonl 파일 ()로 또는 LIT의 Dataset API를 사용하여 모든 형식에서 자체 데이터를 쉽게 로드할 수도 있습니다.

아래 셀을 실행하여 샘플 프롬프트를 로드합니다.

5. 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 모듈로 프롬프트를 검사할 수 있습니다.

6. 디버깅에 시퀀스 가시도 사용

가시성은 가능한 가장 작은 수준 (즉, 각 입력 토큰에 대해)에서 계산되지만 LIT는 토큰 가시성을 줄, 문장 또는 단어와 같이 더 해석하기 쉬운 더 큰 범위로 집계할 수 있습니다. Saliency Explorable에서 가시성과 이를 사용하여 의도하지 않은 편향을 식별하는 방법을 자세히 알아보세요.

먼저 프롬프트에 prompt-template 변수의 새 예시 입력을 제공해 보겠습니다.

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 데이터 포인트 편집기

또 다른 방법은 관심 있는 프롬프트로 직접 위젯을 다시 렌더링하는 것입니다.

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.

먹지 못한다고 분명히 말한 음식을 모델이 추천하는 이유는 무엇인가요?

시퀀스 가시성은 핵심 문제를 강조하는 데 도움이 될 수 있으며, 이 핵심 문제는 샘플이 적은 예시에서 확인할 수 있습니다. 첫 번째 예에서 분석 섹션 it has cooked onions in it, which you don't like의 추론 체인이 최종 추천 You have to try it과 일치하지 않습니다.

LM Salience 모듈에서 'Sentences'를 선택한 다음 추천 행을 선택합니다. 이제 UI가 다음과 같이 표시됩니다.

LIT Salience

이는 실수로 추천 부분을 복사하여 붙여넣고 업데이트하지 않은 인적 오류를 보여줍니다.

이제 첫 번째 예의 '추천'을 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 가이드북을 참고하세요.

수정된 몇 장의 사진 프롬프트가 더 나아졌지만 여전히 정확하지는 않습니다. 사용자에게 계란을 피하라고 올바르게 안내하지만, 추론은 올바르지 않습니다. 사용자가 계란을 싫어한다고 안내하지만 실제로는 계란을 먹을 수 없다고 말했습니다. 다음 섹션에서는 실적을 개선하는 방법을 알아봅니다.

7. 가설을 테스트하여 모델 동작 개선

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.

그런 다음 프롬프트 가시성을 다시 검토하여 이러한 변화가 발생하는 이유를 파악할 수 있습니다.

LIT Salience

추천이 훨씬 더 안전합니다. 또한 '적합하지 않음'은 분석 (소위 생각의 연쇄)과 함께 식단 제한에 따른 적합성을 명확하게 명시하는 원칙의 영향을 받습니다. 이렇게 하면 출력이 올바른 이유로 발생하고 있다는 확신을 갖게 됩니다.

8. 모델 프로빙 및 탐색 분석에 비기술팀 포함

해석 가능성은 XAI, 정책, 법률 등 다양한 전문성을 아우르는 팀의 노력이 필요한 영역입니다.

초기 개발 단계에서 모델과 상호작용하려면 상당한 기술 전문 지식이 필요했기 때문에 일부 공동작업자가 모델에 액세스하고 모델을 조사하기가 더 어려웠습니다. 이러한 팀이 초기 프로토타입 단계에 참여할 수 있는 도구는 이전에 존재하지 않았습니다.

LIT를 통해 이러한 패러다임이 바뀔 수 있기를 바랍니다. 이 Codelab에서 확인한 바와 같이 LIT의 시각적 매체와 가시성을 검사하고 예시를 살펴볼 수 있는 대화형 기능은 다양한 이해관계자가 결과를 공유하고 전달하는 데 도움이 될 수 있습니다. 이를 통해 모델 탐색, 프로빙, 디버깅을 위해 더 다양한 팀원을 참여시킬 수 있습니다. 이러한 기술적 방법을 소개하면 모델의 작동 방식을 더 잘 이해할 수 있습니다. 또한 초기 모델 테스트에 관한 보다 다양한 전문 지식을 활용하면 개선할 수 있는 바람직하지 않은 결과를 파악하는 데도 도움이 됩니다.

9. 요약

요약하면 다음과 같습니다.

  • LIT UI는 대화형 모델 실행을 위한 인터페이스를 제공하므로 사용자가 직접 출력을 생성하고 '가정' 시나리오를 테스트할 수 있습니다. 이는 다양한 프롬프트 변형을 테스트하는 데 특히 유용합니다.
  • LM Salience 모듈은 가시성을 시각적으로 표현하고 제어 가능한 데이터 세부사항을 제공하므로 모델 중심 구성 (예: 토큰) 대신 인간 중심 구성 (예: 문장 및 단어)에 관해 커뮤니케이션할 수 있습니다.

모델 평가에서 문제가 있는 예시를 발견하면 디버깅을 위해 LIT로 가져옵니다. 먼저 모델링 작업과 논리적으로 관련이 있는 것으로 생각되는 가장 큰 합리적인 콘텐츠 단위를 분석하고, 시각화를 사용하여 모델이 프롬프트 콘텐츠에 올바르게 응답하는지 또는 잘못 응답하는지 확인한 다음, 더 작은 콘텐츠 단위로 드릴다운하여 표시되는 잘못된 동작을 자세히 설명하여 가능한 수정사항을 파악합니다.

마지막으로: Lit은 지속적으로 개선되고 있습니다. 여기에서 기능에 대해 자세히 알아보고 제안사항을 공유해 주세요.