- BrainTools - https://www.braintools.ru -

Машинный перевод с локальным контекстом в Obsidian Copilot

Мне по работе часто приходится заниматься переводом, и чтобы упростить себе жизнь, я решил настроить себе помощника, который был бы знаком с контекстом моей работы. Ниже делюсь результатами своих экспериментов.

Переводчик в своей работе ориентируется не просто на какой-то язык, а на терминологию и стилистику определённого сообщества. Мой основной рабочий процесс выстроен в Obsidian (подробнее об этом я писал вместе с Игнатием Сатирским [1]), и я подумал, что база знаний, которая накопилась на этой платформе, может послужить «отражением» терминологии и стилистики, на которые мог бы опираться помощник. Я стал искать плагин, который давал бы интеграцию с нейросетью, и из всех возможных вариантов наиболее зрелым мне показался Obsidian Copilot — о нём и пойдёт речь.

Я не рассчитываю, что нейросеть сможет произвести чистовой текст, который сразу можно было бы сдавать как выполненную работу. Но я надеюсь, что получится облегчить мне труд при редактировании. Посмотрим, оправдает ли инструмент мои надежды.

Хранилище с использованными плагинами и результатами экспериментов доступно здесь [2].

Настройка

Инфраструктура получилась несложная. Я попробовал две нейросети с бесплатным API, одну локальную и одну удалённую:

Машинный перевод с локальным контекстом в Obsidian Copilot - 1

Начал с настройки самого Copilot.

Obsidian Copilot

Для эксперимента я создал новое хранилище:

Машинный перевод с локальным контекстом в Obsidian Copilot - 2

Затем перешёл в настройки:

Машинный перевод с локальным контекстом в Obsidian Copilot - 3

Дальше щёлкнул:

Сторонние плагины > Плагины сообщества

В появившемся окне плагинов вбил в поисковой строке «Copilot»:

Машинный перевод с локальным контекстом в Obsidian Copilot - 4

Щёлкнул по плагину, а затем нажал Установить > Включить.

Теперь дело за нейросетью.

Gemini

Вначале я подключил стороннюю нейросеть от Gemini. Этот сервис предоставляет доступ и ограниченное количество бесплатных токенов для API модели — ровно то, что нужно для эксперимента.

Вначале мне понадобился аккаунт на https://aistudio.google.com/ [3]; с ним я создал ключ API:

Машинный перевод с локальным контекстом в Obsidian Copilot - 5

В AI Studio был проект по умолчанию, и первый созданный ключ был в этом проекте, но у Copilot не получилось к нему подключиться. Когда я создал новый проект и ключ в нём, всё заработало.

Ключ провайдера в Copilot

Дальше я добавил только что созданный ключ Gemini в Copilot.

В настройках Obsidian в разделе Сторонние плагины я выбрал Copilot, чтобы открыть настройки плагина. На вкладке Basic (настройки в плагине англоязычные) выбрал General > API Keys > Set Keys:

Машинный перевод с локальным контекстом в Obsidian Copilot - 6

И вставил ключ Gemini:

Машинный перевод с локальным контекстом в Obsidian Copilot - 7

Добавление нужной модели

Дальше нужно было добавить модель. На вкладке настроек плагина я открыл Model, затем щёлкнул Add Model (если выбранная модель есть среди моделей по умолчанию, этого делать не нужно). Открылось окно:

Машинный перевод с локальным контекстом в Obsidian Copilot - 8

Здесь я сделал следующее:

  • Ввёл имя модели в Model Name.

  • Ввёл имя поставщика в Provider (остальные поля в моём случае заполнять не нужно).

  • Проверил, доступна ли модель, кнопкой Test.

  • Щёлкнул AddModel.

После этого модель появилась в списке доступных на вкладке Model.

Последний шаг: на вкладке Basic в General > Default Chat Model я выбрал только что добавленную модель.

Ollama

Я хотел так же оценить, насколько для моих целей подходит нейросеть, локально развёрнутая с Ollama.

Скачал и установил [4] Ollama, затем выбрал модель. Для моего железа и моих целей я решил попробовать Qwen3, и ввёл в консоли:

ollama pull qwen3:30b

Затем запустил модель, чтобы ей могли пользоваться другие приложения:

ollama serve

Чтобы проверить, что модель запущена и ожидает запросы, я открыл в браузере адрес http://localhost:11434 [5]: там появилось сообщение “Ollama is running”.

Наконец, чтобы связать Copilot с локальной моделью, я повторил шаги из Добавление нужной модели [6].

Перевод с помощником

Инфраструктура готова — можно проверять работу помощника.

Фича, которая заинтересовала меня с самого начала — возможность добавлять заметки из хранилища в чат с нейросетью. Если обернуть имя заметки в две квадратные скобки (как обычные ссылки в Obsidian), оно станет ссылкой:

Машинный перевод с локальным контекстом в Obsidian Copilot - 9

Заметку также можно добавить кнопкой @ Add Context:

Машинный перевод с локальным контекстом в Obsidian Copilot - 10

Точно так же можно добавить папку, обернув её имя в фигурные скобки, например:

{корпус текстов об Allure Report}

Пользуясь этими фичами, я попробовал перевести свой англоязычный гайд по Allure Report: https://allurereport.org/docs/guides/junit5-parametrization/ [7]

В качестве образцов я дал нейросети несколько своих русскоязычных текстов по тому же инструменту. Получились такие промпты:

  • “Переведи текст в источник [8] на русский язык, опираясь на стилистику и терминологию, принятую в IT-сообществе.”

  • “Ориентируясь на стилистику, терминологию и формат в Работа с нестабильными тестами в Allure 3 [9] , переведи источник [8] на русский язык.”

  • “Ориентируясь на стилистику и терминологию в {корпус текстов об Allure Report}, переведи источник [8] на русский язык.”

У этого подхода тут же обнаружились минусы.

Во-первых, контекста может быть слишком много [10]. Я почти сразу перескочил за размер контекстного окна, когда отправил модели запрос с целой папкой текстов. Чтобы работать с большим корпусом текстов, нужен RAG — в том же Copilot эту технологию использует специальный режим «Vault QA»; есть и другие эксперименты с RAG в Obsidian: тут [11] и тут [12]. Отложив этот вопрос на будущее, я пока просто сократил корпус «образцовых» текстов.

Во-вторых, добавление эталонных текстов, кажется, не слишком повлияло на перевод. Вначале я был оптимистичен: Gemini, «подкормленный» моими текстами, давал более органичный перевод, а не подстрочник:

Оригинал

Простой промпт

Промпт с контекстом

When writing automated tests, we often use parameterization, which means running the same test with different inputs.

При написании автоматизированных тестов мы часто используем параметризацию, что означает запуск одного и того же теста с различными входными данными.

При написании автоматизированных тестов часто используется параметризация — запуск одного и того же теста с различными входными данными.

The first solution that comes to mind is just creating a loop inside the test. Something like this:

Первое решение, которое приходит на ум, — это просто создать цикл внутри теста. Что-то вроде этого:

Первое, что приходит на ум, — это просто создать цикл внутри теста. Например, так:

Но потом, когда я повторил эти эксперименты на Gemini и Gwen, оказалось, что иногда выходит наоборот: с контекстом получается подстрочник, без него — более органичный. Кажется, дополнительные тексты здесь не помогли.

Ещё один вывод, который я сделал на этом этапе: работать с Gemini гораздо удобнее. Локальная нейросеть выполняет перевод за 10 минут, а если с несколькими текстами — может «думать» все полчаса. Gemini же справляется примерно за минуту.

Наконец, положительное впечатление [13]: в целом качество перевода было неплохим, переводчик с таким текстом может работать редактором, а не переписывать его начисто.

Я решил попробовать другой подход: вместо размытой просьбы имитировать стиль — конкретные инструкции по стилю.

Руководство по стилю

Раз чат с нейросетью у меня под рукой, я решил попросить Gemini написать руководство по стилю:

«Ты — редактор текстов. Проанализируй стиль заметок в {корпус текстов об Allure Report}, и напиши краткое руководство по стилю».

Из этого руководства я взял раздел по языку и тону (остальное для перевода не актуально), слегка подправил, вышло следующее:

Язык: Русский.

  • Тон:

    • Информативный, технический, практический и обучающий.

    • Избегайте излишней формальности, но сохраняйте профессионализм.

    • Прямое, активное обращение к читателю, например, «вы теперь можете просто посмотреть», «попробуем запустить», или «Давайте разберёмся»

    • Проблемно-ориентированный подход: сначала описывается проблема или вопрос (например, «Why does this happen?» / «Почему это происходит?»), затем предлагается решение или объяснение

    • Объяснительный и направляющий: используются фразы типа «Как вы видите…» или «Теперь, если мы перезапустим…» для комментирования результатов и демонстрации.

    • Стремитесь объяснять сложные технические концепции максимально понятно, ориентируясь на аудиторию разработчиков и тестировщиков.

  • Словарный запас:

    • Используйте устоявшуюся IT-терминологию (например, «параметризация», «интеграция», «фреймворк», «пайплайн», «декораторы», «адаптеры»).

    • Избегайте жаргона, который может быть непонятен широкой аудитории.

  • Краткость и ясность:

    • Предложения должны быть четкими и по существу.

    • Избегайте избыточных слов и сложных грамматических конструкций.

Для первого раза неплохо. Но я добавил ещё несколько пунктов, которые всегда актуальны, и которые легко проверить:

  • Орфография:

    • Используйте букву «ё» там, где этого требует орфография.

  • Синтаксис:

    • Используйте кавычки-ёлочки («»).

    • Используйте длинное тире (—).

Дальше я сделал промпт с этим руководством:

«Ты — профессиональный переводчик. Переведи текст в источник [8] на русский язык, руководствуясь инструкциями в Руководство по стилю [14]».

И вот здесь уже есть конкретная польза: без руководства нейросеть использует букву «ё» по настроению, с ним — всегда.

Сохранённые промпты

В Copilot есть ещё одна полезная возможность: промпты можно сохранять для быстрого использования. Для этого нужно открыть в настройках вкладку Command и щёлкнуть + Add Cmd, чтобы открылось окно:

Машинный перевод с локальным контекстом в Obsidian Copilot - 11

В нём я ввёл следующий промпт:

{activeNote}
{[[Руководство по стилю]]}
Ты — профессиональный переводчик в паре английский-русский. Переведи, пожалуйста, текст из первого файла, следуя руководству по стилю во втором файле. Старайся избегать подстрочного перевода. 

Здесь {activeNote} – открытая в данный момент заметка, {[[Стиль]]} – ссылка на документ.

Теперь этот промпт можно вызвать, щёлкнув правой кнопкой мыши в заметке, которую мы хотим перевести. В выпадающем меню нужно выбрать Copilot > Перевод с английского (здесь будет имя нашего промпта):

Машинный перевод с локальным контекстом в Obsidian Copilot - 12

Кроме того, эту команду можно быстро вызвать в чате, введя «/»: система предложит на выбор список имеющихся команд. Или через «палитру команд»:

Машинный перевод с локальным контекстом в Obsidian Copilot - 13

А любую команду из палитры можно добавить в качестве кнопки на интерфейс с помощью плагина «Commander»:

Машинный перевод с локальным контекстом в Obsidian Copilot - 14

Я сразу понял, что мне будет удобно держать под рукой библиотеку команд не только для перевода, например:

{activeNote}
Ты — профессиональный редактор. Проверь, пожалуйста, текст в заметке на соответствие нормам, указанным в {[[Руководство по стилю]]}. Выведи исправленный текст.

Кажется, рабочий процесс сложился. У Obsidian Copilot есть много возможностей, о которых я не упомянул — тот же чат с хранилищем с помощью RAG; но для начала мне хватит уже описанных фич.

Сухой остаток

Какие получились результаты? Не совсем те, на которые я рассчитывал, но интересные.

У меня появился ИИ-помощник в чате, интегрированном в рабочее пространство. Ему легко предоставить доступ ко всем документам, с которыми я работаю. Заставить его имитировать язык текстов в хранилище не получилось — для этого нужны другие инструменты. А вот хранить наиболее часто используемые инструкции в виде вспомогательных инструментов и промптов оказалось очень полезно.

В этом эксперименте я использовал бесплатные модели — локальные и удалённые. С платной моделью, очевидно, качество перевода будет выше. Если заплатить за токены кому-нибудь из флагманов, процесс подключения их модели такой же, какой описан здесь.

Конечно, эксперименты на этом не закончатся. Я буду интегрировать Copilot с другими плагинами и инструментами, чтобы сделать рабочую экосистему более удобной, и, если эта тема интересна сообществу, буду продолжать делиться результатами здесь.

Автор: mikhail-lankin

Источник [15]


Сайт-источник BrainTools: https://www.braintools.ru

Путь до страницы источника: https://www.braintools.ru/article/27853

URLs in this post:

[1] вместе с Игнатием Сатирским: https://habr.com/ru/companies/testops_tms/articles/967680/

[2] здесь: https://github.com/rattus-aristarchus/obsidian-llm-demo

[3] https://aistudio.google.com/: https://aistudio.google.com/

[4] Скачал и установил: https://ollama.com/download

[5] http://localhost:11434: http://localhost:11434

[6] Добавление нужной модели: #%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BD%D1%83%D0%B6%D0%BD%D0%BE%D0%B9%20%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8

[7] https://allurereport.org/docs/guides/junit5-parametrization/: https://allurereport.org/docs/guides/junit5-parametrization/

[8] источник: https://%D0%B8%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA

[9] Работа с нестабильными тестами в Allure 3: https://%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%20%D1%81%20%D0%BD%D0%B5%D1%81%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC%D0%B8%20%D1%82%D0%B5%D1%81%D1%82%D0%B0%D0%BC%D0%B8%20%D0%B2%20Allure%203

[10] контекста может быть слишком много: https://platform.claude.com/docs/en/build-with-claude/context-windows

[11] тут: https://habr.com/ru/articles/929692/

[12] тут: https://github.com/Vasallo94/ObsidianRAG

[13] впечатление: http://www.braintools.ru/article/2012

[14] Руководство по стилю: https://%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%BF%D0%BE%20%D1%81%D1%82%D0%B8%D0%BB%D1%8E

[15] Источник: https://habr.com/ru/companies/testops_tms/articles/1015990/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1015990

www.BrainTools.ru

Rambler's Top100