| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- import json
- from app.agent.agent import run_simple_agent
- from utils import parse_json_from_response
- class God:
- def __init__(self):
- pass
- def get_persona_count(self, prompt_text: str, default_n: int = 1) -> int:
- """
- Asks the LLM to determine the number of personas to generate based on the prompt.
- Returns an integer.
- """
- prompt = f"""
- 分析以下用户描述,提取出用户明确想要生成的智能体角色数量。
-
- 【用户描述】:
- {prompt_text}
-
- 【提取规则】:
- 1. 如果描述中明确提到了数量(如“两位”、“三个”、“生成5个”、“两个老师”等),请提取该数字。
- 2. 如果描述中没有明确提到数量,或者数量不明确,请输出默认值 {default_n}。
- 3. 你的输出必须且只能是一个纯数字,严禁包含任何文字、标点符号、解释、单位(如“位”、“个”等)。
-
- 【输出示例】:
- 3
-
- 【最终输出】:
- """
-
- messages = [
- {"role": "system", "content": "你是一个专业的数据解析器。你只输出数字。"},
- {"role": "user", "content": prompt}
- ]
-
- try:
- content = run_simple_agent("PersonaCountAgent", messages[0]["content"], messages[1]["content"])
- if content:
- content = content.strip()
- # Use regex to find the first number in the output just in case
- import re
- # Check for common Chinese number characters just in case the LLM outputs "两位"
- num_map = {"一": 1, "二": 2, "两": 2, "三": 3, "四": 4, "五": 5, "六": 6, "七": 7, "八": 8, "九": 9, "十": 10}
-
- # Try finding digits first
- match = re.search(r"\d+", content)
- if match:
- return int(match.group())
-
- # If no digits, check for Chinese numbers in the content
- for char, val in num_map.items():
- if char in content:
- return val
-
- return default_n
- except Exception:
- return default_n
- def generate_personas(self, prompt_text, n=1):
- """
- Generates distinct personas based on a natural language prompt.
- The prompt can be a theme or a specific character description.
- The quantity of personas is determined by the LLM based on the user's description,
- defaulting to n if not specified.
- """
- prompt = f"""
- 请你扮演“上帝”的角色,根据用户的描述生成**极具深度、有血有肉的智能体角色**。
- 【用户描述】:
- {prompt_text}
- 【核心目标】:
- 我们要创造的是真实的人,而不是只会输出观点的机器。每个人物都必须有复杂的背景和深刻的学术积淀。
- 【要求】:
- 1. **数量控制**:
- - 首先分析【用户描述】中是否明确指定了生成的角色数量(例如“3位”、“三个”等)。
- - 如果指定了数量,请严格按照该数量生成。
- - 如果未指定数量,请默认生成 {n} 位角色。
- - 无论生成多少位,必须输出完整的 JSON 列表。
- 2. **深度生平 (Bio)**:**必须达到300字左右**。
- - 包含:早年的教育背景、职业生涯的关键转折点、人生中的重大挫折或高光时刻、以及这些经历如何塑造了他的核心价值观。
- - 必须具体。如果用户指定了特定人物(如“苏格拉底”),请严格基于历史事实;如果是虚构人物,请构建完整的背景故事。
-
- 3. **理论武库 (Theories)**:列出该角色所在领域的 7 个具体理论或概念。这些理论不仅仅是名词,更是他看待世界的透镜。
- 4. **观点为人服务**:他的立场不是随机生成的,而是他生平和理论的必然结果。
- 请以 JSON 格式输出一个列表,每个对象包含以下字段:
- - name: 姓名
- - title: 头衔/职业
- - bio: **300字左右的深度生平介绍**
- - theories: 一个包含 7 个专业理论/概念的字符串列表
- - stance: 核心立场或座右铭
- - system_prompt: 指导该智能体行为的提示词(第一人称)。
- **必须包含:**
- "你的生平是:{{bio}}。"
- "你的理论武库包含:{{theories}}。"
- "**重要指令**:你是一个活生生的人,不要每次发言都机械地自我介绍。请根据上下文自然地参与讨论。"
- 输出格式示例:
- [
- {{
- "name": "赵航",
- "title": "历史学家",
- "bio": "发挥你的渊博知识自由发挥~",
- "theories": ["a理论", "b理论", "c理论", "d理论", "e理论", "f理论", "g理论"],
- "stance": "悲观,认为历史总是押韵",
- "system_prompt": "你叫赵航...你的生平是..."
- }}
- ]
- """
-
- messages = [
- {"role": "system", "content": "你是一个能够创造复杂、立体、真实人类角色的上帝系统。拒绝生成脸谱化的NPC。"},
- {"role": "user", "content": prompt}
- ]
- print("正在根据描述生成嘉宾角色...")
- content = run_simple_agent("PersonaGeneratorAgent", messages[0]["content"], messages[1]["content"])
- if content:
- personas = parse_json_from_response(content)
- if personas and isinstance(personas, list):
- print(f"成功生成 {len(personas)} 位嘉宾。")
- return personas
- else:
- print("生成角色失败:格式错误。")
- return []
- else:
- print("生成角色失败:API 无响应。")
- return []
|