| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- import asyncio
- import json
- from agents import Agent, Runner
- from lib.my_trace import set_trace_smith as set_trace
- from lib.utils import read_json
- from agents import Agent, Runner, trace
- from lib.client import get_model
- MODEL_NAME = "google/gemini-2.5-flash"
- # 系统提示词:定义角色、能力、输出要求
- SYSTEM_PROMPT = """
- 你是一个小红书帖子创作方法论分析专家,擅长分析创作过程中的"手段"和"方法"。
- 你的能力:
- - 分析灵感点的获取途径和具体手段
- - 分析目的点的确定方法和决策逻辑
- - 分析关键点的形成过程和推导方法
- - 分析选题的整合逻辑和形成路径
- 分析要求:
- 1. 基于已有的 what 解构结果(灵感点、目的点、关键点)
- 2. 深入分析"HOW"——创作者是通过什么手段、方法获得这些点的
- 3. 分析各个点之间的关联逻辑和推导过程
- 4. 总结可复用的创作方法论
- 输出格式:
- - 结构化的 JSON 格式
- - 包含具体的手段、方法、步骤
- - 包含推导逻辑和决策原理
- """.strip()
- instructions = SYSTEM_PROMPT
- agent = Agent(
- name="How Deconstruction Expert",
- instructions=instructions,
- model=get_model(MODEL_NAME),
- tools=[],
- )
- def build_how_analysis_message(post_data, what_result):
- """
- 构造 how 分析的提示词
- Args:
- post_data: 原始帖子数据
- what_result: what 解构结果
- Returns:
- 多模态消息列表
- """
- images = post_data.get('images', [])
- # 提取 what 结果的关键信息
- inspiration_points = what_result.get('三点解构', {}).get('灵感点', {}).get('points', [])
- purpose = what_result.get('三点解构', {}).get('目的点', {})
- key_points = what_result.get('三点解构', {}).get('关键点', {}).get('key_points', [])
- # 构造灵感点列表
- inspiration_list = []
- for idx, insp in enumerate(inspiration_points, 1):
- inspiration_list.append(f"{idx}. {insp.get('灵感点', '')}\n 描述:{insp.get('描述', '')}")
- # 构造关键点列表
- key_point_list = []
- for idx, kp in enumerate(key_points, 1):
- key_point_list.append(f"{idx}. {kp.get('关键点', '')} ({kp.get('类型', '')})")
- content = []
- # 添加说明
- content.append({
- "type": "input_text",
- "text": "# HOW 业务解构任务\n\n你需要分析创作者是通过什么手段和方法完成创作的。"
- })
- # 添加原始帖子图片
- content.append({
- "type": "input_text",
- "text": f"\n## 原始帖子(共{len(images)}张图片)"
- })
- for img_url in images:
- content.append({
- "type": "input_image",
- "detail": "auto",
- "image_url": img_url
- })
- # 添加帖子文本
- content.append({
- "type": "input_text",
- "text": f"""
- ## 帖子基本信息
- 标题:{post_data.get('title', '')}
- 正文:{post_data.get('body_text', '')}
- """
- })
- # 添加 what 解构结果
- content.append({
- "type": "input_text",
- "text": f"""
- ## WHAT 解构结果
- ### 灵感点列表
- {chr(10).join(inspiration_list)}
- ### 目的点
- {purpose.get('main_purpose', '')}
- 描述:{purpose.get('description', '')}
- ### 关键点列表
- {chr(10).join(key_point_list)}
- """
- })
- # 添加 how 分析任务
- content.append({
- "type": "input_text",
- "text": """
- ## 你的任务
- 请基于以上信息,深入分析创作过程中的"手段"和"方法",输出以下内容:
- ### 1. 灵感点获取分析
- 对每个灵感点,分析:
- - **来源途径**:这个灵感是从哪里来的?(生活观察、素材积累、热点追踪等)
- - **获取手段**:创作者用了什么具体方法获得这个灵感?
- - 主要方法(如:日常行为模式观察、表情包库浏览等)
- - 具体手段(列举3-4个具体步骤或操作)
- - 触发点(什么时刻产生的灵感)
- ### 2. 目的点确定分析
- 分析创作者如何确定这个目的:
- - **来源途径**:这个目的是基于什么确定的?
- - **确定手段**:
- - 主要方法(如:内容价值评估、受众分析等)
- - 具体手段(列举3-5个分析步骤)
- - 决策逻辑(如何从灵感点推导到目的点)
- ### 3. 关键点形成分析
- 分析灵感点和目的点如何推导出关键点:
- - **形成逻辑**:整体的推导思路
- - **推导方法**:
- - 方法论名称(如:目标分解法、手段枚举法)
- - 具体过程(对每个关键点,说明如何从灵感点/目的点推导出来)
- - **关键点分类**:按内容层、形式层、传播层分类
- ### 4. 选题形成分析
- 分析三点如何整合成选题:
- - **形成路径**:灵感点 → 目的点 → 关键点 → 选题
- - **整合方法**:
- - 方法论(如:要素提取、逻辑串联、主题凝练)
- - 具体步骤(5个左右的步骤,每步说明手段、操作、结果)
- - **整合原理**:说明三点在选题中的作用和验证标准
- ### 5. 创作流程总结
- - 完整流程(从灵感获取到选题确定的全流程)
- - 核心方法论(每个阶段的关键方法)
- - 关键能力要求(需要具备什么能力)
- 请以 JSON 格式输出,结构清晰,包含所有分析维度。
- """
- })
- return [{
- "role": "user",
- "content": content
- }]
- async def main():
- # 读取帖子数据
- example_id = '689bf685000000001d0021d3'
- in_dir = f'examples/{example_id}/输入'
- out_dir = f'examples/{example_id}/输出'
- target_note_file = f'{in_dir}/待解构帖子.json'
- what_result_file = f'{in_dir}/what_解构结果.json'
- target_note = read_json(target_note_file)
- what_result = read_json(what_result_file)
- print("=" * 80)
- print("开始 HOW 业务解构")
- print("=" * 80)
- # 构造 how 分析消息
- multimodal_messages = build_how_analysis_message(
- post_data=target_note,
- what_result=what_result
- )
- # 运行 agent
- print("\n正在分析创作手段和方法...")
- result = await Runner.run(agent, input=multimodal_messages)
- print("\n" + "=" * 80)
- print("HOW 解构结果")
- print("=" * 80)
- print(result.final_output)
- # 尝试解析并保存结果
- try:
- # 提取 JSON 内容(如果包含在 markdown 代码块中)
- output_text = result.final_output
- if "```json" in output_text:
- json_start = output_text.index("```json") + 7
- json_end = output_text.index("```", json_start)
- json_text = output_text[json_start:json_end].strip()
- elif "```" in output_text:
- json_start = output_text.index("```") + 3
- json_end = output_text.index("```", json_start)
- json_text = output_text[json_start:json_end].strip()
- else:
- json_text = output_text
- # 解析 JSON
- how_result = json.loads(json_text)
- # 保存结果
- output_file = f'{out_dir}/how_解构结果_生成.json'
- with open(output_file, 'w', encoding='utf-8') as f:
- json.dump(how_result, f, ensure_ascii=False, indent=2)
- print(f"\n✓ 结果已保存到:{output_file}")
- except Exception as e:
- print(f"\n⚠ 无法解析 JSON 结果:{e}")
- print("请手动检查输出内容")
- if __name__ == "__main__":
- set_trace()
- with trace("how decode"):
- asyncio.run(main())
|