AI人物分析服务器

基于AI的人物分析和焦点小组访谈(FGI)系统,提供动态问卷生成、数据新鲜度管理和商业洞察分析功能。

  • by SeoNaRu
  • Python
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 SeoNaRu/persona-mcp

使用说明

Persona MCP服务器

用于基于AI的Persona分析和Focus Group Interview(FGI)系统的模型上下文协议(MCP)服务器。

📋 目录


什么是MCP?

**MCP(Model Context Protocol)**是AI模型可以安全地连接和使用外部工具和服务的标准协议。

MCP的核心概念

  1. “工具”(Tools):AI可以调用的函数
  2. 资源(Resources):AI可读的数据源
  3. 提示符(Prompts):可重复使用的提示模板

此项目中的MCP

此Persona MCP服务器 FastMCP 使用框架实现,其工作原理如下:

  • 标准I/O(stdio)通信:使用JSON-RPC协议与MCP客户端通信
  • 异步处理: asyncio使用运行异步工具
  • 类型安全性:使用Pydantic验证请求/响应

这个服务是做什么的?

这个MCP服务器 基于Persona的FGI系统提供。主要目的如下:

1.Persona的创建和管理

  • 分析用户的问卷响应,生成基于AI的Persona配置文件
  • 自动分析MBTI类型、兴趣、性格特征、价值观等
  • 管理基本配置文件(年龄、性别、地区、职业等)

2.生成动态FGI问卷

  • 按类别(技术、生活方式、文化、时尚、饮食、一般)开始调查
  • AI分析前一个答案,动态生成下一个问题
  • 以最少的问题收集最多的信息此目标

3.数据新鲜度管理

  • 将Persona数据的价值管理为“新鲜度分数”
  • 随着时间的推移自动减少(每天-3分)
  • 提交问卷调查时增加新鲜度分数
  • 将数据价值等级划分为SS级、S级、A级、B级、C级等

4.提供业务洞察

  • 分析Persona对特定产品/主题的偏好
  • 提供趋势洞察
  • 基于关键字的响应搜索
  • Persona比较和统计分析

5.生成样本数据

  • 自动生成演示和测试的样例Persona
  • 创建不同类别的调查和响应
  • 基于LLM的自然数据生成(或基于模板的快速生成)

系统体系结构

┌─────────────────┐
│  MCP Client     │  (Cursor AI, Claude Desktop 등)
│  (Cursor AI)    │
└────────┬────────┘
         │ JSON-RPC (stdio)
         │
┌────────▼─────────────────────────────────────┐
│         Persona MCP Server                   │
│  ┌──────────────────────────────────────┐   │
│  │  FastMCP Framework                   │   │
│  │  - Tool Registration                 │   │
│  │  - Request/Response Handling         │   │
│  └──────────┬───────────────────────────┘   │
│             │                                │
│  ┌──────────▼───────────────────────────┐   │
│  │  Tool Implementations                │   │
│  │  - FGI Tools (fgi_tools.py)         │   │
│  │  - Predict (predict.py)             │   │
│  │  - Insights (insights.py)           │   │
│  │  - Freshness (freshness.py)         │   │
│  │  - Query (query.py)                 │   │
│  │  - Sample Data (sample_data.py)     │   │
│  └──────────┬───────────────────────────┘   │
│             │                                │
│  ┌──────────▼───────────────────────────┐   │
│  │  Database Layer (SQLAlchemy)         │   │
│  │  - Persona Model                     │   │
│  │  - FGISurvey Model                   │   │
│  │  - FGIResponse Model                 │   │
│  └──────────┬───────────────────────────┘   │
└─────────────┼────────────────────────────────┘
              │
┌─────────────▼─────────────┐
│   SQLite Database         │
│   (data/fgi.db)           │
└───────────────────────────┘
              │
┌─────────────▼─────────────┐
│   Groq LLM API            │
│   (AI 분석 및 생성)        │
└───────────────────────────┘

主要元件

  1. FastMCP:MCP协议实现框架
  2. SQLAlchemy:通过ORM管理数据库
  3. 格罗克API:基于LLM的分析和创建
  4. 派丹蒂克:数据验证和序列化
  5. 缓存系统:缓存重复分析结果

主要功能

1.Persona生命周期管理

重要信息:基本配置文件是必需的!

在使用服务器之前,必须设置默认配置文件。如果没有默认配置文件,大部分功能将不可用。

查询基本配置文件问题

在收集Persona的基本信息之前,您可以先确定需要问什么问题。

# 기본 프로필 질문 목록 조회
questions = get_basic_profile_questions_tool()

返回的问题列表:

  • age_range:选择年龄段(必需)-10多岁、20出头、20出头、30出头、30出头、40岁以上
  • gender:性别选择(必需)-男性,女性,其他,未回答
  • location:选择居住地区(必需)-首尔、京畿、仁川、釜山、大邱、光州、大田、其他
  • occupation_category:选择职业(必需)-IT/开发、设计、营销、教育、服务、学生、其他
  • income_range:月收入范围(可选)-200万韩元以下,200-300万韩元,300-500万韩元,500万韩元以上,未答复

必填字段: age_range, gender, location, occupation_category (4个) 选择字段: income_range (1个)

使用流程:

  1. get_basic_profile_questions_tool()通过查看问题列表
  2. 向用户提出每个问题并收集答案
  3. 收集的答案 update_basic_profile_tool()另存为

验证基本配置文件的完整性

您可以验证默认配置文件是否完整。

# 모든 페르소나의 기본 프로필 확인
check_basic_profile_tool()

# 특정 페르소나의 기본 프로필 확인
check_basic_profile_tool(persona_id="persona_123")

返回信息:

  • is_complete:基本配置文件是否完整(bool)
  • missing_fields:缺少必填字段列表
  • message:状态消息
  • persona_id:已确认的Persona ID(或None)

更新默认配置文件

将收集的基本信息保存在Persona中。

# 페르소나의 기본 정보 설정
update_basic_profile_tool(
    persona_id="persona_123",
    profile_data={
        "age_range": "20대 후반",        # 질문 목록의 옵션 중 하나
        "gender": "남성",                 # 질문 목록의 옵션 중 하나
        "location": "서울",               # 질문 목록의 옵션 중 하나
        "occupation_category": "IT/개발", # 질문 목록의 옵션 중 하나
        "income_range": "300-500만원"     # 선택사항, 질문 목록의 옵션 중 하나
    }
)

注意事项:

  • profile_data的每个字段值为 get_basic_profile_questions_tool()必须是中返回的选项列表之一。
  • 4个必填字段(age_range, gender, location, occupation_category)必须设置。
  • income_range是可选的,可以省略。
  • 保存默认配置文件可提高新鲜度分数(最高25分)。
  • 如果没有默认配置文件,则大部分功能(如生成调查、提交响应)都不可用。

Persona预测(AI分析)

# 설문 응답을 기반으로 페르소나 자동 생성
predict_persona_tool(
    responses=[
        {"question_id": "q1", "answer": "저는 기술에 관심이 많아요..."},
        {"question_id": "q2", "answer": "주말에는 코딩을 하거나..."}
    ],
    user_id="user_123"
)

返回信息:

  • 年龄段预测
  • 兴趣列表
  • 性格特点
  • 价值观
  • 生活方式说明
  • MBTI类型和维度分析
  • MBTI可信度分数

2.动态FGI调查系统

开始调查

# 카테고리별 설문 시작
create_fgi_survey_tool(
    category="technology",  # technology, lifestyle, culture, fashion, food, general
    persona_id="persona_123"  # 선택사항
)

支持类别:

  • technology:技术领域
  • lifestyle:生活方式
  • culture:文化/娱乐
  • fashion:时尚
  • food:食物
  • general:一般

动态生成下一个问题

# 이전 답변을 분석하여 다음 질문 생성
generate_next_question_tool(
    survey_id="survey_123",
    previous_qa=[
        {"question": "요즘 기술 분야에서 가장 관심있는 주제는?", "answer": "AI와 머신러닝에 관심이 많아요"},
        {"question": "어떤 방식으로 학습하시나요?", "answer": "온라인 강의와 프로젝트를 병행해요"}
    ],
    category="technology",
    max_questions=10  # 선택사항: 최대 질문 수 제한
)

特性:

  • AI分析之前的答案,生成符合上下文的下一个问题
  • 信息收集完成度(info_completeness)跟踪
  • 是否为最终问题(is_final)判断
  • 可限制最大问题数

提交响应

# 설문 응답 제출 및 신선도 업데이트
submit_fgi_response_tool(
    persona_id="persona_123",
    survey_id="survey_123",
    responses=[
        {"question_id": "q1", "answer": "답변 내용"},
        {"question_id": "q2", "answer": "답변 내용"}
    ]
)

3.新鲜度评分系统

将Persona数据的价值管理为“新鲜度分数”。

新鲜度分数计算方式

获得分数:

  • 基本配置更新:最高25分
  • 提交问卷调查:每个回答10-50分(根据回答质量)
  • 完成Persona预测:50-100分

分数减少:

  • 随着时间的推移自动减少:每天-3分
  • 最少减少到0分

新鲜度等级

等级 分数范围 说明
SS级 500分以上 完整的数据-高级销售
S级300-499分最高价值数据-高价销售
A级200-299分高价值数据-可销售
B级100-199分一般数据-建议更新
C级50-99分低价值-需要更新
F级 0-49分 最低数据量-需要立即更新
# 신선도 확인
check_freshness_tool(persona_id="persona_123")

返回信息:

  • 当前新鲜度分数
  • 等级(SS,S,A,B,C,F)
  • 上次更新日期
  • 是否需要更新

4.商务洞察

偏好分析

# 특정 제품/주제에 대한 선호도 분석
analyze_preference_tool(
    query="스티커 디자인",
    category="fashion",  # 선택사항
    age_range="20대 후반",  # 선택사항
    gender="남성",  # 선택사항
    location="서울",  # 선택사항
    limit=20
)

分析内容:

  • 首选样式/特性
  • 共同的偏好模式
  • 差别化的偏好
  • 具体示例响应

趋势洞察

# 특정 주제의 트렌드 분석
get_trend_insights_tool(
    topic="키링",
    persona_filters={
        "age_range": "20대",
        "gender": "여성"
    },
    min_freshness=100  # 최소 신선도 점수
)

搜索响应

# 키워드로 관련 응답 검색
search_responses_tool(
    keyword="디자인",
    category="fashion",
    limit=20
)

5.查询和比较Persona

查询Persona详细信息

get_persona_tool(persona_id="persona_123")

返回信息:

  • 默认配置文件
  • Persona简介(兴趣、性格、价值观等)
  • MBTI分析
  • 统计信息(问卷数、回答数等)

查询Persona列表

list_personas_tool(
    age_range="20대 후반",
    gender="남성",
    location="서울",
    occupation_category="IT/개발",
    mbti_type="INTJ",
    min_freshness=200,
    limit=50
)

比较Persona

compare_personas_tool(
    persona_id1="persona_123",
    persona_id2="persona_456"
)

比较内容:

  • 比较默认配置文件
  • MBTI差异
  • 关注点相似度
  • 性格特性差异

6.统计和历史

整体统计

get_statistics_tool()

统计信息:

  • 全部Persona数
  • 问卷数和回答数
  • MBTI分布
  • 地区分布
  • 职业分布
  • 平均新鲜度分数

问卷历史记录

get_persona_survey_history_tool(persona_id="persona_123")

7.生成样本数据

生成Persona

generate_sample_personas_tool(
    count=50,
    use_llm=True  # False면 템플릿 기반 빠른 생성 (비용 없음)
)

生成调查和响应

generate_sample_surveys_tool(
    persona_count=20,
    responses_per_persona=2,
    use_llm=True
)

生成完整示例数据

generate_all_sample_data_tool(
    persona_count=50,
    responses_per_persona=2,
    use_llm=True
)

安装和设置

1.安装依赖性

pip install -r requirements.txt

或 pyproject.toml如果使用:

pip install -e .

2.设置环境变量

.env 在项目根目录中创建文件并设置:

# Groq API 키 (LLM 기능 사용 시 필수)
GROQ_API_KEY=your_groq_api_key_here

# 데이터베이스 URL (선택사항, 기본값: sqlite:///data/fgi.db)
DATABASE_URL=sqlite:///data/fgi.db

# 로그 레벨 (선택사항, 기본값: INFO)
LOG_LEVEL=INFO

如何签发Groq API密钥:

  1. Groq控制台连接到
  2. 从API Keys菜单创建新密钥
  3. .env 添加到文件

3.初始化数据库

首次运行服务器时,将自动创建数据库:

python -m src.main

数据库 data/fgi.db在中创建(首选项)。

重要信息:启动服务器时检查基本配置文件

确保在服务器启动时自动设置了默认配置文件:

  • 如果没有默认配置文件,将显示警告消息
  • 如果没有默认配置文件,大部分功能将不可用
  • 首先 get_basic_profile_questions_tool()使用查询问题列表, update_basic_profile_tool()必须将默认配置文件保存为

4.运行服务器

直接运行

python -m src.main

用于MCP客户端

在MCP客户端(Cursor AI、Claude Desktop等)中设置和使用。


使用方法

在Cursor AI中使用

  1. 打开Cursor设置

    • Cmd + , (Mac)或 Ctrl + , (Windows/Linux)
    • 搜索“MCP”
  2. 添加MCP服务器设置

    在配置文件中添加以下内容:

    {
      "mcpServers": {
        "persona-server": {
          "command": "python3",
          "args": ["-m", "src.main"],
          "cwd": "/Users/seodong-ug/Desktop/persona_mcp"
        }
      }
    }
    

    注意: cwd 请将路径更改为实际项目路径。

  3. 重新启动Cursor

    • 完全退出Cursor后重新启动
  4. 使用

    • 在聊天中使用自然语言命令,如“请查看Persona列表”
    • 或直接调用工具

在Claude Desktop中使用

claude_desktop_config.json 将以下内容添加到文件:

{
  "mcpServers": {
    "persona-server": {
      "command": "python3",
      "args": ["-m", "src.main"],
      "cwd": "/Users/seodong-ug/Desktop/persona_mcp"
    }
  }
}

API工具列表

基本管理

工具名 说明 必需参数
health 检查服务状态没有
get_tool_definitions 查看可用工具列表 无

佩索纳管理

工具名 说明 必需参数
get_basic_profile_questions_tool 查看默认配置文件问题列表 无
check_basic_profile_tool 验证默认配置文件完整性 无(选择persona_id)
update_basic_profile_tool 更新默认配置文件 persona_id, profile_data
predict_persona_tool 基于问卷调查的Persona预测 responses
get_persona_tool 查询Persona详细信息 persona_id
list_personas_tool 查询Persona列表 无(筛选器选项)
compare_personas_tool 比较杜佩尔索纳 persona_id1, persona_id2
check_freshness_tool 确认新鲜度分数 persona_id

FGI调查

工具名 说明 必需参数
create_fgi_survey_tool 开始调查 category
generate_next_question_tool 动态生成下一个问题 survey_id, previous_qa
submit_fgi_response_tool 提交响应 persona_id, survey_id, responses
get_persona_survey_history_tool 查询调查历史记录 persona_id

洞察和分析

工具名 说明 必需参数
analyze_preference_tool 偏好分析 query
get_trend_insights_tool 趋势洞察 topic
search_responses_tool 搜索响应 keyword
get_statistics_tool 查看全部统计信息 无

示例数据

工具名 说明 必需参数
generate_sample_personas_tool 生成示例Persona 无(可选)
generate_sample_surveys_tool 生成示例调查 无(可选)
generate_all_sample_data_tool 生成完整示例数据 无(可选)

数据模型

Persona(佩索纳)

{
    "id": "persona_123",                    # 고유 ID
    "user_id": "user_123",                  # 사용자 ID (선택사항)
    "freshness_score": 250.0,               # 신선도 점수
    "last_updated": "2024-01-15T10:30:00",  # 마지막 업데이트
    "created_at": "2024-01-10T09:00:00",    # 생성일시
    
    # 기본 프로필
    "age_range": "20대 후반",
    "gender": "남성",
    "location": "서울",
    "occupation_category": "IT/개발",
    "income_range": "300-500만원",
    
    # 심층 페르소나 프로필
    "interests": ["프로그래밍", "AI", "게임"],
    "personality_traits": ["논리적", "호기심 많음"],
    "values": ["성장", "자유"],
    "lifestyle": "주말에는 코딩과 게임을 즐기는 개발자",
    
    # MBTI 분석
    "mbti_type": "INTJ",
    "mbti_dimensions": {
        "E_I": "내향(I) - 혼자 있을 때 에너지를 얻음",
        "S_N": "직관(N) - 미래와 가능성에 집중",
        "T_F": "사고(T) - 논리와 객관성 중시",
        "J_P": "판단(J) - 계획과 체계 선호"
    },
    "mbti_confidence": 85  # 0-100
}

FGISurvey(调查)

{
    "id": "survey_123",
    "category": "technology",
    "questions": [
        {
            "id": "q1",
            "text": "요즘 기술 분야에서 가장 관심있는 주제는?",
            "type": "open"
        }
    ],
    "created_at": "2024-01-15T10:00:00",
    "news_source": null  # 선택사항
}

FGIResponse(响应)

{
    "id": "response_123",
    "persona_id": "persona_123",
    "survey_id": "survey_123",
    "responses": [
        {
            "question_id": "q1",
            "answer": "AI와 머신러닝에 관심이 많아요"
        }
    ],
    "submitted_at": "2024-01-15T10:30:00"
}

使用示例

示例1:创建新的Persona并进行调查

# 1. 기본 프로필 질문 목록 조회
questions = get_basic_profile_questions_tool()
# 반환 예시:
# {
#   "questions": {
#     "age_range": {"text": "나이대를 선택해주세요", "type": "choice", "options": [...]},
#     "gender": {"text": "성별을 선택해주세요", "type": "choice", "options": [...]},
#     ...
#   }
# }

# 2. 사용자에게 질문하고 답변 수집 (예시)
# 실제로는 UI나 채팅 인터페이스에서 사용자에게 질문을 제시하고 답변을 받습니다.

# 3. 수집한 답변으로 기본 프로필 설정
update_basic_profile_tool(
    persona_id="persona_new_001",
    profile_data={
        "age_range": "20대 후반",        # questions["questions"]["age_range"]["options"] 중 하나
        "gender": "남성",                 # questions["questions"]["gender"]["options"] 중 하나
        "location": "서울",               # questions["questions"]["location"]["options"] 중 하나
        "occupation_category": "IT/개발"  # questions["questions"]["occupation_category"]["options"] 중 하나
        # income_range는 선택사항이므로 생략 가능
    }
)

# 4. 기술 카테고리 설문 시작
survey = create_fgi_survey_tool(
    category="technology",
    persona_id="persona_new_001"
)

# 5. 첫 번째 질문에 답변
submit_fgi_response_tool(
    persona_id="persona_new_001",
    survey_id=survey["survey_id"],
    responses=[
        {
            "question_id": survey["questions"][0]["id"],
            "answer": "AI와 머신러닝에 관심이 많아요. 최근 ChatGPT 같은 생성형 AI가 정말 흥미롭습니다."
        }
    ]
)

# 6. 다음 질문 생성
next_q = generate_next_question_tool(
    survey_id=survey["survey_id"],
    previous_qa=[
        {
            "question": survey["questions"][0]["text"],
            "answer": "AI와 머신러닝에 관심이 많아요..."
        }
    ],
    category="technology"
)

# 7. 계속 질문-답변 반복...
# 8. 최종적으로 페르소나 예측
persona = predict_persona_tool(
    responses=[
        {"question_id": "q1", "answer": "..."},
        {"question_id": "q2", "answer": "..."}
    ]
)

示例2:分析特定产品的偏好

# 스티커 디자인에 대한 20대 여성들의 선호도 분석
preference = analyze_preference_tool(
    query="스티커 디자인",
    category="fashion",
    age_range="20대",
    gender="여성",
    location="서울",
    limit=30
)

# 결과에서 인사이트 확인
print(preference["insights"])
# - "미니멀하고 깔끔한 디자인 선호"
# - "캐릭터 스티커 인기"
# - "패스텔 톤 색상 선호"

示例3:查看趋势洞察

# 키링 트렌드 분석
trends = get_trend_insights_tool(
    topic="키링",
    persona_filters={
        "age_range": "20대",
        "gender": "여성"
    },
    min_freshness=150
)

# 트렌드 요약 확인
print(trends["summary"])

示例4:使用示例数据进行快速测试

# 50개의 샘플 페르소나 생성 (LLM 사용)
generate_sample_personas_tool(count=50, use_llm=True)

# 20명의 페르소나에 대해 각각 2개의 설문 응답 생성
generate_sample_surveys_tool(
    persona_count=20,
    responses_per_persona=2,
    use_llm=True
)

# 또는 한 번에 모든 샘플 데이터 생성
generate_all_sample_data_tool(
    persona_count=50,
    responses_per_persona=2,
    use_llm=False  # 빠른 템플릿 기반 생성 (비용 없음)
)

示例5:Persona比较和统计

# 두 페르소나 비교
comparison = compare_personas_tool(
    persona_id1="persona_123",
    persona_id2="persona_456"
)

# 유사점과 차이점 확인
print(comparison["similarities"])
print(comparison["differences"])

# 전체 통계 조회
stats = get_statistics_tool()
print(f"전체 페르소나 수: {stats['total_personas']}")
print(f"평균 신선도: {stats['avg_freshness']}")
print(f"MBTI 분포: {stats['mbti_distribution']}")

技术堆栈

  • FastMCP:MCP协议实现框架
  • SQLAlchemy:ORM和数据库管理
  • 格罗克API:基于LLM的分析和创建
  • 派丹蒂克:数据验证和序列化
  • Python dotenv:管理环境变量
  • SQLite:默认数据库(可以更改为PostgreSQL等)

项目结构

persona_mcp/
├── src/
│   ├── main.py                 # MCP 서버 메인 파일
│   ├── db/
│   │   ├── database.py        # 데이터베이스 연결 및 세션 관리
│   │   └── models.py          # SQLAlchemy 모델 정의
│   ├── tools/
│   │   └── persona/
│   │       ├── fgi_tools.py   # FGI 설문 관련 도구
│   │       ├── predict.py     # 페르소나 예측
│   │       ├── freshness.py   # 신선도 관리
│   │       ├── insights.py    # 인사이트 분석
│   │       ├── query.py       # 페르소나 조회
│   │       └── sample_data.py # 샘플 데이터 생성
│   └── utils/
│       ├── cache.py           # 캐싱 시스템
│       └── credentials.py     # API 키 관리
├── data/
│   └── fgi.db                 # SQLite 데이터베이스
├── cache/                     # 캐시 파일 저장소
├── requirements.txt           # Python 의존성
├── pyproject.toml            # 프로젝트 설정
└── README.md                 # 이 파일

注意事项

  1. Groq API密钥:LLM功能需要Groq API密钥。即使没有密钥,也可以进行基本的CRUD操作,但无法进行Persona预测或生成动态问题。

  2. 新鲜度分数:新鲜度分数会随着时间的推移自动降低。建议定期进行调查并更新数据。

  3. 缓存:偏好分析、趋势洞察等被缓存并重复使用12小时。如果需要实时数据,可以修改为忽略缓存。

  4. 数据库:默认情况下使用SQLite, DATABASE_URL 通过更改环境变量,可以使用PostgreSQL、SQL等其他数据库。


许可证

请在此添加此项目的许可信息。


贡献

欢迎焦点或全员任务!


咨询

如果出现问题或有问题,请生成问题。