开发 "聊天机器人" 的总结 | 青训营X豆包MarsCode 技术训练营

114 阅读3分钟

在这节课中,我学习开发了一个以 易速鲜花 业务为背景的聊天机器人,并逐步增强了它的功能。以下是完整的设计流程及实现细节:


核心组件设计

  1. 聊天模型 (Chat Model):
    使用 LangChain 的 ChatOpenAI 提供自然对话能力,适合用户友好的交流。
  2. 提示模板 (Prompt Template):
    定制系统角色(如“花卉行家”),结合用户输入与历史上下文生成有针对性的响应。
  3. 记忆模块 (Memory):
    用于存储对话历史,增强对话的连贯性和上下文理解。
  4. 检索模块 (Retriever):
    用于集成企业内部知识库(如文档、流程等),提供特定领域的专业支持。

开发过程回顾

第一步:基础聊天机器人

实现一个最基本的聊天机器人,通过对话模型 ChatOpenAI 直接生成用户问答。

from langchain.schema import HumanMessage, SystemMessage
from langchain.chat_models import ChatOpenAI

# 初始化聊天模型
chat = ChatOpenAI()

# 创建初始对话消息
messages = [
    SystemMessage(content="你是一个花卉行家。"),
    HumanMessage(content="朋友喜欢淡雅的颜色,她的婚礼我选择什么花?")
]

# 获取响应
response = chat(messages)
print(response.content)

输出:根据花卉专业知识生成推荐,比如白色玫瑰、紫色满天星等。

第二步:加入记忆功能

通过 LangChain 的 ConversationBufferMemory 组件,使机器人能够记住对话历史,从而增强连贯性。

from langchain.memory import ConversationBufferMemory
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.chains import LLMChain

class ChatbotWithMemory:
    def __init__(self):
        # 初始化记忆功能
        self.memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
        self.llm = ChatOpenAI()
        self.prompt = ChatPromptTemplate(
            messages=[
                SystemMessage(content="你是一个花卉行家。"),
                MessagesPlaceholder(variable_name="chat_history"),
                HumanMessage(content="{question}")
            ]
        )
        self.conversation = LLMChain(llm=self.llm, prompt=self.prompt, memory=self.memory)

    def chat_loop(self):
        while True:
            user_input = input("你: ")
            if user_input.lower() == 'exit':
                print("再见!")
                break
            response = self.conversation({"question": user_input})
            print(f"Chatbot: {response['text']}")

第三步:增加检索功能

通过向量数据库(如 Qdrant),整合易速鲜花的内部文档资源,实现检索增强功能。

  1. 加载文档: 通过加载 .pdf, .docx, .txt 文件提取业务知识。
  2. 文本切分: 使用 RecursiveCharacterTextSplitter 对长文档分块。
  3. 嵌入向量化: 使用 OpenAIEmbeddings 生成向量表示,并存入数据库。
  4. 实现检索: 根据用户问题查找相关知识块,再结合对话模型生成专业答案。
python
复制代码
from langchain.vectorstores import Qdrant
from langchain.document_loaders import PyPDFLoader, TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import ConversationalRetrievalChain

class ChatbotWithRetrieval:
    def __init__(self, dir):
        documents = []
        for file in os.listdir(dir):
            loader = TextLoader(os.path.join(dir, file)) if file.endswith('.txt') else PyPDFLoader(file)
            documents.extend(loader.load())
        
        # 分块与向量化
        text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
        all_splits = text_splitter.split_documents(documents)
        self.vectorstore = Qdrant.from_documents(all_splits, OpenAIEmbeddings(), ":memory:")

        # 检索增强的会话链
        self.qa = ConversationalRetrievalChain.from_llm(
            llm=ChatOpenAI(), 
            retriever=self.vectorstore.as_retriever()
        )

    def chat_loop(self):
        while True:
            user_input = input("你: ")
            if user_input.lower() == 'exit':
                print("再见!")
                break
            response = self.qa(user_input)
            print(f"Chatbot: {response['answer']}")

项目回顾与成果

  1. 初版功能:
    提供基础聊天能力,能够根据花卉领域专业知识生成建议。
  2. 记忆能力:
    机器人能够回忆先前对话历史,增强用户体验。
  3. 检索增强:
    提供基于易速鲜花内部知识的专业问答支持(如订单查询、退货流程等)。
  4. 敏捷开发:
    初期功能快速上线,后续扩展功能模块。