在这节课中,我学习开发了一个以 易速鲜花 业务为背景的聊天机器人,并逐步增强了它的功能。以下是完整的设计流程及实现细节:
核心组件设计
- 聊天模型 (Chat Model):
使用 LangChain 的ChatOpenAI提供自然对话能力,适合用户友好的交流。 - 提示模板 (Prompt Template):
定制系统角色(如“花卉行家”),结合用户输入与历史上下文生成有针对性的响应。 - 记忆模块 (Memory):
用于存储对话历史,增强对话的连贯性和上下文理解。 - 检索模块 (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),整合易速鲜花的内部文档资源,实现检索增强功能。
- 加载文档: 通过加载
.pdf,.docx,.txt文件提取业务知识。 - 文本切分: 使用
RecursiveCharacterTextSplitter对长文档分块。 - 嵌入向量化: 使用
OpenAIEmbeddings生成向量表示,并存入数据库。 - 实现检索: 根据用户问题查找相关知识块,再结合对话模型生成专业答案。
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']}")
项目回顾与成果
- 初版功能:
提供基础聊天能力,能够根据花卉领域专业知识生成建议。 - 记忆能力:
机器人能够回忆先前对话历史,增强用户体验。 - 检索增强:
提供基于易速鲜花内部知识的专业问答支持(如订单查询、退货流程等)。 - 敏捷开发:
初期功能快速上线,后续扩展功能模块。