최근 우리는 API 사양을 모두 명시하는 단일 텍스트 파일인 Meta-Prompt를 발표했습니다. 이것은 LLM을 위한 문서라고 생각하면 되며, Reader, Embeddings, Reranker 등을 포함한 우리의 API 통합을 자동으로 생성하는 데 사용할 수 있습니다.
우리의 프롬프트를 ChatGPT/Claude에 복사하여 붙여넣거나 llm
명령에 시스템 프롬프트로 전달한 다음, 원하는 것을 구축하도록 자신의 프롬프트를 추가하는 것만으로도 충분합니다 (아래에서 보여드리겠습니다). 웹을 스크래핑하거나, 임베딩을 다루거나, 심지어 완전한 RAG 시스템을 구축하는 앱을 LLM을 사용하여 빠르게 만들고 싶을 때 유용합니다. 그것도 최소한의 환각으로 말이죠.
tagMeta-Prompt가 왜 필요한가요?
Jina의 API를 사용하는 코드를 생성하기 위해 LLM을 사용하고 싶다고 가정해 봅시다. GPT-4에게 바로 그것을 요청해 보겠습니다:
좋아 보이죠? from jina import Client
도 있고 모든 게 갖춰져 있습니다.
하지만 한 가지 작은 문제가 있습니다: Jina 패키지는 유지 보수 모드이며, 이것은 우리의 API에 접근하는 올바른 방법이 아닙니다. Jina 패키지를 설치하더라도 생성된 프로그램을 실행하려고 하면 오류가 발생할 것입니다:
그래서 어떻습니까? GPT에게 Jina API를 웹에서 검색하도록 요청하면 되지 않을까요? 다음과 같은 결과를 얻었습니다:
하지만 코드를 보면 관련된 모든 Jina API를 사용하지는 않습니다. Reader가 있다는 것을 전혀 발견하지 못하고 대신 스크래핑을 위해 BeautifulSoup를 설치하도록 했습니다. 그리고 BeautifulSoup으로 스크래핑을 할 수 있다고 (가정했을 때도), Jina Embeddings의 응답 형식을 정확하게 파싱하지 못해 오류가 발생했습니다:
하지만 ChatGPT가 제대로 할 수 있다 하더라도, Claude와 같은 다른 많은 LLM들은 현재 웹 검색을 지원하지 않아 옵션이 크게 제한됩니다.
여기서 Meta-Prompt가 빛을 발합니다. Meta-Prompt를 사용하면 Jina의 API 사양과 컨텍스트를 모두 LLM에 로드할 수 있습니다. 이는 LLM이 환각이나 불필요한 우회 없이 Jina의 API를 직접 활용하는 코드를 생성할 수 있다는 것을 의미하며, 첫 시도부터 작동하는 코드를 얻을 수 있습니다.
tagMeta-Prompt를 이용한 실험
Meta-Prompt를 시험하기 위해 몇 가지 실험을 진행하고 결과를 평가했습니다. 별도로 명시하지 않는 한, LLM으로는 Claude-3.5-Sonnet를 사용했습니다.
모든 실험에서 생성된 코드를 실행하기 전에 JINA_API_KEY
와 ANTHROPIC_API_KEY
와 같은 관련 API 키를 환경 변수로 지정했습니다.
tag실험 1: ChatGPT에서 Meta-Prompt를 사용하여 문장 검증하기
미국 선거 직후에 이 글을 쓰고 있는데, 그 어느 때보다도 많은 허위정보가 돌아다니고 있습니다. 우리의 피드에서 어떻게 노이즈를 걸러내고 거짓 없이 좋은 정보만 얻을 수 있을까요?
새로운 영국 법률이 BBC.com에 정확하게 보도되었는지 확인하고 싶다고 가정해 봅시다. 구체적으로 다음 주장을 확인하려고 합니다:
"영국 정부가 소셜 미디어 기업들에게 사용자의 나이를 확인하도록 요구하는 새로운 법률을 발표했다."
ChatGPT에 Meta-Prompt를 복사-붙여넣기한 다음, 다음과 같이 코드를 생성하는 프롬프트를 입력할 수 있습니다:
Write the JavaScript code to check the validity
of the following statement on bbc.com:
"The UK government has announced a new law
that will require social media companies to
verify the age of their users."
그런 다음 이것을
node grounding.js
(필요한 axios와 같은 패키지를 설치한 후). 다음과 같이 주장이 사실임을 보여주는 출력과 출처를 얻을 수 있습니다:tag실험 2: CLI에서 Hacker News 시각화하기
명령줄 애호가라면 cURL을 통해 CLI에서 Meta-Prompt를 사용할 수 있습니다. 먼저 llm
Python 패키지를 설치해야 합니다:
pip install llm
그리고 Claude-3 플러그인을 설치합니다:
llm install llm-claude-3
설정의 마지막 단계로 Anthropic API 키를 지정합니다:
export ANTHROPIC_API_KEY=
이제 Hacker News 첫 페이지의 모든 문장을 시각화하는 프롬프트를 작성해 보겠습니다:
grab every sentence from hackernews frontpage and
visualize them in a 2d umap using matplotlib
이것을 다음과 같이 llm
명령어에 파이프로 연결할 수 있습니다:
curl docs.jina.ai | llm -s "grab every sentence from hackernews frontpage and visualize them in a 2d umap using matplotlib" -m claude-3.5-sonnet
생성된 코드를 추출하여 실행하면 다음과 같은 결과를 얻을 수 있습니다:
requirements.txt
가 생성되지 않습니다. 이 경우 UMAP와 Matplotlib가 필요했지만, 상황에 따라 다를 수 있습니다.tag실험 3: JSON 스토리지를 사용한 간단한 RAG 시스템 구축
더 나아가기 위해 간단한 RAG 시스템을 만들어보겠습니다. 저는 여가 시간에 SolidPython을 배우고 있어서 이 리포지토리와 위키를 지식 베이스로 사용하겠습니다. 간단하게 하기 위해 데이터베이스를 사용하지 않고 JSON 파일에 데이터를 저장하겠습니다.
다음은 prompt.txt
파일에 저장된 프롬프트입니다:
Create a simple RAG system using pages from these sources:
- repo: <https://github.com/jeff-dh/SolidPython>
- wiki: <https://github.com/jeff-dh/SolidPython/wiki> (and all the subpages)
Scrape no other pages.
Instead of using vector database, use JSON file
You can access an LLM with the CLI command: llm 'your prompt' -m claude-3.5-sonnet
After segmenting and indexing all the pages, present a prompt for the user to ask a
question. To answer the question, find the top three segments and pass them to the LLM
with the prompt:
--- prompt start ---
Based on these segments:
- {segment 1}
- {segment 2}
- {segment 3}
Answer the question: {question}
--- prompt end ---
보시다시피 프롬프트에서 도구를 지정하여 LLM에 추가 도구를 제공할 수 있습니다. 이렇게 하지 않으면 Claude는 종종 RAG 시스템에 LLM을 추가하는 덜 최적화된(또는 심지어 손상된) 방법을 환각할 수 있습니다.
이것은 매우 긴 프롬프트이고(파이프에서 실행할 때 문제가 될 수 있는 구두점이 많으므로) 명령을 실행할 때 프롬프트 자체 대신 $(cat prompt.txt)
텍스트를 사용하겠습니다:
curl docs.jina.ai/v4 | llm -s "$(cat prompt.txt)" -m claude-3.5-sonnet
와! 출력이 정말 많네요. 하지만 (Hacker News 예제처럼) 그 큰 텍스트 덩어리에서 코드를 추출하고 실행하는 것은 번거롭습니다. 물론 더 많은 LLM을 투입하면 해결할 수 없는 문제는 없겠죠? 그래서 원래 출력을 "해제"하기 위한 또 다른 프롬프트를 추가해 보겠습니다:
leave just the code in this file, remove all surrounding explanatory text.
do not wrap code in backticks, just return "pure code"
이제 이것을 우리의 명령 파이프라인에 추가하고 실행합니다:
curl docs.jina.ai/v4 | llm -s "$(cat prompt.txt)" -m claude-3.5-sonnet | llm -s 'leave just the code in this file, remove all surrounding explanatory text. do not wrap code in backticks, just return "pure code"' -m claude-3.5-sonnet > app.py
> app.py
를 사용하여 모든 출력을 파일로 보내고 있기 때문에 비디오로 보여줄 내용이 없습니다.그런 다음 python app.py
로 앱을 실행할 수 있고, 보시다시피 질문에 답변하고 작업 메모리를 유지할 수 있습니다:
tag실험 4: 메타 프롬프트로 앱 팩토리 구축하기
이제 스크립트와 앱을 비대화형으로 생성할 수 있으므로 프롬프트를 반복하고 Python 스크립트를 출력으로 생성하는 "앱 팩토리"를 쉽게 자동화할 수 있습니다. 앱 팩토리 스크립트는 현재 GitHub gist에서 얻을 수 있습니다:

간단히 말해서, 이것이 하는 일은 다음과 같습니다:
- 프롬프트 파일이 포함된
prompts
디렉토리를 반복합니다. - 메타 프롬프트와 각 프롬프트 텍스트를
llm
을 통해 Claude-3.5-Sonnet에 전달합니다. - 출력을 가져와서 코드만 남기라는 프롬프트와 함께 다시 Claude에 전달합니다.
- 그것을
apps
디렉토리의 파일에 씁니다.
데모를 보여드리고 싶지만, 볼 것이 많지 않습니다. 작업 중인 프롬프트 파일 이름만 기록하고, 그 외에는 화면에 흥미로운 출력 없이 조용히 동작합니다.
앱 팩토리를 한 단계 더 발전시키려면, Factorio 스타일로 가서 앱 아이디어를 생성하고 그로부터 팩토리에 공급할 프롬프트를 생성하는 또 다른 스크립트를 작성할 수 있습니다. 우리는 아직 그렇게 하지 않았지만, 독자 여러분을 위한 과제로 남겨두겠습니다.
tagMeta-Prompt로 실험하기: 무엇을 발견했나요?
Meta-Prompt를 사용하면서 우리 자신의 프롬프트에 무엇을 넣어야 하는지, 그리고 서로 다른 LLM이 어떻게 다른 출력을 생성하는지에 대해 많이 배웠습니다.
tag일반적인 관찰
- API 전문화: 작업별 전용 API(예: 도서 관련 쿼리를 위한 Google Books)를 사용하면 범용 검색 API보다 더 일관된 결과를 보장하며, 이는 토큰 사용량을 줄이고 신뢰성을 향상시킵니다.
- 재사용성을 위한 커스텀 프롬프트: 비대화형 설정의 경우, 프롬프트를
.txt
파일로 저장하고 CLI로 파이핑하면 추가 설명 텍스트 없이 효율적으로 코드만 출력할 수 있습니다. - 구조화된 출력: 출력(주로 JSON 형식)을 저장하고 필요할 때 다시 로드하면 토큰을 절약하고 토큰 사용이 비싼 임베딩 생성과 같은 작업을 간소화할 수 있습니다.
tag다양한 LLM 사용에서 얻은 인사이트
GPT
- 프롬프트 유지 문제: GPT-4o는 긴 지시사항에서 세부사항을 놓치는 경우가 있어, 토론 중에 핵심 요소를 "잊어버리는" 문제가 발생합니다. 이는 간단한 것들을 상기시켜야 할 때 많은 좌절감을 초래합니다.
- API 통합 문제: Milvus Lite를 jina-embeddings-v3와 통합하는 경우처럼, Milvus Lite API 지침을 제공해도 GPT-4o는 완전히 실패하며 반복적으로 코드가 방금 생성한 임베딩이 없는 데이터베이스를 생성하여 의미 검색 애플리케이션을 불가능하게 만듭니다.
Claude
- 코드 출력 제한사항: Claude-3.5는 종종 완전해 보이지만 오류 처리 누락이나 API 키 누락을 고려하지 않는 등의 숨겨진 문제가 있는 스크립트를 생성합니다. 또한 때때로 특정 지시사항에 맞춘 응답을 생성하지 않고 미리 설정된 예제로 돌아가기도 합니다.
- 무음 출력: LLM이 생성한 코드에서는 모델이 문제를 일으키지 않았는지 확인하기 위해 프로그램 실행 중에 무슨 일이 일어나는지 로깅하는 것이 정말 도움이 됩니다. 직접 지정하지 않으면 Claude로 만든 앱은 자주 무음으로 실행되어 무슨 일이 일어나는지 알 수 없습니다.
- CLI와의 상호작용: CLI 명령이 CLI 명령이라는 것을 명확히 지정해야 합니다. Claude에게
llm
명령을 사용할 수 있다고 말하면, 존재하지 않는 Pythonllm()
함수를 호출하려고 시도하는 경우가 많습니다. - Claude 3.5-Sonnet이 최선의 선택입니다: Claude-3.5-Haiku도 초기 테스트에서는 괜찮아 보였지만, Opus와 Sonnet-3는 사용자 프롬프트를 고려하지 않고 Jina API 지침을 요약하기만 합니다.
tag결론
Meta-Prompt를 사용하면 Jina의 API를 LLM과 통합하는 새로운 방법을 제공하여 처음 시도에서 작동하는 실험과 앱을 구축할 수 있습니다. 더 이상 충돌, 놓친 API 연결, 환각된 함수가 없습니다 — Meta-Prompt는 생성된 코드가 정확하고 바로 작동하도록 보장합니다. 진술 검증, 임베딩 생성, 경량 RAG 시스템 구축 또는 앱 생성 자동화 등 어떤 작업을 하든, Meta-Prompt는 자연어 지시사항을 실제로 작동하는 실행 가능한 정확한 코드로 변환합니다.
ChatGPT에 Meta-Prompt를 복사하든 커스텀 LLM 명령과 함께 사용하든, Jina의 기능을 활용하는 간단하고 신뢰할 수 있는 방법을 제공합니다. 우리의 실험과 인사이트는 Meta-Prompt가 프로젝트에 견고하게 통합될 수 있는 강력한 도구임을 보여줍니다.
Meta-Prompt로 무엇을 할 수 있는지 탐험할 준비가 되셨다면, docs.jina.ai에서 최신 문서와 리소스를 확인하세요.