Недавно мы опубликовали Meta-Prompt, один текстовый файл, который описывает все наши спецификации API. Его можно рассматривать как документацию для LLM, и использовать для автоматической генерации интеграций наших API, включая Reader, Embeddings, Reranker и другие.
Это так же просто, как скопировать и вставить наш промпт в ChatGPT/Claude, или передать его в команду llm
как системный промпт, а затем добавить свой собственный промпт, чтобы указать, что вы хотите создать (что мы делаем ниже). Это отлично подходит, если вы хотите использовать LLM для быстрого создания приложений, которые парсят веб, работают с embeddings или даже полноценных RAG-систем. И всё это с минимальными галлюцинациями.
tagЗачем мне вообще нужен Meta-Prompt?
Допустим, вы хотите использовать LLM для генерации кода, использующего API Jina. Давайте попросим GPT-4 сделать именно это:
Выглядит хорошо, правда? Есть from jina import Client
и всё остальное.
Одна небольшая проблема: пакет Jina находится в режиме поддержки, и это не тот способ, которым нужно обращаться к нашим API. Даже если вы действительно установите пакет Jina, сгенерированная программа упадёт при попытке запуска:
Тем не менее, даже если бы ChatGPT мог правильно это сделать с помощью поиска, многие другие LLM (например, Claude) в настоящее время не поддерживают веб-поиск, что серьезно ограничивает ваши возможности.
Вот где блистает Meta-Prompt. С помощью Meta-Prompt вы можете загрузить весь контекст и спецификации API Jina в LLM. Это означает, что LLM может генерировать код, который напрямую использует API Jina, без галлюцинаций или ненужных обходных путей, давая вам код, который работает с первого раза.
tagЭксперименты с Meta-Prompt
Чтобы проверить Meta-Prompt в действии, мы провели несколько экспериментов и оценили результаты. Если не указано иное, мы использовали Claude-3.5-Sonnet в качестве LLM.
Для всех экспериментов мы указали соответствующие API-ключи (такие как JINA_API_KEY
и ANTHROPIC_API_KEY
) как переменные среды перед запуском сгенерированного кода.
tagЭксперимент 1: Проверка утверждений с помощью Meta-Prompt в ChatGPT
Мы пишем это сразу после выборов в США, когда дезинформации было больше, чем когда-либо. Как нам отделить сигнал от шума в наших лентах и получить только хорошее без лжи?
Допустим, мы хотим проверить, точно ли сообщается о новом законе Великобритании на BBC.com, в частности, утверждение:
"Правительство Великобритании объявило о новом законе, который будет требовать от компаний социальных сетей проверять возраст своих пользователей."
Мы можем скопировать Meta-Prompt в ChatGPT, затем написать свой собственный промпт для генерации кода, например:
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: Визуализация Hacker News из командной строки
Если вы предпочитаете работать в командной строке, вы можете использовать Meta-Prompt через cURL. Сначала вам нужно установить пакет Python llm
:
pip install llm
А затем плагин Claude-3:
llm install llm-claude-3
На последнем этапе настройки укажите ваш API ключ Anthropic:
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: Создание простой системы RAG с хранением в JSON
Чтобы продвинуться еще дальше, давайте создадим простую систему 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 часто придумывает менее оптимальный (или даже нерабочий) способ добавления LLM в систему RAG.
Поскольку это очень длинный промпт (с множеством знаков пунктуации, которые могут нарушить работу любого пайпа), мы будем использовать текст $(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
, и мы получим нашу RAG-программу. Как видите, она может отвечать на вопросы и поддерживать рабочую память:
tagЭксперимент 4: Создание фабрики приложений с Meta-Prompt
Теперь, когда мы можем генерировать скрипты и приложения неинтерактивно, мы можем легко автоматизировать "фабрику приложений" — скрипт, который перебирает промпты и создает Python-скрипты на выходе. Вы можете получить скрипт фабрики приложений в GitHub gist:

Если кратко, вот что он делает:
- Перебирает директорию
prompts
, которая содержит (как вы догадались) файлы с промптами. - Передает Meta-Prompt и каждый текст промпта Claude-3.5-Sonnet (через
llm
). - Берет вывод и снова передает его Claude, на этот раз с промптом, указывающим оставить только код.
- Записывает это в файл в директории
apps
.
Мы бы показали демонстрацию, но смотреть особо нечего. Он просто регистрирует, с каким файлом промпта работает, а в остальном работает молча без интересного вывода на экран.
Чтобы поднять фабрику приложений на следующий уровень, можно пойти по пути Factorio и написать ещё один скрипт для генерации идей приложений и на их основе создавать промпты для подачи в фабрику. Мы пока этого не сделали, но оставляем это как упражнение для вас, читателей.
tagЭксперименты с Meta-Prompt: Что мы узнали?
Мы многому научились, используя Meta-Prompt, как в отношении того, что включать в наши промпты, так и в понимании того, как разные LLM генерируют различные выходные данные.
tagОбщие наблюдения
- Специализация API: Использование специализированных API для конкретных задач (например, Google Books для запросов, связанных с книгами) обеспечивает более стабильные результаты, чем универсальные поисковые API, что может сократить использование токенов и повысить надёжность.
- Пользовательские промпты для повторного использования: Для неинтерактивных настроек сохранение промптов в файлы
.txt
и их передача в CLI позволяет эффективно получать только код без лишнего пояснительного текста. - Структурированный вывод: Сохранение выходных данных (обычно в формате JSON) и их повторная загрузка при необходимости экономит токены и упрощает такие задачи, как генерация эмбеддингов, где использование токенов может быть дорогостоящим.
tagВыводы из использования разных LLM
GPT
- Проблемы с сохранением промптов: GPT-4 иногда теряет детали при длинных инструкциях, что приводит к проблемам, когда он "забывает" ключевые элементы в процессе обсуждения. Это вызывает много разочарования, когда приходится напоминать ему о простых вещах.
- Проблемы интеграции API: В случаях, таких как интеграция Milvus Lite с jina-embeddings-v3, даже когда мы предоставляем инструкции по API Milvus Lite, GPT-4 полностью и неоднократно терпит неудачу, генерируя код, который создает базы данных без эмбеддингов, которые только что были сгенерированы, делая невозможным семантический поиск.
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 предоставляет новые способы интеграции API Jina с LLM, позволяя проводить эксперименты и создавать приложения, работающие с первой попытки. Больше никаких сбоев, пропущенных API-соединений или галлюцинированных функций — Meta-Prompt гарантирует, что сгенерированный код точен и функционален сразу после создания. Будь то верификация утверждений, генерация эмбеддингов, создание легкой RAG-системы или автоматизация создания приложений, Meta-Prompt преобразует инструкции на естественном языке в действенный, корректный код, минуя типичный диалог с LLM для получения рабочего результата.
Независимо от того, копируете ли вы Meta-Prompt в ChatGPT или используете его с пользовательской LLM-командой, он предлагает простой, надежный способ использования возможностей Jina. Наши эксперименты и выводы показывают, что Meta-Prompt является надежным инструментом для интеграции в ваши проекты.
Если вы готовы исследовать возможности Meta-Prompt, посетите docs.jina.ai для получения последней документации и ресурсов.