265 lines
6.1 KiB
Markdown
265 lines
6.1 KiB
Markdown
---
|
||
license: apache-2.0
|
||
language:
|
||
- ja
|
||
- zh
|
||
base_model:
|
||
- 3tic/Orion-Qwen3-1.7B-CPT-v2603
|
||
pipeline_tag: text-generation
|
||
tags:
|
||
- lightnovel
|
||
---
|
||
# Orion-Qwen3-1.7B-SFT-v2603
|
||
|
||
|
||
基于 [Orion-Qwen3-1.7B-CPT-v2603](https://huggingface.co/3tic/Orion-Qwen3-1.7B-CPT-v2603) 在轻小说、游戏、动漫文本数据上训练的翻译模型,支持术语表。
|
||
|
||
* 本版模型优化了术语表使用和上下文关系处理
|
||
|
||
|
||
## Prompt 结构
|
||
|
||
```
|
||
[上文] ← 可选,每 chunk 不同
|
||
[术语表] ← 可选,同文档共享,仅包含当前 chunk 命中的术语
|
||
[提示词] ← 根据有无上文/术语表选择措辞
|
||
[JSONL 内容] ← 待翻译文本
|
||
```
|
||
|
||
---
|
||
|
||
## 模板 1: plain(无术语表,无上文)
|
||
|
||
### user
|
||
|
||
```
|
||
将以下文本翻译为简体中文,使用JSONLINE格式输出翻译结果,只需输出翻译结果,不要额外解释:
|
||
{"1":"原文1"}
|
||
{"2":"原文2"}
|
||
```
|
||
|
||
### assistant
|
||
|
||
```
|
||
{"1":"译文1"}
|
||
{"2":"译文2"}
|
||
```
|
||
|
||
### 示例
|
||
|
||
**user:**
|
||
|
||
```
|
||
将以下文本翻译为简体中文,使用JSONLINE格式输出翻译结果,只需输出翻译结果,不要额外解释:
|
||
{"1":"まだなにか、話すべきことがあっただろうか。"}
|
||
```
|
||
|
||
**assistant:**
|
||
|
||
```
|
||
{"1":"还有什么,需要说的事情吗。"}
|
||
```
|
||
|
||
---
|
||
|
||
## 模板 2: glossary(有术语表,无上文)
|
||
|
||
### user
|
||
|
||
```
|
||
术语表:
|
||
実体A→译名A
|
||
実体B→译名B
|
||
|
||
参考术语表中的译法,将以下文本翻译为简体中文,使用JSONLINE格式输出翻译结果,只需输出翻译结果:
|
||
{"1":"原文1"}
|
||
{"2":"原文2"}
|
||
```
|
||
|
||
### assistant
|
||
|
||
```
|
||
{"1":"译文1"}
|
||
{"2":"译文2"}
|
||
```
|
||
|
||
### 示例
|
||
|
||
**user:**
|
||
|
||
```
|
||
术语表:
|
||
クトゥリフ→库托莉芙
|
||
サーフェちゃん→莎妃
|
||
ライム→莉姆
|
||
|
||
参考术语表中的译法,将以下文本翻译为简体中文,使用JSONLINE格式输出翻译结果,只需输出翻译结果:
|
||
{"1":"「思い出話をしましょう、と言っているのよ。私もグレンとは話せないし」"}
|
||
{"2":"うにょん! と楕円形に広がっていたライムが、あっという間に人の形に戻った。"}
|
||
{"3":"「いいんデスか! サーフェちゃん」"}
|
||
```
|
||
|
||
---
|
||
|
||
## 模板 3: context(无术语表,有上文)
|
||
|
||
### user
|
||
|
||
```
|
||
上文行1
|
||
上文行2
|
||
上文行3
|
||
|
||
参考上文信息,将以下文本翻译为简体中文,使用JSONLINE格式输出翻译结果,只需输出翻译结果:
|
||
{"1":"原文1"}
|
||
{"2":"原文2"}
|
||
```
|
||
|
||
### assistant
|
||
|
||
```
|
||
{"1":"译文1"}
|
||
{"2":"译文2"}
|
||
```
|
||
|
||
### 示例
|
||
|
||
**user:**
|
||
|
||
```
|
||
「え……だっテ、グレンくんは教室でも浮いてましたシ……みんなと仲良くなれるきっかけになればと思ったんデス……」
|
||
サーフェとしては。
|
||
ライムがやったことは、サーフェの考えと似てはいても、もう少し先を見ていた。
|
||
|
||
参考上文信息,将以下文本翻译为简体中文,使用JSONLINE格式输出翻译结果,只需输出翻译结果:
|
||
{"1":"「医学部学生ではあるけど、身体の悩みを聞きます……というのは評判になりましたね」"}
|
||
{"2":"「エヘヘ! 噂を流した甲斐がありましター!」"}
|
||
{"3":"「それも貴女の仕業だったのね」"}
|
||
```
|
||
|
||
---
|
||
|
||
## 模板 4: glossary_context(有术语表,有上文)
|
||
|
||
### user
|
||
|
||
```
|
||
上文行1
|
||
上文行2
|
||
上文行3
|
||
|
||
术语表:
|
||
実体A→译名A
|
||
実体B→译名B
|
||
|
||
参考上文和术语表,将以下文本翻译为简体中文,使用JSONLINE格式输出翻译结果,只需输出翻译结果:
|
||
{"1":"原文1"}
|
||
{"2":"原文2"}
|
||
```
|
||
|
||
### assistant
|
||
|
||
```
|
||
{"1":"译文1"}
|
||
{"2":"译文2"}
|
||
```
|
||
|
||
### 示例
|
||
|
||
**user:**
|
||
|
||
```
|
||
アカデミーは多数の学部に分かれ、大陸各地から有能な学者が招聘された。
|
||
ある日、アカデミーに一人の少年が留学した。
|
||
新入生の名はグレン・リトバイト。
|
||
|
||
术语表:
|
||
クトゥリフ→库托莉芙
|
||
グレン・リトバイト→格伦·利特贝特
|
||
ネメア→涅米亚
|
||
ネメア・アカデミー→涅米亚·学院
|
||
|
||
参考上文和术语表,将以下文本翻译为简体中文,使用JSONLINE格式输出翻译结果,只需输出翻译结果:
|
||
{"1":"ネメア・アカデミー。"}
|
||
{"2":"魔族領首都ネメア。その大都市が誇る、最大の教育機関。"}
|
||
{"3":"名前はグレン。"}
|
||
{"4":"手にしているのは、教授であるクトゥリフからの通知である。"}
|
||
```
|
||
|
||
---
|
||
|
||
## Transformers 推理示例
|
||
|
||
```python
|
||
import torch
|
||
from transformers import AutoModelForCausalLM, AutoTokenizer
|
||
|
||
model_path = "3tic/Orion-Qwen3-1.7B-CPT-v2603"
|
||
|
||
tokenizer = AutoTokenizer.from_pretrained(
|
||
model_path,
|
||
trust_remote_code=True,
|
||
padding_side="left",
|
||
)
|
||
if tokenizer.pad_token is None:
|
||
tokenizer.pad_token = tokenizer.eos_token
|
||
|
||
model = AutoModelForCausalLM.from_pretrained(
|
||
model_path,
|
||
trust_remote_code=True,
|
||
torch_dtype=torch.bfloat16,
|
||
device_map="auto",
|
||
)
|
||
|
||
prompt = (
|
||
"将以下文本翻译为简体中文,使用JSONLINE格式输出翻译结果,只需输出翻译结果,不要额外解释:\n"
|
||
'{"1": "おはようございます"}\n'
|
||
)
|
||
|
||
text = tokenizer.apply_chat_template(
|
||
[{"role": "user", "content": prompt}],
|
||
tokenize=False,
|
||
add_generation_prompt=True,
|
||
)
|
||
|
||
inputs = tokenizer(text, return_tensors="pt").to(model.device)
|
||
|
||
outputs = model.generate(
|
||
**inputs,
|
||
max_new_tokens=128,
|
||
do_sample=False,
|
||
temperature=1.0,
|
||
pad_token_id=tokenizer.pad_token_id,
|
||
)
|
||
|
||
generated_ids = outputs[0][inputs["input_ids"].shape[-1]:]
|
||
response = tokenizer.decode(generated_ids, skip_special_tokens=True)
|
||
print(response)
|
||
```
|
||
|
||
|
||
## vLLM 推理示例
|
||
|
||
|
||
```python
|
||
from vllm import LLM, SamplingParams
|
||
|
||
model_path = "3tic/Orion-Qwen3-1.7B-CPT-v2603"
|
||
|
||
llm = LLM(model=model_path, tensor_parallel_size=1, max_model_len=1024)
|
||
|
||
prompt = (
|
||
"将以下文本翻译为简体中文,使用JSONLINE格式输出翻译结果,只需输出翻译结果,不要额外解释:\n"
|
||
'{"1": "おはようございます"}\n'
|
||
)
|
||
|
||
outputs = llm.chat(
|
||
messages=[[{"role": "user", "content": prompt}]],
|
||
sampling_params=SamplingParams(max_tokens=128, temperature=0.0),
|
||
)
|
||
|
||
print(outputs[0].outputs[0].text)
|
||
```
|
||
|
||
|