![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b6d8c4250aa7432296406bfefb243d00.jpeg#pic_center)
创建基于文档的聊天机器人
导入必要的库
首先确保导入了必要的库。Panel (pn
) 用于构建用户界面,Param (param
) 用于管理聊天机器人类中的参数。
import panel as pn
import param
定义聊天机器人类
聊天机器人类,这里命名为 DocumentBasedChatbot
,封装了所有加载文档、处理查询和维护对话历史所需的功能。
class DocumentBasedChatbot(param.Parameterized):
conversation_history = param.List([]) # 存储查询和响应对
current_answer = param.String("") # 聊天机器人的最新响应
database_query = param.String("") # 发送给文档数据库的查询
database_response = param.List([]) # 作为响应检索到的文档
def __init__(self, **params):
super(DocumentBasedChatbot, self).__init__(**params)
self.interface_elements = [] # 存储显示对话的UI元素
self.loaded_document = "docs/cs229_lectures/MachineLearning-Lecture01.pdf" # 默认文档
self.chatbot_model = load_db(self.loaded_document, "retrieval_type", 4) # 初始化聊天机器人模型
加载文档
load_db
函数将文档加载到聊天机器人的知识库中。函数会检查是否有用户上传的文件;如果没有,则使用默认文档。当加载新文档时,对话历史会被清除。
def load_document(self, upload_count):
if upload_count == 0 or not file_input.value: # 检查是否上传了新文件
return pn.pane.Markdown(f"已加载文档: {self.loaded_document}")
else:
file_input.save("temp.pdf") # 暂时保存上传的文件
self.loaded_document = file_input.filename
self.chatbot_model = load_db("temp.pdf", "retrieval_type", 4) # 将新文档加载到模型中
self.clear_conversation_history()
return pn.pane.Markdown(f"已加载文档: {self.loaded_document}")
处理用户查询
process_query
方法接收用户输入,将其发送给聊天机器人模型进行处理,并更新UI以显示聊天机器人的响应及相关文档摘录。
def process_query(self, user_query):
if not user_query:
return pn.WidgetBox(pn.Row('用户:', pn.pane.Markdown("", width=600)), scroll=True)
result = self.chatbot_model({"question": user_query, "conversation_history": self.conversation_history})
self.conversation_history.extend([(user_query, result["answer"])])
self.database_query = result["generated_question"]
self.database_response = result["source_documents"]
self.current_answer = result['answer']
self.interface_elements.extend([
pn.Row('用户:', pn.pane.Markdown(user_query, width=600)),
pn.Row('聊天机器人:', pn.pane.Markdown(self.current_answer, width=600, style={'background-color': '#F6F6F6'}))
])
input_field.value = '' # 处理后清空输入框
return pn.WidgetBox(*self.interface_elements, scroll=True)
显示数据库查询和响应
display_last_database_query
和 display_database_responses
方法分别显示最后一次发送到文档数据库的查询以及作为响应检索到的文档。
def display_last_database_query(self):
if not self.database_query:
return pn.Column(
pn.Row(pn.pane.Markdown("最后一次数据库查询:", style={'background-color': '#F6F6F6'})),
pn.Row(pn.pane.Str("目前没有发出过数据库查询"))
)
return pn.Column(
pn.Row(pn.pane.Markdown("数据库查询:", style={'background-color': '#F6F6F6'})),
pn.pane.Str(self.database_query)
)
def display_database_responses(self):
if not self.database_response:
return
response_list = [pn.Row(pn.pane.Markdown("数据库查找结果:", style={'background-color': '#F6F6F6'}))]
for doc in self.database_response:
response_list.append(pn.Row(pn.pane.Str(doc)))
return pn.WidgetBox(*response_list, width=600, scroll=True)
清除对话历史
clear_conversation_history
方法允许用户重置对话,移除所有之前交换的消息。
def clear_conversation_history(self, count=0):
self.conversation_history = []
必要的导入和聊天机器人初始化
首先从Panel和Param导入必要的模块,并初始化聊天机器人类,其中封装了所有文档加载、查询处理和界面交互的逻辑。
import panel as pn
import param
# 定义聊天机器人类,并包含必要的功能
class ChatWithYourDataBot(param.Parameterized):
# 初始化参数以存储对话历史、答案和文档查询
conversation_history = param.List([])
latest_answer = param.String("")
document_query = param.String("")
document_response = param.List([])
def __init__(self, **params):
super(ChatWithYourDataBot, self).__init__(**params)
# 占位符用于UI元素
self.interface_elements = []
# 默认文档路径
self.default_document_path = "docs/cs229_lectures/MachineLearning-Lecture01.pdf"
# 使用默认文档初始化聊天机器人模型
self.chatbot_model = load_db(self.default_document_path, "retrieval_mode", 4)
配置用户界面组件
创建用户界面组件用于文档上传、数据库加载、历史管理以及查询输入。此设置包括文档上传的文件输入、加载文档和清除聊天历史的按钮,以及用户查询的文本输入。
# 用户界面组件用于文档上传和交互
document_upload = pn.widgets.FileInput(accept='.pdf')
load_database_button = pn.widgets.Button(name="加载文档", button_type='primary')
clear_history_button = pn.widgets.Button(name="清除历史", button_type='warning')
clear_history_button.on_click(ChatWithYourDataBot.clear_history)
user_query_input = pn.widgets.TextInput(placeholder='在此输入您的问题…')
# 绑定用户界面组件到聊天机器人功能
load_document_action = pn.bind(ChatWithYourDataBot.load_document, load_database_button.param.clicks)
process_query = pn.bind(ChatWithYourDataBot.process_query, user_query_input)
构建对话界面
构建对话界面,在其中显示用户查询和聊天机器人的响应。这包括管理对话流程、显示最新的文档查询以及展示基于文档的答案来源。
# 图像面板用于视觉表示
conversation_visual = pn.pane.Image('./img/conversation_flow.jpg')
# 组织对话标签
conversation_tab = pn.Column(
pn.Row(user_query_input),
pn.layout.Divider(),
pn.panel(process_query, loading_indicator=True, height=300),
pn.layout.Divider(),
)
# 组织额外信息标签(数据库查询、源文档、聊天历史)
database_query_tab = pn.Column(
pn.panel(ChatWithYourDataBot.display_last_database_query),
pn.layout.Divider(),
pn.panel(ChatWithYourDataBot.display_database_responses),
)
chat_history_tab = pn.Column(
pn.panel(ChatWithYourDataBot.display_chat_history),
pn.layout.Divider(),
)
configuration_tab = pn.Column(
pn.Row(document_upload, load_database_button, load_document_action),
pn.Row(clear_history_button, pn.pane.Markdown("清除对话历史以开启新话题。")),
pn.layout.Divider(),
pn.Row(conversation_visual.clone(width=400)),
)
# 组装仪表板
chatbot_dashboard = pn.Column(
pn.Row(pn.pane.Markdown('# ChatWithYourData_Bot')),
pn.Tabs(('对话', conversation_tab), ('数据库查询', database_query_tab), ('聊天历史', chat_history_tab), ('配置', configuration_tab))
)