Skip to main content
Glama
civilian7

korean-people-persona

by civilian7

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

数据来源

项目

值

仓库

nvidia/Nemotron-Personas-Korea

文件

train-0000{0..8}-of-00009.parquet (9个)

每文件行数

约 111,112

总行数

1,000,000

缺失值

所有列均为 0 (保证 NOT NULL)

country

全部为 대한민국 (韩国) 单一值

*_list

Python repr 格式字符串 → 规范化为 JSON 数组

文件夹结构

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.md

data/ 和 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 ./data

3) 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;

索引

名称

列

用途

idx_persona_demo

(sex, age)

性别/年龄分布查询

idx_persona_region

(province, district)

地区筛选

idx_persona_edu_occ

(education_level, occupation)

学历/职业分析

idx_persona_family

(family_type, marital_status)

家庭/婚姻分析

列含义

列

说明

示例

uuid

32位 hex 字符串 (无连字符)。PK

03b4f36a18e6469386d0286dddd513c8

persona

核心 1~2 句总结

"70多岁男性,在农村地区从事农业工作一辈子..."

*_persona

各领域详细人设 (数句长度)

职业/体育/艺术/旅行/饮食文化/家庭

cultural_background

文化/成长背景描述

skills_and_expertise

技能描述

skills_and_expertise_list

上述项目的关键词列表 (JSON 数组)

["Excel使用","文档编写"]

hobbies_and_interests

爱好/兴趣描述

hobbies_and_interests_list

上述项目的关键词列表 (JSON 数组)

["登山","钓鱼"]

career_goals_and_ambitions

未来目标

sex

남자 (男) / 여자 (女)

age

整数

marital_status

4种

미혼 (未婚) / 기혼 (已婚) / 이혼 (离异) / 사별 (丧偶) 等

military_status

2种

군필 (服役完毕) / 해당없음 (不适用) 等

family_type

39种

배우자와 자녀 (配偶与子女), 1인 가구 (单人家庭) 等

housing_type

6种

아파트 (公寓), 단독주택 (独栋住宅) 等

education_level

7种

초등학교 (小学) ~ 대학원 (研究生)

bachelors_field

学士专业领域

occupation

职业 (自由文本)

district

市郡区

강남-서초 (江南-瑞草)

province

市道

서울 (首尔), 경기 (京畿) 等 17种

country

国家

대한민국 (韩国) (单一值)

全文搜索 — 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, Windows C:/abs/path/.venv/Scripts/python.exe)

Claude Desktop

配置文件位置:

OS

路径

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

Linux

~/.config/Claude/claude_desktop_config.json

或通过应用内 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 适配器封装 后暴露。

  1. 使用 mcp SDK 的 HTTP 传输运行服务器:

    PYTHONPATH=src python -m mcp_server --transport sse --port 8765

    (目前本仓库 server.py 仅调用 stdio。若要使用 HTTP/SSE 模式,需添加 mcp.run(transport="sse", port=8765) 分支。)

  2. 通过 ngrok / Cloudflare Tunnel 等暴露到外部:

    ngrok http 8765
  3. ChatGPT → Settings → Connectors → Developer mode → Add custom connector

    • URL: https://<ngrok>/sse

    • 认证: 如有需要,添加 Bearer 令牌头 (MCP_AUTH_TOKEN)

  4. 在新聊天中通过 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 需要完全退出 (包括托盘图标)

ModuleNotFoundError: mcp_server

确认 PYTHONPATH 指向 src (建议绝对路径)

韩语乱码

添加 env.PYTHONIOENCODING=utf-8 (特别是 Windows)

找不到 python 命令

将 command 改为绝对路径 (例如: /usr/bin/python3, C:/Python311/python.exe, venv 的 python)

权限错误

Windows 路径包含空格 → 使用引号或更改路径

暴露的工具

工具

说明

search_persona(query, fields, filters, limit, full)

FTS5 自由文本搜索 + 人口统计筛选结合 (BM25 排序)

get_persona(uuid)

通过 uuid 查询单个完整人设

sample_persona(filters, n, full)

条件随机采样

aggregate(group_by, filters, limit)

人口统计 GROUP BY COUNT

stats()

数据集整体统计及可用列指南

智能体应用示例

1) 营销访谈模拟

"从 60 岁以上喜欢登山的女性中采样 10 人,模拟她们对新推出的护膝广告文案的反应。"

智能体按以下流程工作:

  1. search_persona(query="登山*", filters={"sex":"여자","age_min":60}, limit=10, full=True)

  2. 将每个人设注入系统提示词 → 每人生成一份广告文案评价响应

  3. 响应聚类后总结洞察

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 天工作制。"

  1. aggregate(group_by=["province","sex","age"]) → 计算分布比例

  2. 按比例调用 sample_persona (市道×性别×年龄段)

  3. 对每个人设向 LLM 请求 1:1 响应

  4. 结果汇总 → 计算加权后的赞成/反对分布

直接使用 (代码)

无需 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

chmod +x build.sh && ./build.sh

Windows (cmd)

build.bat

Windows (PowerShell)

.\build.ps1

重新下载选项统一传递:

./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]

内部处理:

  1. (可选) --download 时从 HuggingFace 获取缺失的 parquet

  2. 新建 persona.db (删除旧文件)

  3. 设置 PRAGMA + 创建模式/索引

  4. 依次读取 9 个 parquet,按行规范化后执行 executemany 加载 (事务单位: 1 个文件)

  5. *_list 列转换为 ast.literal_eval → json.dumps(ensure_ascii=False)

  6. 创建 FTS5 虚拟表 + 执行一次 INSERT ... SELECT 构建

  7. INSERT INTO persona_fts(persona_fts) VALUES('optimize') 后执行 ANALYZE

  8. WAL 检查点后退出

磁盘空间估算

  • 主表 + 索引: 约 1.5 ~ 2.5 GB

  • FTS5 前缀包含: 额外 1 ~ 3 GB

  • 总计约 3 ~ 5 GB (实际加载后更新)。

Related MCP Connectors

Related MCP Servers