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 排除。
数据集下载
选择以下三种方法之一。结果文件必须以 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 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