在这篇文章中,我将带你一步一步地创建一个可以将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模型进行下一个消息预测。
实践建议
- 确保你的文本文件格式符合正则表达式定义的标准。
- 如果处理大文件,可以选择懒加载方式以节省内存。
- 在转换后的消息中检查数据完整性以保证后续分析的准确性。
如果遇到问题欢迎在评论区交流。
—END—
367

被折叠的 条评论
为什么被折叠?



