korean-people-persona
korean-people-persona
HuggingFace nvidia/Nemotron-Personas-Korea データセット(約100万行、9つのparquetファイル)をSQLiteに変換・検索するためのツール群。
概要
出典: NVIDIA, Nemotron-Personas-Korea — https://huggingface.co/datasets/nvidia/Nemotron-Personas-Korea
ライセンス: 元のデータセットページのライセンス条項に従う
DBファイル:
database/persona.db元のparquet:
data/train-*-of-*.parquetテーブル:
persona(メイン) +persona_fts(FTS5外部コンテンツインデックス)ターゲットSQLite: 3.37+ (FTS5, STRICTテーブル, JSON1使用)
Python: 3.10以上 (3.11+ 推奨)
依存関係:
pyarrow >= 15.0,huggingface_hub >= 0.24(requirements.txt参照)ディスク空き容量: 約 5 GB (parquet ~2GB + DB ~3GB)
Related MCP server: Legal Search MCP
データ出典
項目 | 値 |
リポジトリ | |
ファイル |
|
ファイルあたりの行数 | 約 111,112 |
総行数 | 1,000,000 |
欠損値 | 全カラムで0 (NOT NULL保証) |
| すべて |
| Python |
フォルダ構造
korean-people-persona/
├── data/ # 원본 parquet (gitignore — 약 2GB)
│ └── train-*-of-*.parquet
├── database/ # 생성된 SQLite (gitignore — 약 3GB)
│ └── persona.db
├── src/
│ ├── convert/ # parquet → SQLite 변환기
│ │ ├── __init__.py
│ │ └── __main__.py
│ └── mcp_server/ # (예정) MCP 서버
├── build.sh / build.bat / build.ps1
├── requirements.txt
└── README.mddata/ と database/ は容量が大きいため、.gitignore でフォルダごと除外されています。
データセットのダウンロード
3つの方法から1つを選択。結果ファイルは data/ フォルダに train-*-of-*.parquet 形式で配置する必要があります。
1) 変換スクリプトオプション (推奨)
src/convert パッケージが不足している場合は自動的に取得します:
pip install huggingface_hub pyarrow
PYTHONPATH=src python -m convert --download # 없을 때만 받음
PYTHONPATH=src python -m convert --download --force-download # 항상 재다운로드2) huggingface-cli を直接使用
pip install huggingface_hub
huggingface-cli download nvidia/Nemotron-Personas-Korea \
--repo-type dataset \
--include "train-*-of-*.parquet" \
--local-dir ./data3) git lfs クローン
git lfs install
git clone https://huggingface.co/datasets/nvidia/Nemotron-Personas-Korea
mv Nemotron-Personas-Korea/train-*.parquet ./data/認証: 非公開またはゲート付きモデルの場合は
huggingface-cli loginまたはHF_TOKEN環境変数が必要です。本データセット(公開時点)は認証なしでもダウンロード可能です。
容量: parquet 9個の合計で約1〜2 GB。
メインテーブル persona
CREATE TABLE persona (
uuid TEXT PRIMARY KEY, -- 32자 hex 문자열 (대시 없음)
-- 페르소나 서술 (긴 한국어 텍스트) ----------------------------------------------
persona TEXT NOT NULL, -- 핵심 1~2문장 요약
professional_persona TEXT NOT NULL, -- 직업/업무 페르소나
sports_persona TEXT NOT NULL, -- 스포츠/운동 페르소나
arts_persona TEXT NOT NULL, -- 예술/문화 페르소나
travel_persona TEXT NOT NULL, -- 여행 페르소나
culinary_persona TEXT NOT NULL, -- 식문화/요리 페르소나
family_persona TEXT NOT NULL, -- 가족 관계 페르소나
cultural_background TEXT NOT NULL, -- 문화·성장 배경 서술
skills_and_expertise TEXT NOT NULL, -- 보유 기술/전문성 서술
hobbies_and_interests TEXT NOT NULL, -- 취미·관심사 서술
career_goals_and_ambitions TEXT NOT NULL, -- 향후 목표/포부
-- 리스트 (JSON 배열로 저장) -----------------------------------------------------
skills_and_expertise_list TEXT NOT NULL CHECK(json_valid(skills_and_expertise_list)), -- 스킬 키워드 JSON 배열
hobbies_and_interests_list TEXT NOT NULL CHECK(json_valid(hobbies_and_interests_list)), -- 취미 키워드 JSON 배열
-- 인구통계 ---------------------------------------------------------------------
sex TEXT NOT NULL, -- 성별: 남자 / 여자
age INTEGER NOT NULL CHECK(age >= 0), -- 나이 (정수)
marital_status TEXT NOT NULL, -- 결혼상태 (4종: 미혼/기혼/이혼/사별 등)
military_status TEXT NOT NULL, -- 병역상태 (군필/해당없음 등)
family_type TEXT NOT NULL, -- 가구 유형 (39종: 1인 가구, 배우자와 자녀 등)
housing_type TEXT NOT NULL, -- 주거 형태 (6종: 아파트, 단독주택 등)
education_level TEXT NOT NULL, -- 최종 학력 (7종: 초등학교 ~ 대학원)
bachelors_field TEXT NOT NULL, -- 학사 전공 분야
occupation TEXT NOT NULL, -- 직업 (자유 텍스트)
district TEXT NOT NULL, -- 시군구 (예: 강남-서초)
province TEXT NOT NULL, -- 시도 (17종)
country TEXT NOT NULL DEFAULT '대한민국' -- 국가 (단일값: 대한민국)
) STRICT;インデックス
名前 | カラム | 用途 |
|
| 性別/年齢分布クエリ |
|
| 地域フィルター |
|
| 学歴/職業分析 |
|
| 世帯/結婚分析 |
カラムの意味
カラム | 説明 | 例 |
| 32文字のhex文字列 (ダッシュなし)。PK |
|
| 核となる1〜2文の要約 |
|
| 領域別の詳細ペルソナ (数文の長さ) | 職業/スポーツ/芸術/旅行/食文化/家族 |
| 文化・成長背景の記述 | |
| 保有スキルの記述 | |
| 上記項目のキーワードリスト (JSON配列) |
|
| 趣味・関心の記述 | |
| 上記項目のキーワードリスト (JSON配列) |
|
| 今後の目標 | |
|
| |
| 整数 | |
| 4種 |
|
| 2種 |
|
| 39種 |
|
| 6種 |
|
| 7種 |
|
| 学士専攻分野 | |
| 職業 (自由記述) | |
| 市郡区 |
|
| 市道 |
|
| 国 |
|
全文検索 — persona_fts (FTS5)
長い韓国語記述カラム10個を外部コンテンツ方式でインデックス化。
CREATE VIRTUAL TABLE persona_fts USING fts5(
professional_persona,
sports_persona,
arts_persona,
travel_persona,
culinary_persona,
family_persona,
cultural_background,
skills_and_expertise,
hobbies_and_interests,
career_goals_and_ambitions,
content='persona',
content_rowid='rowid',
tokenize='unicode61 remove_diacritics 2',
prefix='2 3 4'
);トークナイザー: unicode61 + 2/3/4文字のprefixインデックス。韓国語の助詞処理のため、検索時は 등산* のようなprefixマッチングを推奨。形態素解析が必要な場合は mecab-ko / kiwi ベースのカスタムトークナイザーに置換。
FTS同期: データセットが静的なため、1回 INSERT INTO persona_fts(rowid, ...) SELECT ... でビルド。変更がある場合はトリガーを追加。
AIエージェント活用 (MCPサーバー)
本リポジトリは MCP (Model Context Protocol) サーバー を提供しているため、Claude Desktop、Cursor、ClineなどのMCP互換エージェントがデータを直接検索・サンプリングできます。
実行
PYTHONPATH=src python -m mcp_server # stdio 서버 시작エージェント別の登録方法
すべての例において、リポジトリの絶対パス
/abs/path/to/korean-people-personaを自身の環境に合わせて変更する必要があります。 仮想環境 (.venv) を作成した場合は、commandをvenv内のPythonに指定すると依存関係の競合がありません。 (例: macOS/Linux/abs/path/.venv/bin/python, WindowsC:/abs/path/.venv/Scripts/python.exe)
Claude Desktop
設定ファイルの場所:
OS | パス |
macOS |
|
Windows |
|
Linux |
|
またはアプリ内の Settings → Developer → Edit Config メニュー。
{
"mcpServers": {
"korean-persona": {
"command": "python",
"args": ["-m", "mcp_server"],
"env": {
"PYTHONPATH": "/abs/path/to/korean-people-persona/src",
"PYTHONIOENCODING": "utf-8"
}
}
}
}保存後、Claude Desktopを再起動 → チャット画面右下のハンマー(🔨)アイコンから5つのツールが表示されることを確認。
Claude Code (CLI)
CLIコマンドで1行登録:
claude mcp add korean-persona python -m mcp_server \
-e PYTHONPATH=/abs/path/to/korean-people-persona/src \
-e PYTHONIOENCODING=utf-8またはプロジェクトルートの .mcp.json / ユーザー設定 ~/.claude/settings.json に直接記述:
{
"mcpServers": {
"korean-persona": {
"command": "python",
"args": ["-m", "mcp_server"],
"env": { "PYTHONPATH": "/abs/path/to/korean-people-persona/src" }
}
}
}確認: claude mcp list → 有効化後 /mcp スラッシュコマンドでツール呼び出し可能。
Cursor
プロジェクト別の .cursor/mcp.json またはユーザーグローバル ~/.cursor/mcp.json:
{
"mcpServers": {
"korean-persona": {
"command": "python",
"args": ["-m", "mcp_server"],
"env": { "PYTHONPATH": "/abs/path/to/korean-people-persona/src" }
}
}
}または Settings → MCP → Add new MCP Server UIを使用。Cursor再起動後、@korean-persona で呼び出し。
ChatGPT (Developer Mode / Connectors)
ChatGPTのMCP統合は HTTP/SSEトランスポート ベースで動作します(リモートコネクタ)。本サーバーはstdioサーバーであるため、そのままでは登録できず、HTTPアダプターでラップして公開する必要があります。
mcpSDKのHTTPトランスポートでサーバーを実行:PYTHONPATH=src python -m mcp_server --transport sse --port 8765(現在、本リポジトリの
server.pyはstdioのみ呼び出し。HTTP/SSEモードを使うにはmcp.run(transport="sse", port=8765)への分岐追加が必要です。)ngrok / Cloudflare Tunnelなどで外部公開:
ngrok http 8765ChatGPT → Settings → Connectors → Developer mode → Add custom connector
URL:
https://<ngrok>/sse認証: 必要に応じてBearerトークンヘッダーを追加 (
MCP_AUTH_TOKEN)
新しいチャットの Tools メニューからコネクタを有効にするとツール呼び出しが可能。
セキュリティ上の注意: ChatGPTコネクタはモデル外部にツールを公開するため、公開URLは必ず認証で保護してください。ローカル専用であればstdioベースのClaude Desktop / Cursorの使用を推奨。
Gemini CLI
Google gemini-cli ユーザー設定 ~/.gemini/settings.json:
{
"mcpServers": {
"korean-persona": {
"command": "python",
"args": ["-m", "mcp_server"],
"env": { "PYTHONPATH": "/abs/path/to/korean-people-persona/src" },
"cwd": "/abs/path/to/korean-people-persona"
}
}
}確認: gemini mcp list (またはCLI内の /mcp コマンド) → ツールが自動的に表示。
共通トラブルシューティング
症状 | 原因 / 解決策 |
ツールが表示されない | アプリの再起動漏れ。Claude Desktopは完全終了が必要 (トレイアイコンまで) |
|
|
文字化け |
|
|
|
権限エラー | Windowsでパスにスペースがある場合 → クォーテーションで囲むかパスを変更 |
公開ツール
ツール | 説明 |
| FTS5自由テキスト検索 + 人口統計フィルター結合 (BM25ソート) |
| uuidで単一ペルソナを全件取得 |
| 条件付きランダムサンプリング |
| 人口統計 GROUP BY COUNT |
| データセット全体の統計・利用可能カラムの案内 |
エージェント活用サンプル
1) マーケティングインタビューシミュレーション
"60代以上の女性で登山を楽しむ10人をサンプリングして、新発売の膝サポーターの広告コピーに対する反応をシミュレーションして。"
エージェントは以下のフローで動作:
search_persona(query="등산*", filters={"sex":"여자","age_min":60}, limit=10, full=True)各ペルソナをシステムプロンプトに注入 → 広告コピー評価の回答を1人1件ずつ生成
回答をクラスタリングしてインサイトを要約
2) 地域ベースのキャラクターキャスティング
"釜山影島区に住む50代の自営業者ペルソナを探して、短編小説の主人公として使えるようにまとめて。"
search_persona(
filters={"province":"부산", "district_like":"%영도%",
"age_min":50, "age_max":59,
"occupation_like":"%자영%"},
limit=5, full=True
)3) 政策影響分析
"小学校卒業が最終学歴である70代以上の単身世帯が、どの市道に最も多いか分布を分析して。"
aggregate(
group_by=["province"],
filters={"education_level":"초등학교", "age_min":70,
"family_type_like":"%혼자%"},
limit=20
)4) 意味ベース検索 + 引用
"農村で育ち、孫がいるペルソナを探して、cultural_backgroundの引用とともに教えて。"
search_persona(
query='"농촌" AND 손주*',
fields=["cultural_background", "family_persona"],
limit=5, full=True
)5) 合成アンケート調査
"全国の人口分布に比例して100人を層化サンプリングした後、それぞれに『週4日制導入に賛成か』と聞いてみて。"
aggregate(group_by=["province","sex","age"])→ 分布比率を計算比率通りに
sample_personaを市道×性別×年齢層別に呼び出し各ペルソナでLLMに1:1の回答を要求
結果を集計 → 重み付けを適用した賛否分布を算出
直接使用 (コード)
MCPなしでPythonから直接呼び出し:
import sys; sys.path.insert(0, "src")
from mcp_server import tools
tools.stats()
tools.search_persona(query="용접*", filters={"sex":"남자"}, limit=5)
tools.sample_persona(filters={"province":"제주"}, n=3, full=True)SQL直接クエリ
-- 1) 등산을 좋아하고 트로트 관련 언급이 있는 60대 여성
SELECT p.uuid, p.age, p.province, p.occupation
FROM persona_fts f
JOIN persona p ON p.rowid = f.rowid
WHERE persona_fts MATCH '등산* AND 트로트*'
AND p.sex = '여자' AND p.age BETWEEN 60 AND 79
ORDER BY bm25(persona_fts) LIMIT 20;
-- 2) 특정 컬럼 검색 + 스니펫
SELECT p.uuid, snippet(persona_fts, 7, '<b>', '</b>', '...', 10) AS hit
FROM persona_fts f JOIN persona p ON p.rowid = f.rowid
WHERE f.skills_and_expertise MATCH '용접*' LIMIT 10;
-- 3) JSON 리스트 펼치기
SELECT p.uuid, j.value AS hobby
FROM persona p, json_each(p.hobbies_and_interests_list) j
WHERE j.value LIKE '%낚시%' LIMIT 10;
-- 4) 인구통계 분포
SELECT province, sex, COUNT(*) cnt
FROM persona GROUP BY province, sex ORDER BY cnt DESC;PRAGMA設定 (ロード/運用)
PRAGMA journal_mode = WAL;
PRAGMA synchronous = NORMAL;
PRAGMA temp_store = MEMORY;
PRAGMA cache_size = -262144; -- 256MBビルド手順
1行ビルド (推奨)
OS別のラッパースクリプトが仮想環境作成 → 依存関係インストール → ダウンロード → 変換まで自動実行。
プラットフォーム | コマンド |
Linux / macOS |
|
Windows (cmd) |
|
Windows (PowerShell) |
|
再ダウンロードオプションはすべて同様に渡す:
./build.sh --force-download
build.bat --force-download
.\build.ps1 --force-downloadPowerShellで実行ポリシーエラーが出る場合:
PowerShell -ExecutionPolicy Bypass -File .\build.ps1
手動実行
python -m venv .venv
# Linux/macOS: source .venv/bin/activate
# Windows: .venv\Scripts\activate
pip install -r requirements.txt
PYTHONPATH=src python -m convert [--download] [--force-download]内部処理:
(オプション)
--download時、parquetの不足分をHuggingFaceから取得persona.dbを新規作成 (既存ファイル削除)PRAGMA設定 + スキーマ/インデックス作成
9つのparquetを順次読み込み、行単位で正規化後に
executemanyでロード (トランザクション単位: ファイル1個)*_listカラムはast.literal_eval→json.dumps(ensure_ascii=False)に変換FTS5仮想テーブル作成 +
INSERT ... SELECTで1回ビルドINSERT INTO persona_fts(persona_fts) VALUES('optimize')後にANALYZEWALチェックポイント後に終了
ディスク容量の推定
メインテーブル + インデックス: 約 1.5 ~ 2.5 GB
FTS5 prefix含む: 追加 1 ~ 3 GB
合計 約 3 ~ 5 GB 予想 (実際のロード後に更新)。
This server cannot be deployed
Maintenance
Related MCP Connectors
Agent-native MCP server over 49M+ US public and government records, privacy-first, always current.
One MCP server that gives your AI agent search, AI answer, social, ad and lead data.
MCP server for building and testing AI agents with multi-model experimentation and insights.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server providing access to 1M synthetic Korean personas based on KOSIS statistics, enabling persona sampling, search, and analysis via natural language queries.7 npmMIT
- FlicenseAqualityDmaintenanceMCP server that enables AI agents to search Korean laws and retrieve article contents using the Korean Ministry of Legislation's law information API.2-
- FlicenseNot gradedqualityDmaintenanceMCP server that searches and filters DART electronic disclosures for Korean companies, enabling AI agents to create investor briefing summaries.-
- AlicenseNot gradedqualityCmaintenanceMCP server for Korean government power/energy statutory plans. Enables AI agents to search and retrieve public power plan documents.MIT