学习笔记21《LangChain实战课:构建易速鲜花聊天机器人》
课程概览
在本次LangChain实战课中,我们继续为易速鲜花的市场部、销售部和客服部门的员工,以及易速鲜花的广大用户开发一个聊天机器人。这个聊天机器人将集成LLM和LangChain的核心功能,以提供更好的用户体验和业务支持。
聊天机器人项目说明
聊天机器人(Chatbot)是LLM和LangChain的核心用例之一,它们能够进行长时间的对话并访问用户想要了解的信息。本项目的核心组件包括聊天模型、提示模板、记忆和检索器。
技术实现细节
我们将遵循敏捷开发原则,先开发一个基础版本的机器人,然后逐步加入更多功能,如基于易速鲜花的企业知识库进行检索,以及数据库查询功能。
第一步:开发最基本的聊天机器人
我们使用LangChain的ConversationChain实现一个基础的聊天对话工具。
# 设置OpenAI API密钥
import os
os.environ["OPENAI_API_KEY"] = 'Your OpenAI Key'
# 导入所需的库和模块
from langchain.schema import HumanMessage, SystemMessage
from langchain.chat_models import ChatOpenAI
# 创建一个聊天模型的实例
chat = ChatOpenAI()
# 创建一个消息列表
messages = [
SystemMessage(content="你是一个花卉行家。"),
HumanMessage(content="朋友喜欢淡雅的颜色,她的婚礼我选择什么花?")
]
# 使用聊天模型获取响应
response = chat(messages)
print(response)
第二步:增加记忆机制
我们通过ConversationBufferMemory给Chatbot增加记忆,让它能够记住与用户之间的先前互动。
# 导入所需的库和模块
from langchain.memory import ConversationBufferMemory
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
# 带记忆的聊天机器人类
class ChatbotWithMemory:
def __init__(self):
self.chat = ChatOpenAI()
self.memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
self.prompt = ChatPromptTemplate(
messages=[
SystemMessagePromptTemplate.from_template("你是一个花卉行家。"),
MessagesPlaceholder(variable_name="chat_history"),
HumanMessagePromptTemplate.from_template("{question}")
]
)
def chat_loop(self):
print("Chatbot 已启动! 输入'exit'来退出程序。")
while True:
user_input = input("你: ")
if user_input.lower() == 'exit':
print("再见!")
break
self.memory.add_user_message(user_input)
response = self.chat([self.prompt.format_messages(chat_history=self.memory.get_chat_history(), question=user_input)])
print(f"Chatbot: {response.content}")
第三步:增加检索机制
我们整合易速鲜花的内部文档资料,让聊天机器人能够基于业务流程给出专业的回答。
# 导入所需的库
from langchain.vectorstores import Qdrant
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
# ChatBot类的实现-带检索功能
class ChatbotWithRetrieval:
def __init__(self, dir):
# 加载和处理文档
documents = self.load_documents(dir)
# 文本的分割和向量化
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"
)
# 初始化LLM和Memory
self.llm = ChatOpenAI()
self.memory = ConversationSummaryMemory(
llm=self.llm,
memory_key="chat_history",
return_messages=True
)
def load_documents(self, dir):
# 实现文档加载逻辑
pass
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']}")
思考题
- 重构代码:使用ConversationChain中的Memory来重构并简化代码。
- 数据库查询功能:增加对数据库的查询能力,让用户或者业务人员知道某种鲜花的库存情况、销售情况等等。
总结
通过本节课的学习,我们成功构建了一个具备记忆和检索功能的聊天机器人,它不仅能够提供基于世界知识的回答,还能够根据易速鲜花的内部文档和数据库提供专业的回答。下节课,我们将学习如何将这个聊天机器人部署到网络中,供企业内部员工和用户使用。