how_decode_v1.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. import asyncio
  2. import json
  3. from agents import Agent, Runner
  4. from lib.my_trace import set_trace_smith as set_trace
  5. from lib.utils import read_json
  6. from agents import Agent, Runner, trace
  7. from lib.client import get_model
  8. MODEL_NAME = "google/gemini-2.5-flash"
  9. # 系统提示词:定义角色、能力、输出要求
  10. SYSTEM_PROMPT = """
  11. 你是一个小红书帖子创作方法论分析专家,擅长分析创作过程中的"手段"和"方法"。
  12. 你的能力:
  13. - 分析灵感点的获取途径和具体手段
  14. - 分析目的点的确定方法和决策逻辑
  15. - 分析关键点的形成过程和推导方法
  16. - 分析选题的整合逻辑和形成路径
  17. 分析要求:
  18. 1. 基于已有的 what 解构结果(灵感点、目的点、关键点)
  19. 2. 深入分析"HOW"——创作者是通过什么手段、方法获得这些点的
  20. 3. 分析各个点之间的关联逻辑和推导过程
  21. 4. 总结可复用的创作方法论
  22. 输出格式:
  23. - 结构化的 JSON 格式
  24. - 包含具体的手段、方法、步骤
  25. - 包含推导逻辑和决策原理
  26. """.strip()
  27. instructions = SYSTEM_PROMPT
  28. agent = Agent(
  29. name="How Deconstruction Expert",
  30. instructions=instructions,
  31. model=get_model(MODEL_NAME),
  32. tools=[],
  33. )
  34. def build_how_analysis_message(post_data, what_result):
  35. """
  36. 构造 how 分析的提示词
  37. Args:
  38. post_data: 原始帖子数据
  39. what_result: what 解构结果
  40. Returns:
  41. 多模态消息列表
  42. """
  43. images = post_data.get('images', [])
  44. # 提取 what 结果的关键信息
  45. inspiration_points = what_result.get('三点解构', {}).get('灵感点', {}).get('points', [])
  46. purpose = what_result.get('三点解构', {}).get('目的点', {})
  47. key_points = what_result.get('三点解构', {}).get('关键点', {}).get('key_points', [])
  48. # 构造灵感点列表
  49. inspiration_list = []
  50. for idx, insp in enumerate(inspiration_points, 1):
  51. inspiration_list.append(f"{idx}. {insp.get('灵感点', '')}\n 描述:{insp.get('描述', '')}")
  52. # 构造关键点列表
  53. key_point_list = []
  54. for idx, kp in enumerate(key_points, 1):
  55. key_point_list.append(f"{idx}. {kp.get('关键点', '')} ({kp.get('类型', '')})")
  56. content = []
  57. # 添加说明
  58. content.append({
  59. "type": "input_text",
  60. "text": "# HOW 业务解构任务\n\n你需要分析创作者是通过什么手段和方法完成创作的。"
  61. })
  62. # 添加原始帖子图片
  63. content.append({
  64. "type": "input_text",
  65. "text": f"\n## 原始帖子(共{len(images)}张图片)"
  66. })
  67. for img_url in images:
  68. content.append({
  69. "type": "input_image",
  70. "detail": "auto",
  71. "image_url": img_url
  72. })
  73. # 添加帖子文本
  74. content.append({
  75. "type": "input_text",
  76. "text": f"""
  77. ## 帖子基本信息
  78. 标题:{post_data.get('title', '')}
  79. 正文:{post_data.get('body_text', '')}
  80. """
  81. })
  82. # 添加 what 解构结果
  83. content.append({
  84. "type": "input_text",
  85. "text": f"""
  86. ## WHAT 解构结果
  87. ### 灵感点列表
  88. {chr(10).join(inspiration_list)}
  89. ### 目的点
  90. {purpose.get('main_purpose', '')}
  91. 描述:{purpose.get('description', '')}
  92. ### 关键点列表
  93. {chr(10).join(key_point_list)}
  94. """
  95. })
  96. # 添加 how 分析任务
  97. content.append({
  98. "type": "input_text",
  99. "text": """
  100. ## 你的任务
  101. 请基于以上信息,深入分析创作过程中的"手段"和"方法",输出以下内容:
  102. ### 1. 灵感点获取分析
  103. 对每个灵感点,分析:
  104. - **来源途径**:这个灵感是从哪里来的?(生活观察、素材积累、热点追踪等)
  105. - **获取手段**:创作者用了什么具体方法获得这个灵感?
  106. - 主要方法(如:日常行为模式观察、表情包库浏览等)
  107. - 具体手段(列举3-4个具体步骤或操作)
  108. - 触发点(什么时刻产生的灵感)
  109. ### 2. 目的点确定分析
  110. 分析创作者如何确定这个目的:
  111. - **来源途径**:这个目的是基于什么确定的?
  112. - **确定手段**:
  113. - 主要方法(如:内容价值评估、受众分析等)
  114. - 具体手段(列举3-5个分析步骤)
  115. - 决策逻辑(如何从灵感点推导到目的点)
  116. ### 3. 关键点形成分析
  117. 分析灵感点和目的点如何推导出关键点:
  118. - **形成逻辑**:整体的推导思路
  119. - **推导方法**:
  120. - 方法论名称(如:目标分解法、手段枚举法)
  121. - 具体过程(对每个关键点,说明如何从灵感点/目的点推导出来)
  122. - **关键点分类**:按内容层、形式层、传播层分类
  123. ### 4. 选题形成分析
  124. 分析三点如何整合成选题:
  125. - **形成路径**:灵感点 → 目的点 → 关键点 → 选题
  126. - **整合方法**:
  127. - 方法论(如:要素提取、逻辑串联、主题凝练)
  128. - 具体步骤(5个左右的步骤,每步说明手段、操作、结果)
  129. - **整合原理**:说明三点在选题中的作用和验证标准
  130. ### 5. 创作流程总结
  131. - 完整流程(从灵感获取到选题确定的全流程)
  132. - 核心方法论(每个阶段的关键方法)
  133. - 关键能力要求(需要具备什么能力)
  134. 请以 JSON 格式输出,结构清晰,包含所有分析维度。
  135. """
  136. })
  137. return [{
  138. "role": "user",
  139. "content": content
  140. }]
  141. async def main():
  142. # 读取帖子数据
  143. example_id = '689bf685000000001d0021d3'
  144. in_dir = f'examples/{example_id}/输入'
  145. out_dir = f'examples/{example_id}/输出'
  146. target_note_file = f'{in_dir}/待解构帖子.json'
  147. what_result_file = f'{in_dir}/what_解构结果.json'
  148. target_note = read_json(target_note_file)
  149. what_result = read_json(what_result_file)
  150. print("=" * 80)
  151. print("开始 HOW 业务解构")
  152. print("=" * 80)
  153. # 构造 how 分析消息
  154. multimodal_messages = build_how_analysis_message(
  155. post_data=target_note,
  156. what_result=what_result
  157. )
  158. # 运行 agent
  159. print("\n正在分析创作手段和方法...")
  160. result = await Runner.run(agent, input=multimodal_messages)
  161. print("\n" + "=" * 80)
  162. print("HOW 解构结果")
  163. print("=" * 80)
  164. print(result.final_output)
  165. # 尝试解析并保存结果
  166. try:
  167. # 提取 JSON 内容(如果包含在 markdown 代码块中)
  168. output_text = result.final_output
  169. if "```json" in output_text:
  170. json_start = output_text.index("```json") + 7
  171. json_end = output_text.index("```", json_start)
  172. json_text = output_text[json_start:json_end].strip()
  173. elif "```" in output_text:
  174. json_start = output_text.index("```") + 3
  175. json_end = output_text.index("```", json_start)
  176. json_text = output_text[json_start:json_end].strip()
  177. else:
  178. json_text = output_text
  179. # 解析 JSON
  180. how_result = json.loads(json_text)
  181. # 保存结果
  182. output_file = f'{out_dir}/how_解构结果_生成.json'
  183. with open(output_file, 'w', encoding='utf-8') as f:
  184. json.dump(how_result, f, ensure_ascii=False, indent=2)
  185. print(f"\n✓ 结果已保存到:{output_file}")
  186. except Exception as e:
  187. print(f"\n⚠ 无法解析 JSON 结果:{e}")
  188. print("请手动检查输出内容")
  189. if __name__ == "__main__":
  190. set_trace()
  191. with trace("how decode"):
  192. asyncio.run(main())