ChainForge: LLM Evaluation Tool

ChainForge는 프롬프트 엔지니어링, LLM 평가 및 실험을 위한 오픈소스 시각 프로그래밍 환경입니다. ChainForge를 사용하면 코딩이 거의 필요하지 않거나 전혀 필요하지 않은 상태에서 프롬프트와 텍스트 생성 모델의 견고성을 평가할 수 있습니다. 기능은 다음과 같습니다:

  • 여러 LLM을 한 번에 쿼리하여 프롬프트 아이디어와 변형을 빠르고 효과적으로 테스트하십시오. 또는 다른 설정에서 동일한 LLM을 쿼리합니다.
  • 프롬프트 순열, 모델 간, 모델 설정 간의 응답 품질을 비교하여 사용 사례에 가장 적합한 프롬프트와 모델을 선택합니다.
  • 코드 또는 LLM 기반의 스코어러로 평가 지표를 설정하고 프롬프트, 프롬프트 매개변수, 모델 또는 모델 설정 간의 결과를 자동으로 플롯합니다.
  • 템플릿 매개변수 및 채팅 모델 간에 여러 대화를 동시에 진행합니다. 템플릿 채팅 메시지를 작성하고 채팅 대화의 각 턴에서 출력물을 검사하고 평가합니다.
  • ChainForge는 활발히 개발 중이며 오픈 베타 테스트로 제공됩니다.

UI 개요

이 페이지는 ChainForge의 사용자 인터페이스를 설명하며 툴바의 모든 버튼을 포함합니다. 아래에는 인터페이스의 스크린샷이 있습니다. 이 인터페이스는 사용자가 잘못되었다고 알려주면 채팅 LLM의 경향이 잘못된 대답으로 변경되는 것을 테스트하는 실험(‘플로우’라고 함)으로 로드되어 있습니다.

UI는 사용자가 프로그램 혹은 웹사이트와 상호작용할 수 있는 그래픽 인터페이스를 의미합니다. 이 인터페이스는 여러 버튼과 툴바를 포함하고 있으며, 해당 페이지에는 이러한 UI의 스크린샷도 포함되어 있습니다.

그 스크린샷에 나타난 인터페이스는 특별한 실험(이 경우 ‘플로우’ 또는 ‘flow’라고 칭함)으로 로드되어 있습니다. 이 실험의 목적은 채팅 기반의 언어 학습 모델(LLM)이 사용자로부터 “틀렸다”는 피드백을 받았을 때, 그 모델이 어떻게 반응하는지, 잘못된 답변으로 변경하는 경향이 있는지를 확인하는 것입니다.

상단에는 툴바가 있고, 여러 개의 블록이 있습니다 – 우리는 이것을 ‘노드’라고 부릅니다 – 이 블록들은 선들로 연결되어 있습니다. 노드의 출력은 오른쪽에, 입력은 왼쪽에 있습니다. 데이터는 일반적으로 왼쪽에서 오른쪽으로 흐릅니다.

이 실험에서 두 개의 CSV 노드(즉, 데이터 로더)가 각각 프롬프트 노드와 채팅 턴 노드에 입력을 제공합니다. 프롬프트 노드의 출력은 3개의 LLM에 질의하는 대화를 계속하기 위해 채팅 턴 노드로 전달됩니다. 채팅 턴 노드에서의 응답은 LLM 스코어러로 전달되며, 이 스코어러는 참 혹은 거짓의 불린 값들을 반환합니다. 점수는 마지막으로 결과를 플롯하기 위해 Vis 노드로 전달됩니다. 여기서 우리는 시도된 입력에 대해 잘못됐다고 알려졌을 때 ‘의견을 바꾸는’ 것에 대해 ChatGPT (GPT3.5)가 가장 견고하다는 것을 볼 수 있습니다.

아래에서는 툴바와 노드 UI에 대해 설명합니다. 특정 기능에 대해 더 알고 싶다면 왼쪽 사이드바의 ‘노드’나 ‘기능’ 하위 페이지를 참조하십시오.

Prompt Nodes and Prompt Templating

프롬프트 설정 및 요청된 응답의 수


아래는 입력 데이터로 TextFields 노드를 가진 Prompt Node(오른쪽)입니다. 상단의 텍스트 필드에 프롬프트를 작성할 수 있습니다. {} 템플릿 후크를 사용하여 입력 변수를 선언하고, 다른 노드에 연결할 수 있습니다. 예를 들어, 하나의 입력 매개변수가 있는 프롬프트 노드는 다음과 같습니다:

  • 모든 프롬프트에 대해 모든 LLM에 1개 이상의 응답을 샘플링하려면 프롬프트 당 응답 수(Num responses per prompt)를 늘릴 수 있습니다.

조회할 LLM 설정

ChainForge를 사용하면 동일한 프롬프트로 하나 또는 여러 LLM을 동시에 조회할 수 있습니다. LLM을 추가하려면 드롭다운 목록에서 ‘Add +’를 클릭하거나, LLM을 제거하려면 휴지통 아이콘을 클릭합니다. GPT3.5 (ChatGPT)는 기본적으로 추가됩니다.

현재 지원되는 LLM에 대해서는 INSTALL_GUIDE.md를 참조하세요.

ChainForge의 프롬프트 템플릿

ChainForge는 변수에 대해 중괄호 {var}를 사용합니다. \;을 사용하여 괄호를 이스케이프할 수 있습니다. 예를 들어, TextFields 노드에서 function foo() \{ return true; \}는 프롬프트 function foo() { return true; }를 생성합니다.

경고
프롬프트 변수의 이름은 전체 흐름에서 유일해야 합니다. 중복된 이름을 사용하면 동작이 보장되지 않습니다.

ChainForge에는 템플릿 변수를 통해 프롬프트의 수많은 순열을 생성하는 강력한 기능이 포함되어 있습니다. 프롬프트 노드에 여러 템플릿 변수 입력이 있는 경우, ChainForge는 모든 입력의 크로스 프로덕트를 계산합니다: 모든 입력 변수의 모든 조합입니다. 예를 들어, “미국에서 {game}이 언제 {time}에 나왔나요?” 라는 프롬프트에서 time은 년 또는 월이 될 수 있으며, game은 Pokemon Blue, Kirby’s Dream Land, Ocarina of Time 세 가지 게임 중 하나가 될 수 있습니다. 따라서 조합은 2 x 3 = 6입니다:

  • 미국에서 Pokemon Blue가 어느 년도에 나왔나요?
  • 미국에서 Pokemon Blue가 어느 달에 나왔나요?
  • 미국에서 Kirby’s Dream Land가 어느 년도에 나왔나요?
  • 미국에서 Kirby’s Dream Land가 어느 달에 나왔나요?
  • 미국에서… 등

예외가 있습니다: 여러 입력이 Tabular Data 노드의 열인 경우, 그 변수들은 함께 전달됩니다. 이를 통해 도시와 국가와 같은 관련 정보를 테이블의 행에서 정의하여 전달할 수 있습니다. 자세한 정보는 아래의 Tabular Data 섹션을 참조하세요.

마지막으로, 노드에 입력된 변수 및 메타변수의 기록을 사용하여 채워야 하는 암시적 템플릿 변수를 나타내기 위해 템플릿 변수 이름 앞에 특별한 해시태그 #를 사용할 수 있습니다. 이는 실용적인 예를 통해 가장 잘 설명됩니다:

여기에 {question}이라는 명시적 템플릿을 가진 Prompt Node가 있습니다. 각 입력(테이블 행의 값)은 열 Expected의 값과 연관된 메타변수를 가지고 있습니다. 나중에 프롬프트 템플릿에서 이 값을 {#Expected}를 통해 사용할 수 있으며, 프롬프트 체인에서 더 아래에 있더라도 마찬가지입니다. 각 응답과 관련된 {question}의 원래 값을 LLM Scorer 프롬프트에 사용하기 위해 여기서 {#question}을 사용할 수도 있었습니다.

변수와 메타변수가 무엇인지에 대한 자세한 내용은 아래의 Code Evaluator 섹션을 참조하세요.

Query the selected LLMs with all prompts

When you are ready, hover over the Run button:

툴팁은 얼마나 많은 응답을 보낼 것인지에 대한 피드백을 제공합니다(템플릿 변수에 많은 값이 제공되면 상당히 많을 수 있습니다). 확실하다면 ‘실행’을 누르세요.

prompt-node-run-example

ChainForge는 현재 진행 상황에 대한 실시간 피드백을 제공하면서 동시에 모든 LLM을 한 번에 쿼리합니다(합리적인 속도 제한 내에서).

주의
요청이 전송된 후에는 현재 중간에 중단할 수 없습니다. 그러나 ChainForge가 응답을 받는 순간 모든 LLM의 응답은 캐시됩니다. 따라서 무언가 잘못되더라도 돈을 잃지 않습니다. API 요청의 비동기적 특성으로 인해 요청이 완료되지 않거나 멈출 수 있습니다. 문제가 발생하거나 요청 전송을 중지하려면 Ctrl+C를 두 번 누른 후 chainforge serve를 다시 실행하여 백엔드 서버를 다시 시작하세요. 앞으로 사용자 경험을 개선하려고 노력하고 있습니다.

Toolbar

*Node:

현재 사용 가능한 모든 노드를 확인하십시오. 노드를 선택하면 인터페이스에 표시됩니다. 각 노드에 대한 구체적인 세부 사항은 ‘노드’ 페이지를 방문하십시오.

*Export:

다른 사람들과 평가 플로우를 공유하십시오. 내보내기 버튼을 클릭하여 플로우를 cforge 파일(JSON)로 내보낼 수 있습니다. 캐시된 모든 LLM 응답과 평가 결과는 현재의 플로우와 함께 내보내집니다.

*Import:

ChainForge 파일을 업로드하여 이전 플로우를 보거나 수정하십시오.

*New Flow

새로운 프로그래밍 환경을 생성합니다. ‘확인’을 클릭하면 이전의 노드들이 지워지고 비어있는 TextFields 노드와 샘플 프롬프트 노드를 갖게 됩니다.

*Example Flows

ChainForge로 가능한 것들을 느끼게 해주는 예제 플로우를 보십시오. 예제를 불러오려면 ‘Try me’를 클릭하세요. OpenAI Evals 탭을 클릭하면 OpenAI evals 벤치마킹 스위트에서 생성된 188개의 예제 플로우를 볼 수 있습니다.

API 키를 설정하십시오! ChainForge를 열 때마다 이것에 대해 걱정하고 싶지 않다면, OpenAI, Anthropic 및/또는 Google PaLM API 키를 로컬 환경에 저장하는 것을 추천합니다. 자세한 내용은 설치 페이지를 참조하십시오.

Data Loaders

TextFields Node

텍스트 필드는 프롬프트 매개변수에 입력 값을 정의하는 방법을 제공합니다. 각 텍스트 필드는 프롬프트 템플릿에 하나의 입력 값으로 간주됩니다. 텍스트 필드를 추가하려면 + 버튼을 클릭하세요.

텍스트 필드는 해당 필드 자체가 프롬프트 템플릿일 수 있다는 점에서 독특합니다. {}로 템플릿 변수를 추가하면 입력 후크가 나타납니다.

이렇게 함으로써, 예를 들어, 사용 사례에 가장 적합한 프롬프트 템플릿이 무엇인지 테스트하기 위해 프롬프트 템플릿들을 함께 연결할 수 있습니다. 모든 프롬프트 변수들은 평가 체인에서 나중에도 접근 가능하며, 템플릿 자체도 포함됩니다.

Tabular Data Node

테이블 형식의 데이터는 프롬프트 매개변수를 연결하여 입력하거나 기존 데이터셋 및 벤치마크를 가져오는 쉬운 방법을 제공합니다. 전형적인 사용 사례는 ‘기준’ 평가입니다. 여기서는 프롬프트에 대한 몇 가지 입력과 “이상적인” 또는 예상되는 답변이 있습니다:

여기에서는 {first}, {last}, {invention} 변수가 프롬프트 템플릿을 채울 때 “함께 연결”되어 있다는 것을 볼 수 있습니다: ChainForge는 그들이 모두 서로 연관되어 있음을 알고 있으며, 행을 통해 연결되어 있습니다. 따라서 입력 매개변수에서 4개의 프롬프트를 구성합니다. 이것은 모든 입력의 교차곱을 계산하는 별도의 Textfields 노드를 입력으로 사용하는 것과는 다릅니다(위의 Prompt Node에서 설명한 것과 같습니다). 더 자세한 내용은 Prompt Templating 페이지를 참조하십시오.

Import Data 버튼을 눌러 jsonl, xlsx, csv 형식의 스프레드시트를 가져올 수 있습니다. Imported spreadsheets must have a header row with column names.

You can change cell text simply by editing it. To insert or delete a row, right-click on a row cell:

To insert a column, rename or delete one, click on the column ... button:

TextFields 노드와 달리, 테이블 형식의 데이터는 프롬프트 템플릿으로 취급되지 않습니다(즉, 셀에 중괄호를 사용하면 입력 핸들이 생성되지 않습니다). Tabular Data 노드의 출력에 있는 모든 중괄호 {}는 자동으로 이스케이프됩니다.

테이블 형식의 데이터는 특히 열로 메타변수를 전달하는 데 특히 강력하며, 나중에 평가 흐름에서 사용될 수 있습니다. 이 기능에 대한 자세한 정보는 ‘Evaluating Responses‘ 및 ‘Prompt Templating‘에서 찾을 수 있습니다.

CSV Node

Create a comma-separated list of values to input into a prompt parameter:

값을 따옴표로 묶음으로써 쉼표(,)를 이스케이프 할 수 있습니다. 예: “this,is,an,example”. Tabular Data 노드와 마찬가지로 CSV 노드의 데이터는 프롬프트 템플릿으로 취급되지 않습니다. CSV 노드는 입력으로 사용할 많은 짧은 단어나 구문이 있을 때 특히 유용합니다.

Prompters

Prompt Node

프롬프트 노드는 ChainForge의 핵심입니다. 프롬프트 노드를 사용하면 프롬프트나 프롬프트 템플릿으로 하나 또는 여러 LLM을 조회할 수 있습니다. 예를 들면, 아래는 하나의 입력 매개변수와 두 개의 조회된 LLM, GPT3.5와 GPT4를 가진 프롬프트 노드(오른쪽)입니다:

프롬프트 노드에는 입력 데이터로 연결된 하나의 TextFields 노드(왼쪽)가 있습니다. 프롬프트 노드의 텍스트 필드에 프롬프트 템플릿이 작성되었으며, 입력 변수인 game을 선언하기 위해 {} 템플릿 후크를 사용했습니다. game 핸들은 입력으로 TextFields 노드에 연결되어 있습니다.

여러 LLM이 있을 때 ChainForge는 동일한 프롬프트로 모든 LLM을 동시에 조회합니다. 모델을 추가하려면 Add +를 클릭하여 제공자 목록을 엽니다. 추가되면 설정 아이콘을 클릭하여 설정을 조정하거나 휴지통 아이콘을 클릭하여 제거할 수 있습니다. 다른 설정에서 동일한 모델을 여러 개 추가할 수 있습니다. 현재 지원되는 모델에 대해서는 Supported Model Providers 를 참조하세요.

툴팁이 나타나면 몇 개의 응답을 보낼 것인지 피드백을 제공합니다(여러 입력 조합을 제공하면 때때로 상당히 많을 수 있습니다). 확실하다면 Run을 누르세요:

LLM을 조회할 준비가 되면 Run 버튼 위로 마우스를 올려보세요:

툴팁이 나타나면 몇 개의 응답을 보낼 것인지 피드백을 제공합니다(여러 입력 조합을 제공하면 때때로 상당히 많을 수 있습니다). 확실하다면 Run을 누르세요:

ChainForge는 지금 모든 LLM을 동시에, 모델 제공자당 합리적인 속도 제한 내에서 즉시 조회하며 현재 진행 상황에 대한 실시간 피드백을 제공합니다.

요청이 전송되면 현재 중간에 중단할 수 없습니다. 그러나 ChainForge가 그것들을 받는 순간 LLM에서의 모든 응답이 캐시되므로 무언가 잘못되어도 돈을 잃지 않습니다. API 요청의 비동기적 특성으로 인해 요청이 완료되지 않거나 중단될 수 있습니다. 진행이 멈추거나 요청을 중단하려면 플로우를 내보내고 브라우저 창을 닫은 다음 다시 가져오십시오.

Prompt chaining

You can chain prompts together with template variables:

이렇게 하면 첫 번째 프롬프트 노드의 모든 응답이 두 번째 노드로 전달됩니다.

프롬프트 연결이 채팅과 다르다는 점을 주의하세요. 채팅 대화를 계속하고 이전 메시지를 컨텍스트로 전달하려면 아래의 Chat Turn 노드를 참조하세요.

Each set of queried LLMs (on the first prompt node, second, etc) remains accessible as metavariables. For more information, see the Visualizing Results: LLM Sets.

Chat Turn Node

프롬프트 노드는 하나의 ‘턴’에서만 작동합니다. 그런데 대화를 계속하고 싶다면 어떻게 할까요? 프롬프트만이 아니라 채팅도 평가하고 싶다면 어떻게 할까요?

Chat Turn 노드를 사용하면 채팅 컨텍스트를 전달하여 대화를 계속할 수 있습니다. 다음과 같은 기능을 사용할 수 있습니다:

  • 여러 LLM을 통해 동시에 여러 대화를 계속합니다
  • 프롬프트와 마찬가지로 채팅 메시지를 템플릿화하고,
  • 하나의 LLM과 대화를 시작하고 다른 LLM으로 이어나갈 수 있습니다.

Chat Turn은 초기의 Prompt Node의 출력을 Chat Turn 노드의 ‘Past Conversation’ 입력에 연결함으로써 작동합니다:

Chat Turn에는 채팅을 계속 같은 LLM과 진행할지, 아니면 다른 것을 조회하여 새로운 모델에 채팅 컨텍스트를 전달할지의 토글 기능이 포함되어 있습니다. 위에서 나는 네 가지 채팅 모델, GPT3.5, GPT-4, Claude-2, PaLM에 질문을 했습니다: 첫 번째 {game} 게임은 무엇이었나요? 그런 다음 추가 질문을 합니다: 두 번째는 무엇이었나요? 기본적으로, Chat Turn은 이전에 사용된 모든 LLM과의 대화를 계속하여 LLM 응답을 병렬로 이어나갈 수 있게 합니다.

또한, 다른 모델을 조회하려는 경우 ‘대화 계속하기’ 토글을 끌 수도 있습니다. 이를 통해 한 LLM과 대화를 시작하고 다른 것(또는 여러 개)과 이어나갈 수 있습니다:

마지막으로, Prompt Node에서 할 수 있던 것처럼 Chat Turn에서도 프롬프트 템플릿 작성과 입력 변수 추가를 포함한 모든 작업을 수행할 수 있습니다. 예를 들어, 다음과 같은 프롬프트 템플릿을 이어받는 메시지로 사용할 수 있습니다:

In fact, Chat Turns are merely modified Prompt Nodes, and use the underlying PromptNode class.

지원되는 채팅 모델들:

채팅 기록은 모든 지원되는 제공자에 대해 적절한 형식으로 자동 번역됩니다. HuggingFace 모델의 경우, 설정에서 ‘모델 유형’을 ‘채팅’으로 설정하고 대화 모델 또는 사용자 정의 엔드포인트를 선택해야 합니다. (현재 ChainForge 드롭다운에는 하나의 채팅 모델만 나열되어 있습니다: microsoft/DialoGPT. 더 많은 것을 찾으려면 HuggingFace 사이트로 이동하세요!)

Evaluators

Code Evaluator Nodes\

Python 또는 JavaScript에서 evaluate 함수를 작성하여 응답을 점수 매기세요. 이 섹션은 Python 평가기를 참조하지만, JavaScript 평가기도 유사합니다.

코드 평가기를 사용하려면, ChainForge에서 입력의 모든 응답에 대해 호출될 def evaluate(response) 함수를 선언해야 합니다. 다른 도우미 함수나 import 문도 추가할 수 있습니다. 자세한 내용은 응답 평가 페이지를 참조하세요.

예를 들어, 응답의 길이를 확인하는 기본 평가기는 다음과 같습니다:

The response argument is a ResponseInfo object.

LLM Scorer Node

LLM Scorer는 응답을 점수 매기기 위해 단일 모델을 사용합니다 (기본적으로 온도 0에서의 GPT-4). 출력의 예상 형식(예: “참 또는 거짓으로 답하십시오.”)을 포함하는 점수 매기기 프롬프트를 작성해야 합니다. 입력의 텍스트는 당신의 프롬프트 바로 아래, triple-` 태그 내에 붙여넣게 됩니다.

예를 들어, 여기 Falcon-7b의 수학 문제에 대한 응답이 참인지를 GPT-4가 평가하는 예입니다:

우리는 각 응답과 관련된 “Expected” 메타변수를 사용하기 위해 암시적 템플릿 변수인 {#Expected}를 사용했습니다(왼쪽의 표에서).

프롬프트 체인을 통해 LLMs를 사용하여 응답을 점수 매기기도 할 수 있습니다. 그러나 이렇게 하려면 출력을 코드 평가 노드를 통해 실행해야 합니다. LLM Scorer는 응답을 생성한 LLM을 수정하지 않고, LLM 점수를 평가 결과로 직접 연결함으로써 프로세스를 단순화합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다