Text Generation
Transformers
Safetensors
Korean
exaone4
pii
privacy
korean
ner
token-classification
exaone
lora
Teeem
conversational
Instructions to use flowos/teeem-pii-ko-1.2b with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use flowos/teeem-pii-ko-1.2b with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="flowos/teeem-pii-ko-1.2b") messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("flowos/teeem-pii-ko-1.2b") model = AutoModelForCausalLM.from_pretrained("flowos/teeem-pii-ko-1.2b") messages = [ {"role": "user", "content": "Who are you?"}, ] inputs = tokenizer.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=40) print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use flowos/teeem-pii-ko-1.2b with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "flowos/teeem-pii-ko-1.2b" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "flowos/teeem-pii-ko-1.2b", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/flowos/teeem-pii-ko-1.2b
- SGLang
How to use flowos/teeem-pii-ko-1.2b with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "flowos/teeem-pii-ko-1.2b" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "flowos/teeem-pii-ko-1.2b", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "flowos/teeem-pii-ko-1.2b" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "flowos/teeem-pii-ko-1.2b", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use flowos/teeem-pii-ko-1.2b with Docker Model Runner:
docker model run hf.co/flowos/teeem-pii-ko-1.2b
| /** | |
| * Korean name detection โ heuristic based on top surnames. | |
| * Matches: top-100 Korean surname + 1-2 Hangul given name characters. | |
| */ | |
| import type { PIIDetection } from "@klawn/shared"; | |
| /** Top Korean surnames by frequency. */ | |
| const TOP_SURNAMES = [ | |
| "๊น", "์ด", "๋ฐ", "์ต", "์ ", "๊ฐ", "์กฐ", "์ค", "์ฅ", "์", | |
| "ํ", "์ค", "์", "์ ", "๊ถ", "ํฉ", "์", "์ก", "๋ฅ", "์ ", | |
| "ํ", "๊ณ ", "๋ฌธ", "์", "์", "๋ฐฐ", "๋ฐฑ", "ํ", "์ ", "๋จ", | |
| "์ฌ", "๋ ธ", "ํ", "๊ณฝ", "์ฑ", "์ฐจ", "์ฃผ", "์ฐ", "๊ตฌ", "๋ฏผ", | |
| "๋ผ", "์ง", "์", "์", "์ฒ", "๋ฐฉ", "๊ณต", "์ง", "๊ฐ", "๋ณ", | |
| ]; | |
| /** Hangul Unicode range. */ | |
| function isHangul(char: string): boolean { | |
| const code = char.charCodeAt(0); | |
| return code >= 0xAC00 && code <= 0xD7A3; | |
| } | |
| /** Common Korean particles that follow names. */ | |
| const PARTICLES = "์|๊ณผ|์|์|๋|์ด|๊ฐ|์|๋ฅผ|์|์๊ฒ|ํํ |๊ป|๋|๋ง|๋ถํฐ|๊น์ง|์ฒ๋ผ|๊ฐ์ด|๋ณด๋ค|๋ก|์ผ๋ก|๋|์ด๋"; | |
| /** | |
| * Build regex from surnames. Matches surname + 1-2 hangul chars. | |
| * Preceded by whitespace/start. Followed by particle, whitespace, delimiter, or end. | |
| */ | |
| function buildNameRegex(): RegExp { | |
| const surnames = TOP_SURNAMES.join("|"); | |
| // Match surname + 1-2 Hangul given name chars, followed by particle or boundary | |
| return new RegExp( | |
| `(?<=^|[\\s,;:()\\[\\]{}])(?:${surnames})[๊ฐ-ํฃ]{1,2}(?=(?:${PARTICLES})|$|[\\s,;:()\\[\\]{}])`, | |
| "g", | |
| ); | |
| } | |
| const NAME_REGEX = buildNameRegex(); | |
| /** | |
| * Common Korean words that start with surname chars but are NOT names. | |
| * Reduces false positives from the heuristic name detector. | |
| */ | |
| const COMMON_WORD_EXCLUSIONS = new Set([ | |
| // ์ค (surname) | |
| "์ค๋", "์ค์ ", "์คํ", "์ค๋ฅธ", | |
| // ์ (surname) | |
| "์ ํ", "์ ์ฒด", "์ ๋ถ", "์ ๋ฌ", "์ ์", "์ ๊ตญ", "์ ๋ฌธ", "์ ํ", | |
| // ์ (surname) | |
| "์๋ฒ", "์๋ฅ", "์๋น", "์์ธ", | |
| // ์ฃผ (surname) | |
| "์ฃผ์", "์ฃผ๋ฌธ", "์ฃผ์", "์ฃผ์", "์ฃผ๊ฐ", "์ฃผ๋ง", | |
| // ํ (surname) | |
| "ํ๊ตญ", "ํ๋ฒ", "ํํธ", | |
| // ๊ณ (surname) | |
| "๊ณ ๊ฐ", | |
| // ์ต (surname) | |
| "์ต๊ทผ", "์ต๋", "์ต์", "์ต์ด", | |
| // ๊ณต (surname) | |
| "๊ณต์ง", "๊ณต์ ", "๊ณต๊ฐ", | |
| // ๋ฐฉ (surname) | |
| "๋ฐฉ๋ฒ", "๋ฐฉ๊ธ", "๋ฐฉ๋ฌธ", | |
| // ๊ตฌ (surname) | |
| "๊ตฌ๋งค", | |
| // ๋จ (surname) | |
| "๋จ์", "๋จ์", | |
| // ๋ฌธ (surname) | |
| "๋ฌธ์", "๋ฌธ์", "๋ฌธ์ ", | |
| // ์ (surname) | |
| "์ ์ฒญ", "์ ๊ท", | |
| // ๋ฐฐ (surname) | |
| "๋ฐฐ์ก", | |
| // ์ฐจ (surname) | |
| "์ฐจ์ด", | |
| // ์ (surname) | |
| "์๋ด", "์์ ", | |
| // ์ฑ (surname) | |
| "์ฑ๊ณต", | |
| // ๊ฐ (surname) | |
| "๊ฐํ", | |
| // ์ (surname) | |
| "์์", | |
| // ์ (surname) | |
| "์๋", | |
| ]); | |
| export function detectName(text: string): PIIDetection[] { | |
| const results: PIIDetection[] = []; | |
| let match: RegExpExecArray | null; | |
| NAME_REGEX.lastIndex = 0; | |
| while ((match = NAME_REGEX.exec(text)) !== null) { | |
| const name = match[0]; | |
| // Validate all characters are Hangul | |
| if ([...name].every(isHangul) && name.length >= 2 && name.length <= 3) { | |
| // Skip common Korean words that are not names | |
| if (COMMON_WORD_EXCLUSIONS.has(name)) continue; | |
| results.push({ | |
| type: "NAME", | |
| value: name, | |
| start: match.index, | |
| end: match.index + name.length, | |
| confidence: 0.6, // Heuristic โ lower confidence | |
| }); | |
| } | |
| } | |
| return results; | |
| } | |