Eland Official Document Generator (vLLM)

台灣政府公文生成模型 - vLLM 部署版本

Model Description

本模型為 Qwen3-4B + ORPO LoRA 合併後的完整模型,專為 vLLM 高效推論部署設計。將口語化的工作指令或文件描述轉換為符合台灣政府規範的正式公文格式。

Training Method

本模型採用 ORPO (Odds Ratio Preference Optimization) 訓練,結合監督式學習與偏好對齊:

  • Chosen: 真實公文範例(正確用語)
  • Rejected: GPT 生成的錯誤用語版本
  • Training Samples: 498 組偏好對

Supported Document Types

  • - 各機關間公文往復
  • - 內部陳報長官的文件
  • 公告 - 對公眾宣布事項
  • 書函 - 機關間非正式聯繫
  • 開會通知 - 會議通知文件

Document Levels

層級 稱謂 起首語 期望語
上行 鈞部/鈞府 謹查、檢陳 請鑒核、請核示
平行 貴部/貴公司 查、檢送 請查照、請惠復
下行 該部/該府 查、檢送 希查照、希遵辦

Performance

公文層級 用語準確率
上行文 100%
平行文 100%
下行文 100%
整體 100% (3/3)

⚠️ Important: System Prompt Required

vLLM 部署必須提供 System Prompt(含用語規範表),否則模型可能使用錯誤的公文用語。

與 Ollama 不同,vLLM 不會讀取 Modelfile 中的預設設定。公文用語有嚴格層級規範,錯誤使用會造成失禮:

錯誤情況 錯誤範例 正確範例
上行文用平行語 貴部查照 鈞部鑒核
下行文用上行語 鈞府核示 該府查照

必須使用的 System Prompt(含完整用語規範表):

你是一位專業的台灣政府公文撰寫助手。

## 公文用語規範

| 層級 | 稱謂 | 期望語 |
|------|------|--------|
| 上行 | 鈞部、鈞府 | 請鑒核、請核示 |
| 平行 | 貴部、貴公司 | 請查照、請惠復 |
| 下行 | 該部、該單位 | 希查照、希遵辦 |

請根據指定的公文層級,使用正確的用語撰寫公文。

Usage

Important: Disable Thinking Mode

使用 vLLM 時,需在請求中加入參數禁用 Qwen3 的 Thinking Mode:

# 在 chat_template_kwargs 中設定
extra_body={"chat_template_kwargs": {"enable_thinking": False}}

With vLLM Server

# Start vLLM server
vllm serve p988744/eland-official-doc-zh-vllm \
    --host 0.0.0.0 \
    --port 8000 \
    --max-model-len 4096

# Or with specific GPU
CUDA_VISIBLE_DEVICES=0 vllm serve p988744/eland-official-doc-zh-vllm

API Call

import requests

system_prompt = """你是一位專業的台灣政府公文撰寫助手。

## 公文用語規範

| 層級 | 稱謂 | 期望語 |
|------|------|--------|
| 上行 | 鈞部、鈞府 | 請鑒核、請核示 |
| 平行 | 貴部、貴公司 | 請查照、請惠復 |
| 下行 | 該部、該單位 | 希查照、希遵辦 |

請根據指定的公文層級,使用正確的用語撰寫公文。"""

response = requests.post(
    "http://localhost:8000/v1/chat/completions",
    json={
        "model": "p988744/eland-official-doc-zh-vllm",
        "messages": [
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": "請將以下口語轉換為上行公文:申請增加預算"}
        ],
        "temperature": 0.3,
        "max_tokens": 1024,
        "extra_body": {"chat_template_kwargs": {"enable_thinking": False}}
    }
)

print(response.json()["choices"][0]["message"]["content"])

With Transformers

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained(
    "p988744/eland-official-doc-zh-vllm",
    torch_dtype=torch.bfloat16,
    device_map="auto",
    trust_remote_code=True,
)
tokenizer = AutoTokenizer.from_pretrained(
    "p988744/eland-official-doc-zh-vllm",
    trust_remote_code=True
)

system_prompt = """你是一位專業的台灣政府公文撰寫助手。

## 公文用語規範

| 層級 | 稱謂 | 期望語 |
|------|------|--------|
| 上行 | 鈞部、鈞府 | 請鑒核、請核示 |
| 平行 | 貴部、貴公司 | 請查照、請惠復 |
| 下行 | 該部、該單位 | 希查照、希遵辦 |

請根據指定的公文層級,使用正確的用語撰寫公文。"""

messages = [
    {"role": "system", "content": system_prompt},
    {"role": "user", "content": "請將以下口語轉換為上行公文:申請增加預算"}
]

# IMPORTANT: enable_thinking=False
prompt = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True,
    enable_thinking=False
)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

with torch.no_grad():
    outputs = model.generate(**inputs, max_new_tokens=1024, temperature=0.3)

response = tokenizer.decode(outputs[0][inputs['input_ids'].shape[1]:], skip_special_tokens=True)
print(response)

Example Outputs

上行文(申請補助)

輸入:申請增加預算

輸出:
主旨:檢陳本單位113年度追加預算申請案,敬請鈞部鑒核惠予補助。
說明:
一、依據「行政機關預算執行要點」規定辦理。
二、本單位因應業務擴展需求,原核定預算已不敷使用,爰申請追加預算新臺幣壹佰萬元整。
三、檢附追加預算明細表乙份。
辦法:
敬請鈞部鑒核惠予補助。

平行文(會議邀請)

輸入:邀請其他學校來參加我們的研討會

輸出:
主旨:敬邀貴校派代表出席本校舉辦之學術研討會,請查照並惠復。
說明:
一、依據本校113年度學術交流計畫辦理。
二、旨揭研討會訂於113年12月20日假本校國際會議廳舉行。
辦法:
請貴校於113年12月15日前惠復參加人員名單。

下行文(執行指示)

輸入:通知下面單位要按照新規定辦事

輸出:
主旨:有關本府新修訂之行政作業規範,請該單位依規定辦理,希查照。
說明:
一、依據本府113年第12次行政會議決議辦理。
二、旨揭規範業經本府核定,自即日起生效。
辦法:
請該單位確實依規定辦理,希查照辦理。

Model Details

Attribute Value
Base Model Qwen/Qwen3-4B
Training Method ORPO
Parameters ~4B
Precision bfloat16
Context Length 32768

Related Models

License

Apache 2.0

Downloads last month
27
Safetensors
Model size
4B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support