学习笔记22《易速鲜花聊天客服机器人的开发(上)》

项目概述

本项目旨在为易速鲜花市场部、销售部和客服部门的员工,以及易速鲜花的广大用户开发一个聊天机器人。聊天机器人能够进行长时间的对话并访问用户想要了解的信息。

核心组件

  • 聊天模型:对话的基础,更偏向于自然的对话风格。
  • 提示模板:帮助整合默认消息、用户输入、历史交互以及检索时需要的上下文。
  • 记忆:允许机器人记住与用户之间的先前互动,增强对话连贯性。
  • 检索器:可选组件,特别适合需要提供特定领域知识的机器人。

技术实现步骤

  1. 基础聊天对话工具:使用LangChain的ConversationChain实现。
  2. 记忆功能:通过LangChain中的记忆功能,让机器人记住用户之前所说的话。
  3. 检索功能:整合易速鲜花的内部文档资料,让机器人基于业务流程给出专业回答。
  4. 数据库查询功能(可选):让用户可以输入订单号查询订单状态或库存等。
  5. 部署聊天机器人:在网络上部署及发布聊天机器人。

第一步:开发最基本的聊天机器人

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功能的实现。

思考题

  1. 重构代码:使用ConversationChain中的Memory来重构并简化代码。
  2. 数据库查询功能:参考第17讲的内容,将数据库查询功能整合到Chatbot中。
相关推荐
Find23 天前
MaxKB 集成langchain + Vue + PostgreSQL 的 本地大模型+本地知识库 构建私有大模型 | MarsCode AI刷题
青训营笔记
理tan王子23 天前
伴学笔记 AI刷题 14.数组元素之和最小化 | 豆包MarsCode AI刷题
青训营笔记
理tan王子23 天前
伴学笔记 AI刷题 25.DNA序列编辑距离 | 豆包MarsCode AI刷题
青训营笔记
理tan王子23 天前
伴学笔记 AI刷题 9.超市里的货物架调整 | 豆包MarsCode AI刷题
青训营笔记
夭要7夜宵25 天前
分而治之,主题分片Partition | 豆包MarsCode AI刷题
青训营笔记
三六1 个月前
刷题漫漫路(二)| 豆包MarsCode AI刷题
青训营笔记
tabzzz1 个月前
突破Zustand的局限性:与React ContentAPI搭配使用
前端·青训营笔记
Serendipity5651 个月前
Go 语言入门指南——单元测试 | 豆包MarsCode AI刷题;
青训营笔记
wml1 个月前
前端实践-使用React实现简单代办事项列表 | 豆包MarsCode AI刷题
青训营笔记
用户44710308932421 个月前
详解前端框架中的设计模式 | 豆包MarsCode AI刷题
青训营笔记