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: @nahisaho/katashiro-mcp-server
数据来源
项目 | 值 |
仓库 | |
文件 |
|
每文件行数 | 约 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 排除。
数据集下载
选择以下三种方法之一。结果文件必须以 train-*-of-*.parquet 的形式放置在 data/ 文件夹中。
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环境变量。本数据集(截至公开时)无需认证即可下载。
容量: 9个 parquet 文件总计约 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 字符前缀索引。为处理韩语助词,建议搜索时使用 등산* 形式的前缀匹配。若需要形态分析,可更换为基于 mecab-ko / kiwi 的自定义分词器。
FTS 同步: 由于数据集是静态的,通过一次 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 命令一行注册:
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)将每个人设注入系统提示词 → 每人生成一份广告文案评价响应
响应聚类后总结洞察
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构建流程
一键构建 (推荐)
各 OS 的包装脚本自动执行创建虚拟环境 → 安装依赖 → 下载 → 转换。
平台 | 命令 |
Linux / macOS |
|
Windows (cmd) |
|
Windows (PowerShell) |
|
重新下载选项统一传递:
./build.sh --force-download
build.bat --force-download
.\build.ps1 --force-download若 PowerShell 出现执行策略错误:
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时从 HuggingFace 获取缺失的 parquet新建
persona.db(删除旧文件)设置 PRAGMA + 创建模式/索引
依次读取 9 个 parquet,按行规范化后执行
executemany加载 (事务单位: 1 个文件)*_list列转换为ast.literal_eval→json.dumps(ensure_ascii=False)创建 FTS5 虚拟表 + 执行一次
INSERT ... SELECT构建INSERT INTO persona_fts(persona_fts) VALUES('optimize')后执行ANALYZEWAL 检查点后退出
磁盘空间估算
主表 + 索引: 约 1.5 ~ 2.5 GB
FTS5 前缀包含: 额外 1 ~ 3 GB
总计约 3 ~ 5 GB (实际加载后更新)。
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/civilian7/korean-people-persona'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
