本示例展示了DialogueAgent
和DialogueSimulator
类如何轻松地将两人《龙与地下城》示例扩展到多个玩家。
模拟两个玩家和多个玩家之间的主要区别在于修改每个代理发言的调度方式。
为此,我们增强了DialogueSimulator
以接受一个自定义函数,该函数决定哪个代理发言的调度。在下面的示例中,每个角色以轮询方式发言,讲述者在每个玩家之间穿插。
导入LangChain相关模块
from typing import Callable, List
from langchain.schema import (
HumanMessage,
SystemMessage,
)
from langchain_openai import ChatOpenAI
# 导入必要的模块和类
# typing用于类型提示
# langchain.schema中导入消息类型
# langchain_openai导入ChatOpenAI模型
DialogueAgent
类
DialogueAgent
类是ChatOpenAI
模型的一个简单包装器,它从dialogue_agent
的角度存储消息历史,只需将消息作为字符串连接起来。
它暴露了两个方法:
send()
: 将chatmodel应用于消息历史并返回消息字符串receive(name, message)
: 将name
说的message
添加到消息历史中
class DialogueAgent:
def __init__(
self,
name: str,
system_message: SystemMessage,
model: ChatOpenAI,
) -> None:
self.name = name
self.system_message = system_message
self.model = model
self.prefix = f"{
self.name}: "
self.reset()
def reset(self):
self.message_history = ["Here is the conversation so far."]
def send(self) -> str:
"""
将chatmodel应用于消息历史并返回消息字符串
"""
message = self.model.invoke(
[
self.system_message,
HumanMessage(content="\n".join(self.message_history + [self.prefix])),
]
)
return message.content
def receive(self, name: str, message: str) -> None:
"""
将{name}说的{message}连接到消息历史中
"""
self.message_history.append(f"{
name}: {
message}")
# DialogueAgent类定义
# 初始化方法设置代理的名称、系统消息和模型
# reset方法重置消息历史
# send方法生成新消息
# receive方法接收其他代理的消息
DialogueSimulator
类
DialogueSimulator
类接受一个代理列表。在每一步中,它执行以下操作:
- 选择下一个发言者
- 调用下一个发言者发送消息
- 将消息广播给所有其他代理
- 更新步骤计数器。
下一个发言者的选择可以实现为任何函数,但在这种情况下,我们只是简单地循环遍历代理。
class DialogueSimulator