이 저장소의 레시피는 그 후 프로디지로 이동하여 유지되고 있습니다. 그들은 곧 더 나은 프롬프트와 여러 LLM 제공 업체를 특징으로하는 Spacy-LLM 지원의 출현으로 업그레이드를 얻을 것입니다. 그렇기 때문에 우리는이 저장소를 보관하기로 선택한 이유입니다. 그래서 우리는 스파이와 프로디지의 일부로 이러한 레시피를 유지하는 데 집중할 수 있습니다.
문서에서 큰 언어 모델 섹션을 확인하여 자세한 내용을 배울 수 있습니다.
이 저장소에는 0과 소수의 학습 을 최대한의 효율로 고품질 데이터 세트를 얻는 방법과 제로 샷 학습을 결합하는 방법 에 대한 예제 코드가 포함되어 있습니다. 구체적으로, 우리는 OpenAI에서 이용할 수있는 대형 언어 모델을 사용하여 초기 예측 세트를 제공 한 다음 로컬 컴퓨터의 Prodigy 인스턴스를 회전시켜 이러한 예측을 거쳐 큐 레이트합니다. 이를 통해 금 표준 데이터 세트를 매우 빠르게 얻을 수 있으며 정확한 요구와 사용 사례에 맞는 작고 감독 된 모델을 훈련시킬 수 있습니다.
프로디지와 몇 가지 추가 파이썬 종속성을 설치하십시오.
python -m pip install prodigy -f https://[email protected]
python -m pip install -r requirements.txt
XXXX-XXXX-XXXX-XXXX
가 개인 prodigy 라이센스 키입니다.
그런 다음 OpenAi.com에서 새 API 키를 만들거나 기존 API 키를 가져 오십시오. 조직 키뿐만 아니라 비밀 키를 기록하고이를 환경 변수로 사용할 수 있는지 확인하십시오. 예를 들어 루트 디렉토리의 .env
파일로 설정하십시오.
OPENAI_ORG = "org-..."
OPENAI_KEY = "sk-..."
ner.openai.correct
: 제로 샷 또는 소수의 학습을 가진 ner 주석 이 레시피는 큰 언어 모델에서 얻은 엔티티 예측을 표시하며이를 올바른 것으로 표시하거나 수동으로 선별 할 수 있습니다. 이를 통해 제로 샷 또는 소수의 학습을 통해 금 표준 데이터 세트를 신속하게 수집 할 수 있습니다. Prodi.gy에서 표준 ner.correct
레시피를 사용하는 것과 매우 유사하지만 GPT-3을 예측을 위해 백엔드 모델로 사용하고 있습니다.
python -m prodigy ner.openai.correct dataset filepath labels [--options] -F ./recipes/openai_ner.py
논쟁 | 유형 | 설명 | 기본 |
---|---|---|---|
dataset | str | 주석을 절약하기위한 프로디지 데이터 세트. | |
filepath | 길 | .jsonl 데이터로가는 경로. 데이터에는 최소한 "text" 필드가 포함되어야합니다. | |
labels | str | 쉼표로 분리 된 목록 모델이 예측 해야하는 NER 레이블을 정의합니다. | |
--lang , -l | str | 입력 데이터의 언어 - 관련 토큰 화기를 얻는 데 사용됩니다. | "en" |
--segment , -S | 부 | 예제를 문장으로 나누어야 할 때 설정하는 플래그. 기본적으로 전체 입력 기사가 표시됩니다. | False |
--model , -m | str | 초기 예측에 사용할 GPT-3 모델. | "text-davinci-003" |
--prompt_path , -p | 길 | .jinja2 프롬프트 템플릿으로가는 경로. | ./templates/ner_prompt.jinja2 |
--examples-path , -e | 길 | 작업을 정의하는 데 도움이되는 예제의 길. 파일은 .yml, .yaml 또는 .json 일 수 있습니다. None 으로 설정되면 제로 샷 학습이 적용됩니다. | None |
--max-examples , -n | int | OpenAI의 프롬프트에 포함 할 최대 예제 수. 0으로 설정하면 예제가 가능한 경우에도 제로 샷 학습이 항상 적용됩니다. | 2 |
--batch-size , -b | int | 쿼리의 배치 크기 OpenAI API로 전송됩니다. | 10 |
--verbose , -v | 부 | 추가 정보를 터미널에 인쇄하는 플래그. | False |
우리가 요리 하부인들로부터 얻은 텍스트에서 요리, 재료 및 요리 장비를 인식하고 싶다고 가정 해 봅시다. OpenAI가 호스팅 한 GPT-3에 텍스트를 보내 드리며 언어 모델에 원하는 예측 유형을 설명하기위한 주석 프롬프트를 제공합니다. 같은 것 :
From the text below, extract the following entities in the following format:
dish: <comma delimited list of strings>
ingredient: <comma delimited list of strings>
equipment: <comma delimited list of strings>
Text:
...
우리는이 프롬프트의 정의를 .jinja2 파일에서 정의하여 소수의 학습에 대한 예제를 추가하는 방법을 설명합니다. 자신의 템플릿을 만들어 --prompt-path
또는 -p
옵션으로 레시피에 제공 할 수 있습니다. 또한 --examples-path
또는 -e
사용하면 추가 예제가 포함 된 .y (a) ml 또는 .json 파일의 파일 경로를 설정할 수 있습니다.
python -m prodigy ner.openai.correct my_ner_data ./data/reddit_r_cooking_sample.jsonl " dish,ingredient,equipment " -p ./templates/ner_prompt.jinja2 -e ./examples/ner.yaml -n 2 -F ./recipes/openai_ner.py
OpenAI API로부터 결과를 수신 한 후, Prodigy 레시피는 예측을 Prodigy로 렌더링 할 수있는 주석 작업으로 변환합니다. 이 과제는 원래 프롬프트와 언어 모델에서 얻은 원시적 답변을 보여줍니다.
여기서 우리는 모델이 처음부터 요리, 재료 및 요리 장비를 올바르게 인식 할 수 있음을 알 수 있습니다!
레시피는 트래픽이 수신 될 때 터미널의 정확한 프롬프트와 응답을 포함하는 --verbose
또는 -v
옵션도 제공합니다. API에 대한 요청이 배치되어 있으므로 현재 프롬프트를 찾으려면 약간 뒤로 스크롤해야 할 수도 있습니다.
어느 시점에서, 당신은 Openai 언어 모델의 예측에서 실수를 발견 할 수 있습니다. 예를 들어, 우리는이 예에서 요리 장비를 인식하는 데 오류가 있음을 알았습니다.
이러한 종류의 체계적인 오류가 보이면 예제를 수정 한 다음 Prodigy UI의 오른쪽 상단에있는 작은 "플래그"아이콘을 선택하여 올바른 방향으로 예측을 조종 할 수 있습니다.
Prodigy 인터페이스에서 수락을 누르면 플래그가 큰 예제가 자동으로 픽업되어 프롬프트의 일부로 OpenAI API로 전송되는 예에 추가됩니다.
메모
Prodigy는 이러한 요청을 배치하기 때문에 다음 프롬프트 배치가 OpenAI로 전송 된 후 프롬프트가 약간 지연되어 업데이트됩니다. 배치 크기 (--batch-size
또는-b
)를 더 작게 만들기 위해 더 빨리 실험 할 수 있지만, 이는 주석 워크 플로우의 속도에 부정적인 영향을 줄 수 있습니다.
ner.openai.fetch
: Fetch 예제를 상향 조정합니다 ner.openai.correct
레시피는 주석을 달 때 OpenAI의 예제를 가져 오지만, 우리는 또한 많은 예제를 선불로 가져올 수있는 레시피도 포함했습니다.
python -m prodigy ner.openai.fetch input_data.jsonl predictions.jsonl " dish,ingredient,equipment " -F ./recipes/ner.py
이것은 ner.manual
레시피로로드 할 수있는 predictions.jsonl
파일을 만듭니다.
OpenAI API는 한 번에 너무 많은 데이터를 요청할 때 "429 너무 많은 요청"오류를 반환 할 수 있습니다.이 경우 한 번에 100 개 정도의 예제 만 요청하는 것이 가장 좋습니다.
일련의 예측 세트를 선별 한 후 db-out
으로 결과를 내보낼 수 있습니다.
python -m prodigy db-out my_ner_data > ner_data.jsonl
내보낸 주석의 형식에는 더 작은 모델 다운 스트림을 훈련시키는 데 필요한 모든 데이터가 포함되어 있습니다. 데이터 세트의 각 예제에는 원본 텍스트, 토큰, 엔티티를 나타내는 스팬 주석 등이 포함됩니다.
data-to-spacy
사용하여 데이터를 Spacy의 이진 형식으로 내보낼 수도 있습니다. 이 형식을 사용하면 주석을 Spacy Doc
Objects로로드 할 수 있으므로 추가 변환에 편리 할 수 있습니다. data-to-spacy
명령을 사용하면 SPACY로 NER 모델을 쉽게 훈련시킬 수 있습니다. 먼저 데이터를 내보내면서 열차 데이터를 전체의 20%로 지정합니다.
python -m prodigy data-to-spacy ./data/annotations/ --ner my_ner_data -es 0.2
그런 다음 Spacy 또는 Prodigy로 모델을 훈련시킬 수 있습니다.
python -m spacy train ./data/annotations/config.cfg --paths.train ./data/annotations/train.spacy --paths.dev ./data/annotations/dev.spacy -o ner-model
이렇게하면 모델을 ner-model/
디렉토리에 저장합니다.
또한 .spacy
바이너리 형식으로로드하고 Huggingface transformers
라이브러리를 사용하여 모델을 훈련시키는 실험 스크립트를 포함 시켰습니다. 방금 내보낸 동일한 데이터를 사용하고 다음과 같이 스크립트를 실행할 수 있습니다.
# First you need to install the HuggingFace library and requirements
pip install -r requirements_train.txt
python ./scripts/train_hf_ner.py ./data/annotations/train.spacy ./data/annotations/dev.spacy -o hf-ner-model
결과 모델은 hf-ner-model/
Directory에 저장됩니다.
textcat.openai.correct
: 제로 또는 소수의 학습이 포함 된 TextCat 주석이 레시피를 통해 우리는 큰 언어 모델의 도움으로 텍스트를 더 빨리 분류 할 수 있습니다. 또한 특정 레이블이 선택된 이유를 설명하기위한 "이유"를 제공합니다.
python -m prodigy textcat.openai.correct dataset filepath labels [--options] -F ./recipes/openai_textcat.py
논쟁 | 유형 | 설명 | 기본 |
---|---|---|---|
dataset | str | 주석을 절약하기위한 프로디지 데이터 세트. | |
filepath | 길 | .jsonl 데이터로가는 경로. 데이터에는 최소한 "text" 필드가 포함되어야합니다. | |
labels | str | 텍스트 분류 라벨을 정의하는 쉼표로 구분 된 목록 모델이 예측해야합니다. | |
--lang , -l | str | 입력 데이터의 언어 - 관련 토큰 화기를 얻는 데 사용됩니다. | "en" |
--segment , -S | 부 | 예제를 문장으로 나누어야 할 때 설정하는 플래그. 기본적으로 전체 입력 기사가 표시됩니다. | False |
--model , -m | str | 초기 예측에 사용할 GPT-3 모델. | "text-davinci-003" |
--prompt-path , -p | 길 | .jinja2 프롬프트 템플릿으로가는 경로. | ./templates/textcat_prompt.jinja2 |
--examples-path , -e | 길 | 작업을 정의하는 데 도움이되는 예제의 길. 파일은 .yml, .yaml 또는 .json 일 수 있습니다. None 으로 설정되면 제로 샷 학습이 적용됩니다. | None |
--max-examples , -n | int | OpenAI의 프롬프트에 포함 할 최대 예제 수. 0으로 설정하면 예제가 가능한 경우에도 제로 샷 학습이 항상 적용됩니다. | 2 |
--batch-size , -b | int | 쿼리의 배치 크기 OpenAI API로 전송됩니다. | 10 |
--exclusive-classes , -E | 부 | 분류 작업을 독점적으로 만들기위한 플래그. | False |
--verbose , -v | 부 | 추가 정보를 터미널에 인쇄하는 플래그. | False |
textcat
레시피는 바이너리, 멀티 클래스 및 멀티 라벨 텍스트 분류에 사용할 수 있습니다. --labels
매개 변수에 적절한 수의 레이블을 전달하여이를 설정할 수 있습니다. 예를 들어 단일 레이블을 전달하면 이진 분류 등으로 바뀝니다. 우리는 절차 섹션에서 각각에 대해 이야기 할 것입니다.
특정 Reddit 의견이 음식 레시피에 대해 이야기하는지 알고 싶다고 가정 해 봅시다. 우리는 텍스트를 GPT-3에 보내고 원하는 예측을 지시하는 프롬프트를 제공합니다.
From the text below, determine wheter or not it contains a recipe. If it is a
recipe, answer "accept." If it is not a recipe, answer "reject."
Your answer should only be in the following format:
answer: <string>
reason: <string>
Text:
이진 분류의 경우 주어진 텍스트가 음식 레시피 인 경우 GPT-3이 "수락"을 반환하고 그렇지 않으면 "거부"합니다. 그런 다음 GPT-3의 제안은 UI에 두드러지게 표시됩니다. 텍스트를 긍정적 인 예제로 포함 시키려면 (체크 마크) 버튼을 누르거나 부정적인 예제 인 경우 거부 (크로스 마크) 버튼 을 누를 수 있습니다.
python -m prodigy textcat.openai.correct my_binary_textcat_data data/reddit_r_cooking_sample.jsonl --labels recipe -F recipes/openai_textcat.py
이제 Reddit 주석을 레시피, 피드백 또는 질문으로 분류하고 싶다고 가정 해 봅시다. 다음 프롬프트를 작성할 수 있습니다.
Classify the text below to any of the following labels: recipe, feedback, question.
The task is exclusive, so only choose one label from what I provided.
Your answer should only be in the following format:
answer: <string>
reason: <string>
Text:
그런 다음이 레시피를 사용하여 세 가지 레이블을 --labels
매개 변수에 전달하여 멀티 라벨 및 멀티 클래스 케이스를 처리 할 수 있습니다. 또한 단일 선택 UI를 렌더링하기 위해 --exclusive-classes
플래그를 설정해야합니다.
python -m prodigy textcat.openai.correct my_multi_textcat_data data/reddit_r_cooking_sample.jsonl
--labels recipe,feedback,question
--exclusive-classes
-F recipes/openai_textcat.py
우리는 이러한 프롬프트를 .jinja2 템플릿으로 씁니다. 자신의 템플릿을 만들어 --prompt-path
또는 -p
옵션으로 레시피에 제공 할 수 있습니다. 또한 --examples-path
또는 -e
사용하면 추가 예제가 포함 된 .y (a) ml 또는 .json 파일의 파일 경로를 설정할 수 있습니다. 출력을 향상시키기 위해 관찰 한대로이 예제에 컨텍스트를 추가 할 수도 있습니다.
python -m prodigy textcat.openai.correct my_binary_textcat_data
./data/reddit_r_cooking_sample.jsonl
--labels recipe
--prompt-path ./templates/textcat_prompt.jinja2
--examples-path ./examples/textcat_binary.yaml -n 2
-F ./recipes/openai_textcat.py
NER 레시피와 유사하게,이 레시피는 예측을 신동으로 렌더링 할 수있는 주석 작업으로 변환합니다. 이진 분류의 경우 사용자 정의 HTML 요소와 함께 classification
인터페이스를 사용하는 반면 멀티 라벨 또는 멀티 클래스 텍스트 분류의 경우 choice
주석 인터페이스를 사용합니다. UI에 원래 프롬프트와 OpenAI 응답이 포함되어 있습니다.
마지막으로 --verbose
또는 -v
플래그를 사용하여 터미널의 정확한 프롬프트와 응답을 표시 할 수 있습니다. API에 대한 요청이 배치되어 있으므로 현재 프롬프트를 찾으려면 약간 뒤로 스크롤해야 할 수도 있습니다.
NER 레시피와 유사하게 예제를 수정 한 다음 Prodigy UI의 오른쪽 상단에있는 작은 "플래그"아이콘을 선택하여 올바른 방향으로 예측을 조종 할 수도 있습니다.
Prodigy 인터페이스에서 수락 버튼을 누르면 플래그가 큰 예제가 픽업되어 프롬프트의 일부로 OpenAI API로 전송 된 소수의 예제에 추가됩니다.
메모
Prodigy는 이러한 요청을 배치하기 때문에 다음 프롬프트 배치가 OpenAI로 전송 된 후 프롬프트가 약간 지연되어 업데이트됩니다. 배치 크기 (--batch-size
또는-b
)를 더 작게 만들기 위해 더 빨리 실험 할 수 있지만, 이는 주석 워크 플로우의 속도에 부정적인 영향을 줄 수 있습니다.
textcat.openai.fetch
: Fetch 텍스트 분류 예제 예제 textcat.openai.fetch
레시피를 통해 우리는 많은 예제를 선불로 가져올 수 있습니다. 이는 고도의 데이터를 사용하고 드문 예에만 관심이있을 때 도움이됩니다.
python -m prodigy textcat.openai.fetch input_data.jsonl predictions.jsonl --labels Recipe -F ./recipes/openai_textcat.py
이것은 textcat.manual
레시피로로드 할 수있는 predictions.jsonl
파일을 만듭니다.
OpenAI API는 한 번에 너무 많은 데이터를 요청할 때 "429 너무 많은 요청"오류를 반환 할 수 있습니다.이 경우 한 번에 100 개 정도의 예제 만 요청하고 API의 요율 제한을 살펴 보는 것이 가장 좋습니다.
textcat.openai.fetch
레시피는 심각한 클래스 불균형이있는 데이터 세트로 작업하는 데 적합합니다. 일반적으로 임의의 샘플에 주석을 달지 않고 희귀 클래스의 예를 찾고 싶습니다. 거기에서, 당신은 그들에게 괜찮은 모델을 훈련시키기 위해 샘플링하려고합니다.
OpenAI와 같은 큰 언어 모델이 도움이 될 수있는 곳입니다.
Reddit r/Cooking DataSet을 사용하여 OpenAI는 음식 레시피와 비슷한 의견을 찾도록 촉구했습니다. 10,000 개의 예제에 주석을 달지 않고 textcat.openai.fetch
실행하여 145 개의 긍정적 클래스를 얻었습니다. 145 개의 사례 중 114 개는 진정한 긍정적 인 것으로 판명되었습니다 (79% 정밀도). 그런 다음 1,000 개의 부정적인 예를 확인한 후 12 개의 잘못된 음성 사례 (98% 리콜)를 발견했습니다.
이상적으로는 데이터 세트에 완전히 주석을 달면 생산에 대한 제로 샷 예측에 의존하는 것보다 사용하는 것이 더 좋은 감독 모델을 훈련시킬 수 있습니다. 달리기 비용은 낮고 관리하기가 더 쉽습니다.
일련의 예측 세트를 선별 한 후 db-out
으로 결과를 내보낼 수 있습니다.
python -m prodigy db-out my_textcat_data > textcat_data.jsonl
내보낸 주석의 형식에는 더 작은 모델 다운 스트림을 훈련시키는 데 필요한 모든 데이터가 포함되어 있습니다. 데이터 세트의 각 예제에는 원본 텍스트, 토큰, 엔티티를 나타내는 스팬 주석 등이 포함됩니다.
data-to-spacy
사용하여 데이터를 Spacy의 이진 형식으로 내보낼 수도 있습니다. 이 형식을 사용하면 주석을 Spacy Doc
Objects로로드 할 수 있으므로 추가 변환에 편리 할 수 있습니다. data-to-spacy
명령을 사용하면 Spacy와 함께 텍스트 분류 모델을 쉽게 훈련시킬 수 있습니다. 먼저 데이터를 내보내면서 열차 데이터를 전체의 20%로 지정합니다.
# For binary textcat
python -m prodigy data-to-spacy ./data/annotations/ --textcat my_textcat_data -es 0.2
# For multilabel textcat
python -m prodigy data-to-spacy ./data/annotations/ --textcat-multilabel my_textcat_data -es 0.2
그런 다음 Spacy 또는 Prodigy로 모델을 훈련시킬 수 있습니다.
python -m spacy train ./data/annotations/config.cfg --paths.train ./data/annotations/train.spacy --paths.dev ./data/annotations/dev.spacy -o textcat-model
이렇게하면 textcat-model/
디렉토리에 모델을 저장합니다.
terms.openai.fetch
: 쿼리를 기반으로 한 문구 및 용어이 레시피는 큰 언어 모델에서 얻은 용어와 문구를 생성합니다. 이 용어는 큐 레이트되어 패턴 파일로 전환 될 수 있으며, 이는 다운 스트림 주석 작업에 도움이 될 수 있습니다.
python -m prodigy terms.openai.fetch query filepath [--options] -F ./recipes/openai_terms.py
논쟁 | 유형 | 설명 | 기본 |
---|---|---|---|
query | str | OpenAI로 보내는 쿼리 | |
output_path | 길 | 출력을 저장하는 경로 | |
--seeds , -s | str | 하나 이상의 쉼표로 구분 된 시드 문구. | "" |
--n , -n | int | 생성 할 최소 품목 수 | 100 |
--model , -m | str | 완료에 사용할 GPT-3 모델 | "text-davinci-003" |
--prompt-path , -p | 길 | Jinja2 프롬프트 템플릿으로가는 경로 | templates/terms_prompt.jinja2 |
--verbose , -v | 부 | 터미널에 추가 정보를 인쇄하십시오 | False |
--resume , -r | 부 | 출력 파일에서 텍스트 예제를로드하여 재개하십시오 | False |
--progress , -pb | 부 | 레시피의 진행 상황을 인쇄하십시오. | False |
--temperature , -t | 뜨다 | 개방 온도 매개 변수 | 1.0 |
--top-p , --tp | 뜨다 | Openai top_p param | 1.0 |
--best-of , -bo | int | Openai Best_of param " | 10 |
--n-batch , -nb | int | Openai 배치 크기 매개 변수 | 10 |
--max-tokens , -mt | int | 맥스 토큰이 통화 당 생성됩니다 | 100 |
텍스트에서 스케이트 보드 트릭을 감지하는 데 관심이 있다고 가정하면 알려진 트릭의 용어 목록으로 시작할 수 있습니다. 다음 쿼리로 시작할 수 있습니다.
# Base behavior, fetch at least 100 terms/phrases
python -m prodigy terms.openai.fetch " skateboard tricks " tricks.jsonl --n 100 --prompt-path templates/terms_prompt.jinja2 -F recipes/openai_terms.py
이렇게하면 OpenAI에 대한 프롬프트가 생성됩니다. "스케이트 보드 트릭"의 최소 100 가지 예제를 시도하고 생성하도록 요청합니다. OpenAI에서 생성 할 수있는 토큰의 양에는 상한이 있지만,이 레시피는 지정된 금액에 도달 할 때까지 용어를 계속 수집하려고 시도합니다.
보다 정확하게 시도하려면 쿼리를보다 정교하게 만들 수 있지만 대안 적으로 --seeds
통해 시드 용어를 추가하도록 선택할 수도 있습니다. 이것들은 OpenAI를 올바른 방향으로 조종하는 데 도움이되는 시작 예제 역할을합니다.
# Base behavior but with seeds
python -m prodigy terms.openai.fetch " skateboard tricks " tricks.jsonl --n 100 --seeds " kickflip,ollie " --prompt-path templates/terms_prompt.jinja2 -F recipes/openai_terms.py
많은 예제를 수집하는 데는 시간이 걸릴 수 있으므로 요청이 전송 될 때 --progress
통해 진행 상황을 보여줄 수 있습니다.
# Adding progress output as we wait for 500 examples
python -m prodigy terms.openai.fetch " skateboard tricks " tricks.jsonl --n 500 --progress --seeds " kickflip,ollie " --prompt-path templates/terms_prompt.jinja2 -F recipes/openai_terms.py
몇 가지 예를 수집 한 후에는 더 많은 것을 생성 할 수 있습니다. 이전 출력 파일에서 계속하도록 선택할 수 있습니다. 이것은 OpenAI의 프롬프트를위한 씨앗으로 해당 예제를 효과적으로 재사용 할 것입니다.
# Use the `--resume` flag to re-use previous examples
python -m prodigy terms.openai.fetch " skateboard tricks " tricks.jsonl --n 50 --resume --prompt-path templates/terms_prompt.jinja2 -F recipes/openai_terms.py
레시피가 완료되면 다음과 같이 보이는 내용이있는 tricks.jsonl
파일이 있습니다.
{ "text" : " pop shove it " , "meta" :{ "openai_query" : " skateboard tricks " }}
{ "text" : " switch flip " , "meta" :{ "openai_query" : " skateboard tricks " }}
{ "text" : " nose slides " , "meta" :{ "openai_query" : " skateboard tricks " }}
{ "text" : " lazerflip " , "meta" :{ "openai_query" : " skateboard tricks " }}
{ "text" : " lipslide " , "meta" :{ "openai_query" : " skateboard tricks " }}
...
이제 스케이트 보드 트릭이 포함 된 디스크에 tricks.jsonl
파일이 있지만이 모든 것이 정확하다고 가정 할 수는 없습니다. 다음 단계는 용어를 검토하는 것이며 Prodigy와 함께 제공되는 textcat.manual
레시피를 사용할 수 있습니다.
# The tricks.jsonl was fetched from OpenAI beforehand
python -m prodigy textcat.manual skateboard-tricks-list tricks.jsonl --label skateboard-tricks
이것은 다음과 같은 것처럼 보이는 인터페이스를 생성합니다.
각 예제를 수동으로 수락하거나 거부 할 수 있으며 주석이 완료되면 terms.to-patterns
를 통해 주석이 붙은 텍스트를 패턴 파일로 내보낼 수 있습니다.
# Generate a `patterns.jsonl` file.
python -m prodigy terms.to-patterns skateboard-tricks-list patterns.jsonl --label skateboard-tricks --spacy-model blank:en
레시피가 완료되면 다음과 같이 보이는 내용이있는 patterns.jsonl
파일이 있습니다.
{ "label" : " skateboard-tricks " , "pattern" :[{ "lower" : " pop " },{ "lower" : " shove " },{ "lower" : " it " }]}
{ "label" : " skateboard-tricks " , "pattern" :[{ "lower" : " switch " },{ "lower" : " flip " }]}
{ "label" : " skateboard-tricks " , "pattern" :[{ "lower" : " nose " },{ "lower" : " slides " }]}
{ "label" : " skateboard-tricks " , "pattern" :[{ "lower" : " lazerflip " }]}
{ "label" : " skateboard-tricks " , "pattern" :[{ "lower" : " lipslide " }]}
...
OpenAI는 프롬프트 크기에 어려운 제한이 있습니다. 4079 토큰보다 큰 프롬프트를 가질 수 없습니다. 불행히도 그것은 당신이 생성 할 수있는 용어 목록의 크기에 제한이 있음을 의미합니다. 레시피는 이런 일이 발생하면 오류를보고하지만이 제한을 알고있는 것이 좋습니다.
ab.openai.prompts
: A/B 프롬프트 평가이 레시피의 목표는 누군가가 두 프롬프트의 출력 품질을 정량화되고 맹목적으로 비교할 수 있도록하는 것입니다.
python -m prodigy ab.openai.prompts dataset inputs_path display_template_path prompt1_template_path prompt2_template_path [--options] -F ./recipes/openai_ab.py
논쟁 | 유형 | 설명 | 기본 |
---|---|---|---|
dataset | str | 응답을 저장하기위한 프로디지 데이터 세트 | |
inputs_path | 길 | JSONL 입력 경로 | |
display_template_path | 길 | 인수를 요약하기위한 템플릿 | |
prompt1_template_path | 길 | 첫 번째 Jinja2 프롬프트 템플릿으로가는 경로 | |
prompt2_template_path | 길 | 두 번째 Jinja2 프롬프트 템플릿으로가는 경로 | |
--model , -m | str | 완료에 사용할 GPT-3 모델 | "text-davinci-003" |
--batch-size , -b | int | OpenAI API로 보낼 배치 크기 | 10 |
--verbose , -v | 부 | 터미널에 추가 정보를 인쇄하십시오 | False |
--no-random , -NR | 부 | 어떤 주석이 올바르게 표시되는지 무작위 화하지 마십시오 | False |
--repeat , -r | int | OpenAI에 동일한 프롬프트를 얼마나 자주 보내야하는지 | 1 |
예를 들어, 유머러스 한 Haikus를 생성 해 보겠습니다. 이를 위해서는 먼저 OpenAI로 보내는 프롬프트를 나타내는 두 개의 Jinja 파일을 구성해야합니다.
templates/ab/prompt1.jinja2
Write a haiku about {{topic}}.
templates/ab/prompt2.jinja2
Write an incredibly hilarious haiku about {{topic}}. So funny!
필요한 매개 변수가있는 .jsonl 파일을 구성하여 이러한 프롬프트에 대한 변수를 제공 할 수 있습니다. 이 경우 {{topic}}
이 설명되어 있는지 확인해야합니다.
다음은 작동 할 수있는 예 .jsonl
파일입니다.
data/ab_example.jsonl
{ "id" : 0 , "prompt_args" : { "topic" : " star wars " }}
{ "id" : 0 , "prompt_args" : { "topic" : " kittens " }}
{ "id" : 0 , "prompt_args" : { "topic" : " the python programming language " }}
{ "id" : 0 , "prompt_args" : { "topic" : " maths " }}
메모
prompt_args
의 모든 인수는 Jinja 템플릿을 렌더링하기 위해 전달됩니다.id
필수이며 나중에 분석에서 그룹을 식별하는 데 사용할 수 있습니다.
우리는 거의 평가할 준비가되었지만이 레시피에는 하나의 최종 Jinja2 템플릿이 필요합니다. 이것은 프롬프트를 생성하는 데 사용되지 않지만 현재 작업의 주석을 상기시키는 유용한 제목을 생성합니다. 다음은 이러한 템플릿의 예입니다.
templates/ab/input.jinja2
A haiku about {{topic}}.
이 템플릿을 모두 정리하면 주석을 달 수 있습니다. 아래 명령은 주석 인터페이스를 시작하고 --repeat 4
옵션도 사용합니다. 이렇게하면 각 주제가 프롬프트를 4 번 이상 생성하는 데 사용됩니다.
python -m prodigy ab.openai.prompts haiku data/ab_example.jsonl templates/ab/input.jinja2 templates/ab/prompt1.jinja2 templates/ab/prompt2.jinja2 --repeat 5 -F recipes/openai_ab.py
이것이 주석 인터페이스의 모습입니다.
이 인터페이스를 보면 제목 템플릿이 렌더링되고 두 가지 옵션에서 선택할 수 있음을 알 수 있습니다. 두 옵션 모두 두 개의 프롬프트 템플릿에서 생성 된 OpenAI의 응답입니다. 선택 메뉴의 오른쪽 하단에 렌더링 된 prompt_args
볼 수 있습니다.
여기에서 좋아하는 예제에 주석을 달고 어떤 프롬프트가 가장 좋은지 결정하는 데 도움이 될 수있는 데이터를 수집 할 수 있습니다.
주석이 완료되면 결과에 대한 개요가 제공됩니다.
=========================== Evaluation results ===========================
✔ You preferred prompt1.jinja2
prompt1.jinja2 11
prompt2.jinja2 5
그러나 추가 분석을 위해 데이터베이스에서 원시 주석을 가져올 수도 있습니다.
python -m prodigy db-out haiku
이에 대한 흥미로운 후속 실험이 많이 있으며, 기본 아이디어를 다른 작업이나 데이터 세트에 조정하는 방법이 많이 있습니다. 우리는 또한 다른 프롬프트를 시도하는 데 관심이 있습니다. 주석이 요청되는 형식이 모델의 예측을 변경하는 것이 확실하지 않거나, 더 짧은 프롬프트가 수행 될 수 있는지 여부는 확실하지 않습니다. 또한 엔드 투 엔드 실험을 실행하고 싶습니다.