项目概述
本项目旨在为易速鲜花市场部、销售部和客服部门的员工,以及易速鲜花的广大用户开发一个聊天机器人。聊天机器人能够进行长时间的对话并访问用户想要了解的信息。
核心组件
- 聊天模型:对话的基础,更偏向于自然的对话风格。
- 提示模板:帮助整合默认消息、用户输入、历史交互以及检索时需要的上下文。
- 记忆:允许机器人记住与用户之间的先前互动,增强对话连贯性。
- 检索器:可选组件,特别适合需要提供特定领域知识的机器人。
技术实现步骤
- 基础聊天对话工具:使用LangChain的ConversationChain实现。
- 记忆功能:通过LangChain中的记忆功能,让机器人记住用户之前所说的话。
- 检索功能:整合易速鲜花的内部文档资料,让机器人基于业务流程给出专业回答。
- 数据库查询功能(可选):让用户可以输入订单号查询订单状态或库存等。
- 部署聊天机器人:在网络上部署及发布聊天机器人。
第一步:开发最基本的聊天机器人
python
import os
from langchain.schema import HumanMessage, SystemMessage
from langchain.chat_models import ChatOpenAI
os.environ["OPENAI_API_KEY"] = 'Your OpenAI Key'
chat = ChatOpenAI()
messages = [
SystemMessage(content="你是一个花卉行家。"),
HumanMessage(content="朋友喜欢淡雅的颜色,她的婚礼我选择什么花?")
]
response = chat(messages)
print(response)
第二步:增加记忆机制
python
from langchain.memory import ConversationBufferMemory
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.chains import LLMChain
class ChatbotWithMemory:
def __init__(self):
self.llm = ChatOpenAI()
self.prompt = ChatPromptTemplate(
messages=[
SystemMessagePromptTemplate.from_template("你是一个花卉行家。"),
MessagesPlaceholder(variable_name="chat_history"),
HumanMessagePromptTemplate.from_template("{question}")
]
)
self.memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
self.conversation = LLMChain(
llm=self.llm,
prompt=self.prompt,
verbose=True,
memory=self.memory
)
def chat_loop(self):
print("Chatbot 已启动! 输入'exit'来退出程序。")
while True:
user_input = input("你: ")
if user_input.lower() == 'exit':
print("再见!")
break
response = self.conversation({"question": user_input})
print(f"Chatbot: {response['text']}")
if __name__ == "__main__":
bot = ChatbotWithMemory()
bot.chat_loop()
第三步:增加检索机制
python
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Qdrant
from langchain.memory import ConversationSummaryMemory
from langchain.chains import ConversationalRetrievalChain
from langchain.document_loaders import PyPDFLoader, Docx2txtLoader, TextLoader
class ChatbotWithRetrieval:
def __init__(self, dir):
base_dir = dir
documents = []
for file in os.listdir(base_dir):
file_path = os.path.join(base_dir, file)
if file.endswith('.pdf'):
loader = PyPDFLoader(file_path)
documents.extend(loader.load())
elif file.endswith('.docx') or file.endswith('.doc'):
loader = Docx2txtLoader(file_path)
documents.extend(loader.load())
elif file.endswith('.txt'):
loader = TextLoader(file_path)
documents.extend(loader.load())
text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=0)
all_splits = text_splitter.split_documents(documents)
self.vectorstore = Qdrant.from_documents(
documents=all_splits,
embedding=OpenAIEmbeddings(),
location=":memory:",
collection_name="my_documents"
)
self.llm = ChatOpenAI()
self.memory = ConversationSummaryMemory(
llm=self.llm,
memory_key="chat_history",
return_messages=True
)
retriever = self.vectorstore.as_retriever()
self.qa = ConversationalRetrievalChain.from_llm(
self.llm,
retriever=retriever,
memory=self.memory
)
def chat_loop(self):
print("Chatbot 已启动! 输入'exit'来退出程序。")
while True:
user_input = input("你: ")
if user_input.lower() == 'exit':
print("再见!")
break
response = self.qa(user_input)
print(f"Chatbot: {response['answer']}")
if __name__ == "__main__":
folder = "OneFlower"
bot = ChatbotWithRetrieval(folder)
bot.chat_loop()
总结
聊天机器人已基本完成,具备记忆功能和检索易速鲜花内部文档的能力。通过这个项目,我们复习了LangChain中的对话模型、提示模板、记忆实现以及检索功能和RAG功能的实现。
思考题
- 重构代码:使用ConversationChain中的Memory来重构并简化代码。
- 数据库查询功能:参考第17讲的内容,将数据库查询功能整合到Chatbot中。