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
- eland-official-doc-zh - LoRA Adapter
- eland-official-doc-zh-gguf - GGUF for Ollama
License
Apache 2.0
- Downloads last month
- 27