First commit

This is base for automatization translating
This commit is contained in:
anker-na-20
2026-05-21 10:45:27 +03:00
commit b6dd80e749
18 changed files with 222507 additions and 0 deletions
+15
View File
@@ -0,0 +1,15 @@
-- Таблица документов (исходных файлов)
CREATE TABLE IF NOT EXISTS documents (
id SERIAL PRIMARY KEY,
filename VARCHAR(255) NOT NULL,
file_type VARCHAR(20) NOT NULL, -- pdf, docx, txt, ...
original_path TEXT NOT NULL, -- путь к файлу в /data/input
output_path TEXT, -- итоговый PDF с переводом
source_language VARCHAR(10) DEFAULT 'zh',
target_language VARCHAR(10) DEFAULT 'ru',
page_count INT,
status VARCHAR(30) DEFAULT 'pending', -- pending, processing, completed, failed
error_message TEXT,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);
+37
View File
@@ -0,0 +1,37 @@
CREATE TABLE IF NOT EXISTS translations (
id SERIAL PRIMARY KEY,
source_text TEXT NOT NULL,
translated_text TEXT NOT NULL,
raw_output TEXT,
model_name VARCHAR(100) NOT NULL,
prompt TEXT NOT NULL,
prompt_id INT,
created_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS golden_examples (
id SERIAL PRIMARY KEY,
source_text TEXT NOT NULL, -- китайский
reference_text TEXT NOT NULL, -- идеальный русский перевод
domain VARCHAR(50) DEFAULT 'tech',
description TEXT,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
created_by VARCHAR(100)
);
CREATE TABLE IF NOT EXISTS prompt_runs (
id SERIAL PRIMARY KEY,
prompt_id INT NOT NULL REFERENCES prompts(id),
model_name VARCHAR(100) NOT NULL,
golden_example_id INT NOT NULL REFERENCES golden_examples(id),
source_text TEXT NOT NULL,
reference_text TEXT NOT NULL,
model_output TEXT NOT NULL,
llm_score NUMERIC, -- оценка LLM-оценщика (0..10)
bleu_score NUMERIC,
other_metrics JSONB,
created_at TIMESTAMP NOT NULL DEFAULT NOW()
);
+10
View File
@@ -0,0 +1,10 @@
CREATE TABLE IF NOT EXISTS translations (
id SERIAL PRIMARY KEY,
source_text TEXT NOT NULL,
translated_text TEXT NOT NULL,
raw_output TEXT,
model_name VARCHAR(100) NOT NULL,
prompt TEXT NOT NULL,
prompt_id INT,
created_at TIMESTAMP NOT NULL DEFAULT NOW()
);
+40
View File
@@ -0,0 +1,40 @@
-- docker/db/prompts.sql
-- Таблица для хранения версий промптов
CREATE TABLE IF NOT EXISTS prompts (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL, -- логическое имя, напр. 'zh_ru_tech'
version INT NOT NULL, -- 1,2,3...
body TEXT NOT NULL, -- текст промпта
is_active BOOLEAN NOT NULL DEFAULT FALSE,
comment TEXT,
created_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE UNIQUE INDEX IF NOT EXISTS ux_prompts_name_version
ON prompts(name, version);
-- Первая версия системного промпта zh_ru_tech (config/prompts/zh_ru_tech.v1.md)
INSERT INTO prompts (name, version, body, is_active, comment)
VALUES (
'zh_ru_tech',
1,
$PROMPT$
Ты профессиональный переводчик технической документации с китайского языка на русский.
Требования к переводу:
- Переводи строго на РУССКИЙ язык.
- Не добавляй объяснений, комментариев, рассуждений или перевода на другие языки.
- Сохраняй структуру исходного текста: абзацы, списки, заголовки.
- Не изменяй числа, формулы, единицы измерения и обозначения.
- Код, псевдокод и конфигурации оставляй без изменений, переводить можно только комментарии.
- Термины переводи последовательно: если один раз перевёл термин определённым образом, используй тот же перевод далее.
Ответ:
- Выведи только готовый перевод на русском языке.
- Не добавляй пояснений до или после перевода.
$PROMPT$,
TRUE,
'Базовая версия промпта для техдокументации'
)
ON CONFLICT (name, version) DO NOTHING;
+82
View File
@@ -0,0 +1,82 @@
version: "3.8"
services:
worker:
build:
context: ..
dockerfile: docker/worker/Dockerfile
container_name: doc_translator_worker
environment:
DB_DSN: "postgresql://doc_user:doc_password@db:5432/doc_translator"
OUTPUT_DIR: "/data/output"
volumes:
- ../data:/data
depends_on:
- db
ports:
- "8000:8000"
command: ["uvicorn", "worker.app:app", "--host", "0.0.0.0", "--port", "8000"]
db:
image: postgres:16
container_name: doc_translator_db
restart: unless-stopped
environment:
POSTGRES_DB: doc_translator
POSTGRES_USER: doc_user
POSTGRES_PASSWORD: doc_password
ports:
- "5432:5432"
volumes:
- db_data:/var/lib/postgresql/data
ollama:
image: ollama/ollama:latest
container_name: doc_translator_ollama
restart: unless-stopped
ports:
- "11434:11434"
environment:
OLLAMA_HOST: 0.0.0.0
volumes:
- ollama_data:/root/.ollama
n8n:
image: docker.n8n.io/n8nio/n8n:latest
container_name: doc_translator_n8n
restart: unless-stopped
depends_on:
- db
- ollama
ports:
- "5678:5678"
environment:
# базовые настройки n8n
N8N_HOST: localhost
N8N_PORT: 5678
N8N_PROTOCOL: http
N8N_EDITOR_BASE_URL: "http://localhost:5678"
WEBHOOK_URL: "http://localhost:5678"
# подключение к Postgres
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: db
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_DATABASE: doc_translator
DB_POSTGRESDB_USER: doc_user
DB_POSTGRESDB_PASSWORD: doc_password
# доступ к файлам
N8N_RESTRICT_FILE_ACCESS_TO: /data; /home/node/.n8n-files
N8N_BLOCK_FILE_ACCESS_TO_N8N_FILES: "false"
# часовой пояс
GENERIC_TIMEZONE: Europe/Moscow
TZ: Europe/Moscow
volumes:
- ../data:/data
- n8n_data:/home/node/.n8n
volumes:
db_data:
n8n_data:
ollama_data:
+23
View File
@@ -0,0 +1,23 @@
FROM python:3.11-slim
WORKDIR /app
# Системные зависимости для PyMuPDF, psycopg2 и т.п.
RUN apt-get update && apt-get install -y \
build-essential \
libpq-dev \
poppler-utils \
&& rm -rf /var/lib/apt/lists/*
COPY requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
COPY src/worker /app/worker
# Логи и данные
RUN mkdir -p /app/logs
ENV PYTHONUNBUFFERED=1
CMD ["python", "-m", "worker.app"]