FastAPIμ Ollamaλ₯Ό νμ©ν λ²μ μλΉμ€ API μλ²μ λλ€. μ΄ νλ‘μ νΈλ λκ·λͺ¨ μΈμ΄ λͺ¨λΈ(LLM)μ μ¬μ©νμ¬ ν μ€νΈ λ²μμ μ 곡νκ³ , λ²μ νμ§μ νκ°νλ©°, μΈλΆ λ²μ μ¬μ μ κ΄λ¦¬νλ κΈ°λ₯μ ν¬ν¨νκ³ μμ΅λλ€.
- β μΈμ΄ κ° ν μ€νΈ λ²μ (LLMμ΄ μ²λ¦¬ν μ μλ μΈμ΄)
- β REST API μΈν°νμ΄μ€ (FastAPI)
- β λ²μ νμ§ νκ° λ° κ°μ μμ€ν (μ ν μ¬ν)
- β μΈλΆ JSON νμΌμ ν΅ν λ²μ μ¬μ κ΄λ¦¬
- β λ²μ μμ² λ° κ²°κ³Ό λ‘κΉ
- β μΊμ± μμ€ν μΌλ‘ μ€λ³΅ μμ² μ΅μ ν
- Python 3.12 μ΄μ κΆμ₯ (3.12λ‘ κ°λ°λμμ)
- Ollama μ€μΉ λ° μ€ν
- Ollama μ§μ LLM λͺ¨λΈ
- Docker Desktop (Docker μ¬μ© μ)
λ³Έ νλ‘μ νΈλ XUnity.AutoTranslatorμ Custom μλ² μν μ©λλ‘ μμ±λμμ΅λλ€.
-
μ μ₯μ ν΄λ‘ :
git clone https://github.com/mannago/CustomOllamaTranslatorServer.git cd CustomOllamaTranslatorServer -
νκ²½ λ³μ μ€μ :
.env.exampleνμΌμ 볡μ¬νμ¬.envνμΌμ μμ±νκ³ λ€μ κ°λ€μ μ€μ νμΈμ:OLLAMA_MODEL="huihui_ai/kanana-nano-abliterated" -
Docker Compose μ€ν:
docker compose up
-
μλ² λΉλ λ° λͺ¨λΈ λ€μ΄λ‘λ λκΈ° (λͺ¨λΈ ꡬμ±μ μκ°μ΄ μμλ μ μμ΅λλ€)
-
Ollama μ€μΉ λ° λͺ¨λΈ λ€μ΄λ‘λ:
- Ollama 곡μ μ¬μ΄νΈ: https://ollama.com/
ollama pull huihui_ai/kanana-nano-abliterated
-
μ μ₯μ ν΄λ‘ :
git clone https://github.com/mannago/CustomOllamaTranslatorServer.git cd CustomOllamaTranslatorServer -
κ°μ νκ²½ μμ± λ° νμ±ν:
python -m pip install virtualenv python -m virtualenv .venv # Linux/Mac source .venv/bin/activate # Windows .venv\Scripts\activate
-
μμ‘΄μ± μ€μΉ:
pip install -r requirements.txt
-
νκ²½ λ³μ μ€μ :
.env.exampleνμΌμ 볡μ¬νμ¬.envνμΌμ μμ±νκ³ λ€μ κ°λ€μ μ€μ νμΈμ:OLLAMA_BASE_URL=http://localhost:11434 OLLAMA_MODEL="huihui_ai/kanana-nano-abliterated"
python run.pyμλ²λ κΈ°λ³Έμ μΌλ‘ http://localhost:8000μμ μ€νλ©λλ€.
curl -G "http://localhost:8000/translate?from=en&to=ko&text=Hello%20World"μμ μλ΅:
μλ
νμΈμ μΈκ³
GET http://localhost:8000/translate?from=en&to=ko&text=hello
μλ΅:
μλ
νμΈμ
μΈλΆ JSON νμΌμ ν΅ν΄ λ²μ μ¬μ μ κ΄λ¦¬ν μ μμ΅λλ€. κΈ°λ³Έ κ²½λ‘λ resources/dictionaries/ ν΄λμ
λλ€.
resources/dictionaries/ko_dictionary.json: νκ΅μ΄ λ²μ μ¬μ resources/dictionaries/ja_dictionary.json: μΌλ³Έμ΄ λ²μ μ¬μ resources/dictionaries/en_dictionary.json: μμ΄ λ²μ μ¬μ resources/dictionaries/lang_dictionary.json.example: λ²μ μ¬μ μμ νμΌ
λ²μ μ¬μ JSON νμΌ κ΅¬μ‘°:
{
"ui": {
"NEW GAME": "μ κ²μ",
"CONTINUE": "κ³μνκΈ°"
},
"legal": {
"All Rights Reserved": "λͺ¨λ κΆλ¦¬ 보μ ",
"Version": "λ²μ "
}
}λ²μ νμ§μ μλμΌλ‘ νκ°νκ³ κ°μ νλ κΈ°λ₯μ΄ κ΅¬νλμ΄ μμ΅λλ€:
- λ²μ κ²°κ³Όλ₯Ό 0-100 μ μλ‘ νκ°
- νκ° κΈ°μ€:
- μ νμ±: 40%
- μ μ°½μ±: 30%
- μ©μ΄: 20%
- μμ μ±: 10%
- μ€μ λ νμ§ κΈ°μ€(κΈ°λ³Έκ°: 90μ ) λ―Έλ¬ μ μλ μ¬λ²μ
- μ΅λ κ°μ μλ νμ μ νμΌλ‘ 무ν 루ν λ°©μ§
- νκ° κ²°κ³Ό λ‘κΉ
(
logs/evaluations.jsonl)
λ€μν ννμ λ‘κ·Έλ₯Ό κΈ°λ‘ν©λλ€:
| λ‘κ·Έ μ ν | νμΌ κ²½λ‘ |
|---|---|
| μΌλ° λ‘κ·Έ | logs/translation.log |
| λ²μ μμ²/κ²°κ³Ό λ‘κ·Έ | logs/translations.jsonl |
| λ²μ νκ° λ‘κ·Έ | logs/evaluations.jsonl |
| μ€λ₯ λ‘κ·Έ | logs/errors.jsonl |
.env νμΌμ΄λ Docker νκ²½ λ³μλ₯Ό ν΅ν΄ λ€μ μ€μ μ μ‘°μ ν μ μμ΅λλ€:
| νκ²½ λ³μ | μ€λͺ | κΈ°λ³Έκ° |
|---|---|---|
OLLAMA_BASE_URL |
Ollama νΈμ€νΈ URL | http://localhost:11434 |
OLLAMA_MODEL |
μ¬μ©ν Ollama λͺ¨λΈ | huihui_ai/kanana-nano-abliterated |
OLLAMA_TIMEOUT |
Ollama μμ² Timeout μκ° μ€μ (μ΄) | 300 |
OLLAMA_SERVER_CHECK_ENABLE |
Ollama μλ²νμΈ λ°λ³΅ μ€ν μ¬λΆ | False |
OLLAMA_HEALTH_CHECK_ENABLE |
Ollama μ£ΌκΈ°μ μΈ μννμΈ μ€ν μ¬λΆ | False |
| νκ²½ λ³μ | μ€λͺ | κΈ°λ³Έκ° |
|---|---|---|
PRELOAD_MODEL |
λ²μ μμ² μ Ollama λͺ¨λΈ λ‘λν μ§ μ¬λΆ | True |
| νκ²½ λ³μ | μ€λͺ | κΈ°λ³Έκ° |
|---|---|---|
SUPPORTED_LANGUAGES |
μ§μλλ μΈμ΄ λͺ©λ‘ (μΌνλ‘ κ΅¬λΆ) | en,ko |
| νκ²½ λ³μ | μ€λͺ | κΈ°λ³Έκ° |
|---|---|---|
ENABLE_CACHE |
μΊμ± νμ±ν μ¬λΆ | True |
CACHE_EXPIRATION |
μΊμ λ§λ£ μκ° (μ΄) | 3600 |
| νκ²½ λ³μ | μ€λͺ | κΈ°λ³Έκ° |
|---|---|---|
ENABLE_DICTIONARY |
μ¬μ κΈ°λ° λ²μ νμ±ν μ¬λΆ | True |
| νκ²½ λ³μ | μ€λͺ | κΈ°λ³Έκ° |
|---|---|---|
ENABLE_EVALUATION |
λ²μ νμ§ νκ° νμ±ν μ¬λΆ | False |
QUALITY_THRESHOLD |
λ²μ κ°μ μ¬μλ νμ§ μ μ κΈ°μ€μΉ (0-100) | 90 |
MAX_IMPROVEMENT_ATTEMPTS |
μ΅λ κ°μ μλ νμ | 3 |
| νκ²½ λ³μ | μ€λͺ | κΈ°λ³Έκ° |
|---|---|---|
MIN_TEXT_LENGTH_FOR_EVALUATION |
νκ°μ νμν μ΅μ ν μ€νΈ κΈΈμ΄ | 8 |
MAX_TEXT_LENGTH_FOR_EVALUATION |
νκ°μ νμν μ΅λ ν μ€νΈ κΈΈμ΄ | 1000 |
| νκ²½ λ³μ | μ€λͺ | κΈ°λ³Έκ° |
|---|---|---|
MAX_HISTORY_PER_LANG_PAIR |
μΈμ΄ μλ³ μ΅λ μ΄λ ₯ μ | 10 |
-
λ κ°λ ₯ν LLM μ¬μ©νκΈ°: λ²μ νμ§μ LLMμ μ±λ₯μ ν¬κ² μμ‘΄ν©λλ€. OpenAI, Google Gemini, Anthropic Claudeμ κ°μ λ κ°λ ₯ν LLMμ μ¬μ©νμ¬ νμ§μ ν₯μμν¬ μ μμ΅λλ€.
-
μ¬μ κ°μ μμ μ μ©νκΈ°: λ²μ ν μμ±λ μ¬μ μ λν λͺ¨λΈ(OpenAI, Gemini, Claude λ±)μ μ 곡νμ¬ κ°μ λ λ²μ μΌλ‘ λ³κ²½νκ³ μ¬λ²μμ μλν©λλ€.
-
μλ κ²μ λ° νΌλλ°± λ°μνκΈ°: λ²μ μ¬μ μ κ²μνμ¬ μνλ ννλ‘ λ³κ²½ ν μ¬λ²μν©λλ€.
μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€λ‘ λ°°ν¬λ©λλ€.