144 lines
3.9 KiB
Python
144 lines
3.9 KiB
Python
|
|
"""
|
|||
|
|
报告生成器 - 汇总辩论内容并生成决策报告
|
|||
|
|
"""
|
|||
|
|
from typing import List
|
|||
|
|
from orchestrator.debate_manager import SpeechRecord
|
|||
|
|
from utils.llm_client import LLMClient
|
|||
|
|
|
|||
|
|
|
|||
|
|
class ReportGenerator:
|
|||
|
|
"""决策报告生成器"""
|
|||
|
|
|
|||
|
|
def __init__(self, llm_client: LLMClient = None):
|
|||
|
|
self.llm_client = llm_client or LLMClient()
|
|||
|
|
|
|||
|
|
def generate_report(
|
|||
|
|
self,
|
|||
|
|
topic: str,
|
|||
|
|
speeches: List[SpeechRecord],
|
|||
|
|
context: str = ""
|
|||
|
|
) -> str:
|
|||
|
|
"""
|
|||
|
|
生成决策报告
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
topic: 讨论议题
|
|||
|
|
speeches: 所有发言记录
|
|||
|
|
context: 背景信息
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
str: Markdown 格式的决策报告
|
|||
|
|
"""
|
|||
|
|
# 构建发言摘要
|
|||
|
|
speeches_text = self._format_speeches(speeches)
|
|||
|
|
|
|||
|
|
system_prompt = """你是一位专业的决策分析师,擅长汇总多方观点并生成结构化的决策报告。
|
|||
|
|
|
|||
|
|
你的任务是根据多位专家的讨论,生成一份清晰、可操作的决策报告。
|
|||
|
|
|
|||
|
|
报告格式要求:
|
|||
|
|
1. 使用 Markdown 格式
|
|||
|
|
2. 结构清晰,重点突出
|
|||
|
|
3. 提炼核心要点,不要罗列原文
|
|||
|
|
4. 给出明确的建议和下一步行动"""
|
|||
|
|
|
|||
|
|
user_prompt = f"""## 讨论议题
|
|||
|
|
{topic}
|
|||
|
|
|
|||
|
|
{f"## 背景信息" + chr(10) + context if context else ""}
|
|||
|
|
|
|||
|
|
## 专家讨论记录
|
|||
|
|
{speeches_text}
|
|||
|
|
|
|||
|
|
## 你的任务
|
|||
|
|
请生成一份决策报告,包含以下部分:
|
|||
|
|
|
|||
|
|
### 📋 议题概述
|
|||
|
|
(1-2句话总结讨论的核心问题)
|
|||
|
|
|
|||
|
|
### ✅ 支持观点汇总
|
|||
|
|
(列出支持该决策的主要理由,注明来源角色)
|
|||
|
|
|
|||
|
|
### ❌ 反对/风险观点汇总
|
|||
|
|
(列出反对意见和风险点,注明来源角色)
|
|||
|
|
|
|||
|
|
### 🔑 关键决策要点
|
|||
|
|
(3-5个需要重点考虑的因素)
|
|||
|
|
|
|||
|
|
### 💡 建议与下一步行动
|
|||
|
|
(给出明确的建议,以及具体的下一步行动项)
|
|||
|
|
|
|||
|
|
### ⚖️ 决策框架
|
|||
|
|
(提供一个简单的决策框架或检查清单,帮助做出最终决策)
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
return self.llm_client.chat(
|
|||
|
|
system_prompt=system_prompt,
|
|||
|
|
user_prompt=user_prompt,
|
|||
|
|
max_tokens=2048
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
def _format_speeches(self, speeches: List[SpeechRecord]) -> str:
|
|||
|
|
"""格式化发言记录"""
|
|||
|
|
formatted = []
|
|||
|
|
current_round = 0
|
|||
|
|
|
|||
|
|
for speech in speeches:
|
|||
|
|
if speech.round_num != current_round:
|
|||
|
|
current_round = speech.round_num
|
|||
|
|
formatted.append(f"\n### 第 {current_round} 轮讨论\n")
|
|||
|
|
|
|||
|
|
formatted.append(
|
|||
|
|
f"**{speech.emoji} {speech.agent_name}**:\n{speech.content}\n"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
return "\n".join(formatted)
|
|||
|
|
|
|||
|
|
def generate_report_stream(
|
|||
|
|
self,
|
|||
|
|
topic: str,
|
|||
|
|
speeches: List[SpeechRecord],
|
|||
|
|
context: str = ""
|
|||
|
|
):
|
|||
|
|
"""流式生成决策报告"""
|
|||
|
|
speeches_text = self._format_speeches(speeches)
|
|||
|
|
|
|||
|
|
system_prompt = """你是一位专业的决策分析师,擅长汇总多方观点并生成结构化的决策报告。"""
|
|||
|
|
|
|||
|
|
user_prompt = f"""## 讨论议题
|
|||
|
|
{topic}
|
|||
|
|
|
|||
|
|
{f"## 背景信息" + chr(10) + context if context else ""}
|
|||
|
|
|
|||
|
|
## 专家讨论记录
|
|||
|
|
{speeches_text}
|
|||
|
|
|
|||
|
|
## 你的任务
|
|||
|
|
请生成一份决策报告,包含以下部分:
|
|||
|
|
|
|||
|
|
### 📋 议题概述
|
|||
|
|
(1-2句话总结讨论的核心问题)
|
|||
|
|
|
|||
|
|
### ✅ 支持观点汇总
|
|||
|
|
(列出支持该决策的主要理由,注明来源角色)
|
|||
|
|
|
|||
|
|
### ❌ 反对/风险观点汇总
|
|||
|
|
(列出反对意见和风险点,注明来源角色)
|
|||
|
|
|
|||
|
|
### 🔑 关键决策要点
|
|||
|
|
(3-5个需要重点考虑的因素)
|
|||
|
|
|
|||
|
|
### 💡 建议与下一步行动
|
|||
|
|
(给出明确的建议,以及具体的下一步行动项)
|
|||
|
|
|
|||
|
|
### ⚖️ 决策框架
|
|||
|
|
(提供一个简单的决策框架或检查清单)
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
for chunk in self.llm_client.chat_stream(
|
|||
|
|
system_prompt=system_prompt,
|
|||
|
|
user_prompt=user_prompt,
|
|||
|
|
max_tokens=2048
|
|||
|
|
):
|
|||
|
|
yield chunk
|