使用LangChain加载Discord聊天记录

在这篇文章中,我将带你一步一步地创建一个可以将Discord私信中的聊天记录转换为LangChain消息列表的工具。此过程包括四个步骤:准备聊天记录的文本文件、定义聊天加载器、初始化加载器以及加载消息。以下是详细步骤及示例实现。

技术背景介绍

在自然语言处理和聊天机器人开发中,处理和转换聊天记录是一项非常常见的任务。通过将Discord的聊天记录转化为LangChain可处理的格式,我们可以更轻松地进行后续的模型训练、预测和分析。

核心原理解析

本工具使用Python编写,结合正则表达式提取和处理聊天记录中的信息。核心思想是从文本文件中读取每一行,识别消息的发送者、时间戳和内容,并将其格式化为LangChain的消息对象。

代码实现演示

接下来我们将逐步实现该功能:

1. 创建消息转储

首先,在Discord应用中复制聊天记录并粘贴到本地的一个文本文件中,确保文件格式如下所示:

%%writefile discord_chats.txt
talkingtower — 08/15/2023 11:10 AM
Love music! Do you like jazz?
reporterbob — 08/15/2023 9:27 PM
Yes! Jazz is fantastic. Ever heard this one?
...

2. 定义聊天加载器

接下来,我们定义一个Python类,用于加载和处理聊天记录:

import logging
import re
from typing import Iterator, List
from langchain_community.chat_loaders import base as chat_loaders
from langchain_core.messages import BaseMessage, HumanMessage

logger = logging.getLogger()

class DiscordChatLoader(chat_loaders.BaseChatLoader):
    def __init__(self, path: str):
        self.path = path
        self._message_line_regex = re.compile(
            r"(.+?) — (\w{3,9} \d{1,2}(?:st|nd|rd|th)?(?:, \d{4})? \d{1,2}:\d{2} (?:AM|PM)|Today at \d{1,2}:\d{2} (?:AM|PM)|Yesterday at \d{1,2}:\d{2} (?:AM|PM))",
            flags=re.DOTALL,
        )

    def _load_single_chat_session_from_txt(self, file_path: str) -> chat_loaders.ChatSession:
        with open(file_path, "r", encoding="utf-8") as file:
            lines = file.readlines()

        results: List[BaseMessage] = []
        current_sender = None
        current_timestamp = None
        current_content = []
        for line in lines:
            if re.match(self._message_line_regex, line):
                if current_sender and current_content:
                    results.append(
                        HumanMessage(
                            content="".join(current_content).strip(),
                            additional_kwargs={"sender": current_sender, "events": [{"message_time": current_timestamp}]},
                        )
                    )
                current_sender, current_timestamp = line.split(" — ")[:2]
                current_content = [line[len(current_sender) + len(current_timestamp) + 4 :].strip()]
            else:
                current_content.append("\n" + line.strip())

        if current_sender and current_content:
            results.append(
                HumanMessage(
                    content="".join(current_content).strip(),
                    additional_kwargs={"sender": current_sender, "events": [{"message_time": current_timestamp}]},
                )
            )

        return chat_loaders.ChatSession(messages=results)

    def lazy_load(self) -> Iterator[chat_loaders.ChatSession]:
        yield self._load_single_chat_session_from_txt(self.path)

3. 创建加载器

我们将指向刚才写入磁盘的文件来初始化加载器。

loader = DiscordChatLoader(
    path="./discord_chats.txt",
)

4. 加载消息

加载器将对格式正确的文件进行转换。

from typing import List
from langchain_community.chat_loaders.utils import (
    map_ai_messages,
    merge_chat_runs,
)
from langchain_core.chat_sessions import ChatSession

raw_messages = loader.lazy_load()
merged_messages = merge_chat_runs(raw_messages)
messages: List[ChatSession] = list(
    map_ai_messages(merged_messages, sender="talkingtower")
)

print(messages)

应用场景分析

这种转换非常有用,可以进一步用于:

  • 模型微调:可用于生成训练数据集。
  • 样本选择:从历史对话中选择合适的few-shot示例。
  • 预测:直接使用LangChain模型进行下一个消息预测。

实践建议

  1. 确保你的文本文件格式符合正则表达式定义的标准。
  2. 如果处理大文件,可以选择懒加载方式以节省内存。
  3. 在转换后的消息中检查数据完整性以保证后续分析的准确性。

如果遇到问题欢迎在评论区交流。

—END—

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值