关于播客生成的探索(二):Multiagent 的可能性
在上一篇文章《关于播客生成的探索(一)》中,我们初步聊了聊利用AI技术生成播客的可能性,顺带拆解了一个开源项目PodCastLM。结论其实挺清晰的:直接靠Prompt驱动整个流程,确实能跑通,但一旦面对复杂文档、多文档联合生成、或者多人对话这种场景,局限性马上就暴露出来了。
那么,有没有更精细、更具扩展性的路子?最近,目光自然落到了Multiagent这个概念上。把多个智能体拆开、分好工、再协同作战——这思路用来解决之前碰上的那些技术难题,听起来很对味。今天这篇文章,就围绕这个方向展开,希望能给大家带来一些不一样的启发。
引入Multiagent的概念

Multiagent系统,字面意思就是由多个智能体(Agent)组成的系统。每个Agent都有自己明确的目标、能力和知识储备,既能感知外部环境、独立做决策,又能跟其他Agent互相沟通。最后大家一起协作,把复杂任务啃下来。
把这个思路搬到播客生成上,核心想法非常直接:把播客生成这个任务拆成多个子任务,然后分配给不同的Agent去各管一摊。每个Agent只干自己最擅长的那件事,彼此配合,最终产出高质量的播客内容。
基于Multiagent的播客生成架构设想
上面那张图是一个初步的架构设想。我们暂且定义了下面这几个核心Agent:
- 负责深度解析输入的文档,提取关键信息、主题、论点、人物关系等。跟简单的文本提取不同,它更偏向语义理解和知识抽取。
文档理解Agent(Document Understanding Agent):
- 根据文档内容和设定的播客类型,确定谁来扮演什么角色——主持人、嘉宾A、嘉宾B,全由它来拍板。它得理解不同角色的特点和分工。
角色扮演Agent(Role Assignment Agent):
- 这是核心中的核心。它基于文档理解Agent传过来的信息和角色扮演Agent的设定,生成具体的对话内容。可以根据角色数量和对话风格,设计多个对话生成Agent并行工作。
对话生成Agent(Dialogue Generation Agent):
- 负责把零散的对话片段合理地组织、串联起来,确保整个播客流畅通、逻辑在线。开场白、结尾语、转场这些活儿,也归它管。
内容串联Agent(Content Orchestration Agent):
- 对生成的播客脚本做质量把关——检查内容的准确性、逻辑性、趣味性,然后给出改进建议。这能帮助我们持续优化生成效果。
质量评估Agent(Quality Assessment Agent):
Multiagent如何解决现有难点
对比上一篇提到的技术难点,Multiagent这套架构看起来更有底气:
- 文档理解Agent可以用更精细化的NLP技术——结构化信息抽取、知识图谱构建——来处理复杂的PDF文件。甚至可以为不同类型的文档配置不同的处理策略。
文档处理难度:
- 给每个文档分配一个文档理解Agent,然后让对话生成Agent综合多个文档的信息进行讨论。内容串联Agent则负责把不同文档的主题自然过渡、融合。
多文档联合生成:
- 为每个参与者分配一个独立的对话生成Agent。这些Agent可以并行工作,互相影响,像真实对话那样互动起来。角色扮演Agent则负责定义每个人的性格和发言风格。
多人场景:
开源实现的探索方向
第一次探索时我们提到了PodCastLM这个开源项目。基于Multiagent的思路,可以在它的基础上做改造,也可以去探索其他更适合构建Multiagent系统的框架。
接下来,可能会尝试上述设想来搭一个简单的播客生成Demo,验证一下Multiagent的可行性。
为了不影响阅读,下面贴一段代码片段:
class HistoryMessage:
def __init__(self) -> None:
self._history_messages = []
def add(self, role, message):
self._history_messages.append({
"role": role,
"content": message
})
def to_string(self):
content = ""
for msg in self._history_messages:
content += f"{msg['role']}: {msg['content']}n"
return content
class HostAgent:
def __init__(self) -> None:
self.llm_client = LLM()
def get_introduce(self, context: str):
prompt = HOST_PROMPT_INTRODUCE.format(context=context,
host_name=config.HOST_NAME,
guest_name=config.GUEST_NAME,
guest_introduction=config.GUEST_INTRODUCTION)
for info in self.llm_client.fetch_stream(prompt, temperature=0.7):
yield info
def get_conversation(self, context: str, history_messages: HistoryMessage):
prompt = HOST_CONVERSATION.format(context=context,
history=history_messages.to_string(),
host_name=config.HOST_NAME,
host_introduction=config.HOST_INTRODUCTION,
guest_name=config.GUEST_NAME,
guest_introduction=config.GUEST_INTRODUCTION,
conversation_max_rounds=config.CONVERSATION_MAX_LENGTH)
print (prompt)
content = ""
for info in self.llm_client.fetch_stream(prompt, temperature=0.7):
print (info, flush=True, end="")
content += info
print ()
return content
上面是一个非常简化的代码框架,用来演示Multiagent的基本工作流程。在实际应用中,每个Agent的实现要复杂得多,需要集成各种NLP模型和技术。
另外,也可以考虑用配置文件(比如YAML)来定义Agent的类型、角色和交互方式,提升整个系统的灵活性和可配置性。
agents:
document_understander:
type: DocumentUnderstandingAgent
config:
model_name: ""
role_assigner:
type: RoleAssignmentAgent
config:
num_roles: 2
dialogue_generator_host:
type: DialogueGenerationAgent
config:
model_name: "gpt-4o"
role_prompt: "You are the host of the podcast..."
dialogue_generator_guest:
type: DialogueGenerationAgent
config:
model_name: "gpt-4o"
role_prompt: "You are an expert on..."
content_orchestrator:
type: ContentOrchestrationAgent
效果展示
用“鸡兔同笼”这个问题作为输入,直接看效果。为了不影响阅读,这里只截取了部分生成结果。
小美: 大家好,欢迎收听《小美的趣味数学时光》,我是你们的主持人小美。今天我们邀请到了一位特别的嘉宾,小明,他是一位正在努力学习数学的四年级学生。今天,我们将一起探讨一个古代趣题——鸡兔同笼问题,了解其中的解法和背后的数学智慧。小明,准备好了吗?让我们开始吧!
小明: 大家好,我是小明。我已经准备好了!小美,今天我们要聊的鸡兔同笼问题听起来很有趣,我迫不及待想知道其中的解法了。
小美: 那太好了!鸡兔同笼问题是一个很经典的数学问题,最早出现在《孙子算经》里。那么,小明,你知道鸡兔同笼问题的具体内容是什么吗?
小明: 当然知道!问题是:笼子里有35个头和94只脚,问有多少只鸡和兔子。这个问题考察的是我们如何通过已知条件进行推理和计算。
小美: 没错!鸡兔同笼问题的确非常有趣。接下来,我们可以尝试用不同的方法来解答这个问题。小明,你想先听哪种方法呢?吹哨法、砍足法、假设法还是方程解法?
小明: 小美,我想先听听吹哨法!这个方法听起来就很有趣,好像在指挥一场动物表演呢。
小美: 好的,小明!吹哨法确实有趣。假设所有鸡兔听到哨声都抬起一只脚,这时地上还有多少只脚呢?
小明: 地上还会有94-35=59只脚。再吹一次哨,每只动物再抬一只脚,这时地上还有24只脚。这样只有兔子还有脚在地上。
小美: 没错,小明!现在所有的鸡都抬起了两只脚,地上剩下的24只脚都是兔子的。那么兔子的数量是多少呢?
小明: 兔子的数量是24➗2=12只,那么鸡的数量就是35-12=23只。这样我们就解出了鸡兔同笼的问题!
小美: 小明,你真是聪明!吹哨法确实很有意思。那么接下来,我们再来试试砍足法吧。你知道砍足法的步骤是什么吗?
小明: 砍足法的步骤是先假设每只鸡和兔都砍掉一半的脚,这样鸡有一只脚,兔子有两只脚,然后计算总脚数的一半。再根据脚比头多的数量确定兔子的数量。
小美: 对的,小明!假设每只鸡和兔各砍掉一半的脚后,总脚数就变成了47只。现在你知道兔子的数量是多少了吗?