admin 管理员组

文章数量: 1184232

MiniGPT-4对话系统实现:基于Conversation模块的交互逻辑设计

【免费下载链接】MiniGPT-4 Open-sourced codes for MiniGPT-4 and MiniGPT-v2 (https://minigpt-4.github.io, https://minigpt-v2.github.io/) 项目地址: https://gitcode/gh_mirrors/mi/MiniGPT-4

模块概述

MiniGPT-4的对话系统核心实现在minigpt4/conversation/conversation.py文件中,该模块负责管理用户与AI助手之间的多轮交互流程,包括消息存储、格式处理和对话状态维护。通过定义Conversation类和Chat类,实现了视觉-语言多模态交互的完整生命周期管理。

核心数据结构设计

Conversation类

Conversation类采用数据类(dataclass)设计,封装了对话的完整状态信息:

@dataclasses.dataclass
class Conversation:
    system: str                  # 系统提示词
    roles: List[str]             # 对话角色定义(如"Human: ", "Assistant: ")
    messages: List[List[str]]    # 消息列表,存储[角色, 内容]元组
    offset: int                  # 消息偏移量,用于UI展示控制
    sep_style: SeparatorStyle    # 分隔符样式枚举
    sep: str                     # 主要分隔符
    sep2: str = None             # 次要分隔符(用于双分隔符样式)

分隔符样式枚举

通过SeparatorStyle枚举定义了两种对话格式策略:

class SeparatorStyle(Enum):
    SINGLE = auto()  # 单分隔符模式,如"###"
    TWO = auto()     # 双分隔符模式,交替使用两种分隔符

预设对话模板

模块内置了三种针对不同模型的对话模板,适配Vicuna和LLaMA2等不同基座模型的交互格式要求:

Vicuna0对话模板

CONV_VISION_Vicuna0 = Conversation(
    system="Give the following image: <Img>ImageContent</Img>. You will be able to see the image once I provide it to you. Please answer my questions.",
    roles=("Human: ", "Assistant: "),
    messages=[],
    offset=2,
    sep_style=SeparatorStyle.SINGLE,
    sep="###",
)

LLama2对话模板

CONV_VISION_LLama2 = Conversation(
    system="Give the following image: <Img>ImageContent</Img>. You will be able to see the image once I provide it to you. Please answer my questions.",
    roles=("<s>[INST] ", " [/INST] "),  # LLaMA2特定指令格式
    messages=[],
    offset=2,
    sep_style=SeparatorStyle.SINGLE,
    sep="",
)

MiniGPT-v2对话模板

CONV_VISION_minigptv2 = Conversation(
    system="",
    roles=("<s>[INST] ", " [/INST]"),
    messages=[],
    offset=2,
    sep_style=SeparatorStyle.SINGLE,
    sep="",
)

对话流程实现

1. 消息构建流程

对话系统通过get_prompt()方法动态生成模型输入序列,根据不同分隔符样式拼接完整对话历史:

def get_prompt(self):
    if self.sep_style == SeparatorStyle.SINGLE:
        ret = self.system + self.sep
        for role, message in self.messages:
            if message:
                ret += role + message + self.sep
            else:
                ret += role
        return ret
    # 双分隔符模式实现...

2. 图像上传与处理

Chat类提供了完整的图像上传和编码流程,支持路径字符串、PIL图像和Tensor三种输入格式:

def upload_img(self, image, conv, img_list):
    conv.append_message(conv.roles[0], "<Img><ImageHere></Img>")
    img_list.append(image)
    return "Received."

def encode_img(self, img_list):
    # 图像预处理与特征提取实现...
    image_emb, _ = self.model.encode_img(image)
    img_list.append(image_emb)

3. 流式对话生成

系统支持流式输出模式,通过多线程实现实时响应:

def stream_answer(self, conv, img_list, **kargs):
    generation_kwargs = self.answer_prepare(conv, img_list, **kargs)
    streamer = TextIteratorStreamer(self.model.llama_tokenizer, skip_special_tokens=True)
    generation_kwargs['streamer'] = streamer
    thread = Thread(target=self.model_generate, kwargs=generation_kwargs)
    thread.start()
    return streamer

对话交互示例

多轮对话流程

下图展示了典型的多轮交互场景,包括图像上传、问题提问和流式回答生成的完整流程:

MiniGPT-4对话流程

不同模型对话样式对比

模型类型角色定义分隔符示例格式
Vicuna0("Human: ", "Assistant: ")"###"Human: 描述这张图片###Assistant:
LLama2("[INST] ", " [/INST] ")""[INST] 描述这张图片 [/INST]

视觉问答示例

在该示例中,用户上传图像后提问"这张图片中有什么物体?",系统通过answer()方法生成回答:

chat.ask("这张图片中有什么物体?", conv)
output_text, _ = chat.answer(conv, img_list, max_new_tokens=300)

高级功能实现

对话状态管理

系统通过copy()方法实现对话状态的深拷贝,支持分支对话和历史回溯:

def copy(self):
    return Conversation(
        system=self.system,
        roles=self.roles,
        messages=[[x, y] for x, y in self.messages],  # 深拷贝消息列表
        offset=self.offset,
        sep_style=self.sep_style,
        sep=self.sep,
        sep2=self.sep2,
        conv_id=self.conv_id)

生成停止条件

自定义StoppingCriteriaSub类实现生成终止逻辑,当检测到停止标记时终止文本生成:

class StoppingCriteriaSub(StoppingCriteria):
    def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor):
        for stop in self.stops:
            if torch.all(input_ids[:, -len(stop):] == stop).item():
                return True
        return False

模块扩展建议

自定义对话模板

开发者可通过创建新的Conversation实例定义自定义对话样式,例如:

CUSTOM_CONV = Conversation(
    system="你是一个专业的图像分析师。",
    roles=("用户: ", "分析师: "),
    messages=[],
    offset=2,
    sep_style=SeparatorStyle.TWO,
    sep="||",
    sep2="##"
)

对话历史持久化

可扩展dict()方法实现对话状态的JSON序列化,用于持久化存储和恢复:

def to_json(self):
    return json.dumps(self.dict(), ensure_ascii=False, indent=2)

总结与展望

Conversation模块作为MiniGPT-4的交互核心,通过灵活的模板设计和高效的状态管理,实现了多模态对话的完整生命周期支持。未来可进一步优化以下方向:

  1. 增加对话记忆机制,支持长程上下文理解
  2. 实现对话主题检测和自动摘要功能
  3. 支持多轮对话的情感分析和个性化响应

通过minigpt4/conversation/conversation.py的模块化设计,开发者可以轻松扩展新的对话样式和交互功能,为不同应用场景定制专属的视觉-语言对话系统。

【免费下载链接】MiniGPT-4 Open-sourced codes for MiniGPT-4 and MiniGPT-v2 (https://minigpt-4.github.io, https://minigpt-v2.github.io/) 项目地址: https://gitcode/gh_mirrors/mi/MiniGPT-4

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

本文标签: 逻辑设计 模块 系统实现 MiniGPT Conversation