完整內容請看文末最后的推廣群
基于大模型的競賽智能客服機器人構建
摘要
隨著國內學科和技能競賽的增多,參賽者對競賽相關信息的需求不斷上升,但傳統人工客服存在效率低、成本高、服務不穩定和用戶體驗差的問題。因此,設計一款智能客服機器人,利用人工智能技術為賽事提供實時、高效、精準的信息查詢服務,成為了迫切的需求。該機器人需具備回答基礎信息查詢、進行統計分析查詢以及處理開放性問題的能力,同時支持競賽數據的實時更新,確保信息的時效性和準確性。
為了解決問題一,我們采用了自動化的文本提取和自然語言處理方法,首先通過PyPDF2提取PDF文件中的文本,然后利用OpenAI API解析文本,同時基于正則表達式提取出賽事的關鍵信息,如賽項名稱、賽道、發布時間等,并將其保存為結構化的CSV文件。在處理過程中,我們面臨了PDF格式不一致和信息提取的挑戰,通過優化模型提示和文本清洗,確保了提取結果的準確性和一致性。
問題二的模型通過利用PDF文本提取、自然語言處理技術和Chromadb向量數據庫構建了一個智能客服機器人,能夠高效地從競賽文檔中提取并存儲關鍵信息,進而實現用戶查詢的實時回答。該模型在處理標準化查詢時表現出色,能夠自動化提取競賽信息并生成準確的回答。
問題三的模型是在問題二的基礎上進行擴展,主要任務是處理新增和變更的競賽PDF文檔。該模型通過提取新增和更新的PDF文件中的文本信息,進行清洗、分塊和嵌入生成后,將其更新到現有的知識庫中,確保知識庫包含最新的競賽數據,使得智能客服系統能夠實時響應用戶查詢并提供最新的競賽信息。
最后通過前端搭建和后端接口調用, 構建競賽智能客服機器人, 通過知識庫構建、查詢處理、響應生成以及系統的部署完成機器人的構建。
關鍵詞:PyPDF2;OpenAI API;大模型;自然語言處理;PDF文本提取;向量數據庫;嵌入表示(embedding); Chromadb數據庫; 智能客服機器人
目錄
基于大模型的競賽智能客服機器人構建 1
摘要 1
一、 問題重述 3
1.1 問題背景 3
1.2 要解決的問題 3
二、 問題分析 5
2.1 任務一的分析 5
2.2 任務二、三的分析 6
三、 問題假設 8
四、 模型原理 9
4.1 關鍵詞識別 9
4.2 中文文本分析 11
五、 模型建立與求解 11
5.1問題一建模與求解 11
5.2問題二、三建模與求解 18
5.3智能客服機器人系統構建 22
六、 模型評價與推廣 26
6.1模型的評價 26
6.1.1模型缺點 26
6.1.2模型缺點 26
6.2 模型推廣 27
七、 參考文獻 29
附錄【自行黏貼】 30
二、 問題分析
2.1任務一的分析
問題一要求我們從提供的18個競賽規程PDF文檔中提取出關鍵信息,并將其結構化保存為CSV格式。競賽規程文檔包含了賽事的詳細信息,如賽事名稱、賽道、發布時間、報名時間、主辦單位和官網鏈接等,我們需要準確提取這些信息,并處理不同文檔格式和內容的差異。為了解決這個問題,我們采用了自動化的數據提取方法,結合PDF文本提取和OpenAI的自然語言處理能力。
首先,我們利用PyPDF2庫提取PDF文檔中的文本。PDF文件的文本結構常常存在格式化問題,因此需要通過清洗和格式化來保證文本的連續性和可讀性。接著,使用OpenAI API解析文本,提取出我們需要的信息。在這一過程中,我們構造了詳細的提示(Prompt),確保模型能夠理解并提取出賽事的關鍵信息,包括賽項名稱、賽道、發布時間、報名時間、主辦單位和官網鏈接等。OpenAI模型通過自然語言處理的強大能力,從文本中抽取出結構化的數據,并將其轉化為JSON格式。
在處理過程中,我們面臨了一些挑戰,例如PDF文件中有時包含掃描圖像或特殊字符,這些情況會影響文本的提取質量。此外,不同文檔可能采用不同的表述方式,導致字段提取的準確性有所不同。為了應對這些問題,我們在模型提示中規定了詳細的規則,并通過推測填補無法明確提取的信息(例如使用文檔中出現的時間或組織單位的上下文信息)。在輸出結果時,如果某些字段無法準確提取,我們會將其標記為空或進行補充說明,確保輸出的格式一致。
最終,所有提取的信息被批量處理并保存為CSV格式,以便后續分析和使用。每個PDF文件的處理結果都包含文件名、賽項名稱、賽道、發布時間、報名時間、主辦單位和官網等字段。通過這種方法,我們能夠高效、自動化地完成大量文檔的數據提取工作,并確保結果的準確性和結構一致性。
2.2任務二、三的分析
問題二的目標是利用人工智能技術,結合提供的競賽數據,設計并實現一個智能客服機器人,以便為用戶提供實時、高效、精準的競賽信息查詢服務。為了完成這一任務,我們構建了一個基于自然語言處理和向量數據庫的系統,來處理并回答競賽相關問題。該系統的核心包括文本處理、知識庫構建和信息檢索三個主要部分。
模型的構建從PDF文檔的處理開始,通過使用pdfminer.six庫提取競賽相關的文本信息。由于競賽文檔通常包含大量的競賽規則、任務描述和賽事信息,因此必須對這些長文本進行預處理。我們采用了文本清洗技術,去除掉無用的字符、空格和HTML標簽,以保證文本質量。之后,使用AutoTokenizer對文本進行分詞,并將文本分割成若干個塊,確保每個塊的token數量不超過模型的處理限制。這一過程有效地處理了長文檔中可能出現的token溢出問題,并保證了模型輸入的有效性。
在完成PDF文檔的文本提取和處理后,下一步是構建智能客服機器人的知識庫。為了確保機器人能夠高效地響應用戶查詢,我們使用了Chromadb數據庫來存儲處理后的競賽信息。通過對每個文本塊生成嵌入(embedding),使得每個塊能夠在向量空間中具有語義上的表示。我們使用了AsyncOpenAI生成嵌入表示,并通過Chromadb存儲這些嵌入。知識庫的構建是一個異步過程,通過批量處理PDF文檔并將嵌入結果添加到數據庫中,使得機器人能夠從龐大的信息庫中快速檢索相關內容。
為了實現實時的競賽信息查詢,我們通過CompetitionAgent類實現了一個基于用戶輸入的查詢響應機制。當用戶輸入問題時,系統會首先通過向量檢索從知識庫中找到相關上下文,并利用OpenAI的生成模型生成答案。這個過程是通過查詢嵌入和生成嵌入的相似度來實現的。系統能夠有效地提取與問題相關的競賽信息,并通過基于上下文的生成模型提供詳細回答。機器人不僅能夠回答基礎的競賽查詢,還能夠處理一些統計分析類和開放性問題。
問題三的任務是在問題二的基礎上,處理新增和變更的競賽PDF文檔,并將其更新到現有的智能客服機器人系統中。通過從新增或更新的PDF中提取競賽信息、清洗文本并生成嵌入,系統能夠將這些新的或更新的數據集成到知識庫中。這樣,智能客服系統能夠保持最新的競賽信息,并繼續高效地回答用戶查詢。
模型的核心在于自動化處理新增和變更數據,通過將新的競賽信息嵌入現有知識庫來更新系統。用戶查詢時,系統可以通過嵌入檢索到相關的競賽數據,并利用生成模型給出準確的回答。這個過程確保了系統始終能夠提供及時和準確的競賽信息,避免了人工更新的繁瑣。
該任務的關鍵挑戰在于如何高效地處理和更新競賽文檔,以及確保系統能夠無縫地集成新數據。通過簡化的問題三模型,通過處理新增和變更的PDF數據,并將其更新到現有的大模型中,使得系統能夠繼續為用戶提供實時的服務,提升了系統的靈活性和可擴展性。
任務 1:競賽數據整理
目標:從18個競賽規程PDF文件中提取基本競賽信息,并保存到 result_1.xlsx。
解題思路:
PDF 解析:
使用 pdfplumber 或 PyMuPDF 提取 PDF 文本內容。
處理文本分段問題,確保數據完整提取。
信息提取:
采用 正則表達式 識別并提取競賽名稱、賽道、發布時間、報名時間、組織單位和官網信息。
采用 NLP 技術,如 spaCy 或 NLTK 進行信息分類和結構化。
數據整理與存儲:
將提取的數據存儲為 Pandas DataFrame,并按表格要求格式化。
最終導出為 result_1.xlsx。
# ---- 提取賽道名稱 ----# 方案1:匹配"專項賽"關鍵詞track_match = re.search(r'(.+?專項賽)', text)# 方案2:匹配標題行if not track_match:track_match = re.search(r'參\s*賽\s*手\s*冊\s*\n(.+?)\n', text)if track_match:info["賽道"] = track_match.group(1).replace("參 賽 手 冊", "").strip()# ---- 提取發布時間 ----date_match = re.search(r'(\d{4}\s*年\s*\d{1,2}\s*月)(?!.*\d{4}\s*年)', text)if date_match:info["發布時間"] = date_match.group(1).replace(" ", "")# ---- 提取報名時間 ----reg_date_match = re.search(r'報名時間[::]\s*(\d{4}\s*年\s*\d{1,2}\s*月\s*\d{1,2}\s*日\s*[-至]\s*\d{1,2}\s*月\s*\d{1,2}\s*日)', text)if reg_date_match:info["報名時間"] = reg_date_match.group(1).replace(" ", "")# ---- 提取官網 ----website_match = re.search(r'(https?://[^\s\)\]\'"]+)', text)if website_match:info["官網"] = website_match.group(1).split(',')[0].strip()
任務 2:智能客服機器人構建
目標:基于競賽規程文檔,搭建智能客服機器人,能夠回答用戶問題。
解題思路:
知識庫構建:
解析所有競賽文件,建立競賽信息知識庫(使用 SQLite 或 Pinecone 向量數據庫)。
為數據索引,以便高效查詢。
問答系統設計:
關鍵詞匹配:基于 BM25 或 TF-IDF 找出與用戶問題最相關的競賽信息。
自然語言理解(NLU):使用 BERT 或 GPT 進行語義匹配,提高準確率。
問題分類:
基本查詢:直接匹配數據庫信息(如競賽報名時間)。
數據統計分析:使用 SQL 或 Pandas 進行統計(如“人工智能相關競賽有多少?”)。
開放性問題:利用 LLM(如 ChatGPT)生成回答。
機器人回答問題并存儲:
================== 第四步:主流程 ==================
def main():
# 1. 創建知識庫knowledge_df = create_knowledge_base()knowledge_df.to_excel("knowledge_base.xlsx", index=False)print("已創建知識庫文件: knowledge_base.xlsx")# 2. 創建測試問題questions_df = create_test_questions()questions_df.to_excel("test_questions.xlsx", index=False)print("已創建測試問題文件: test_questions.xlsx")# 3. 初始化機器人bot = CompetitionChatbot(knowledge_df)# 4. 處理問題并保存結果results = []for _, row in questions_df.iterrows():result = bot.answer_question(row['問題'])results.append({"問題編號": f"C{row['問題序號']:04d}","問題": result["問題"],"關鍵點": result["關鍵點"],"回答": result["回答"]})result_df = pd.DataFrame(results)result_df.to_excel("chatbot_answers.xlsx", index=False)print("已生成回答文件: chatbot_answers.xlsx")# 5. 打印示例問答print("\n示例問答:")print(result_df[['問題編號', '問題', '回答']].to_markdown(index=False))
任務 3:知識庫更新與管理
目標:設計機制,使客服機器人能夠實時更新競賽數據。
解題思路:
新增賽事文件的處理:
解析 19_.pdf、20_.pdf、21_***.pdf,提取新增競賽信息并更新知識庫。
變更信息的處理:
解析 07_***.pdf(變更文件)。
對比數據庫中的舊數據,識別變更項并更新知識庫。
自動更新機制:
定期監測新文件,通過 Cron Job 或 定時任務 觸發更新程序。
重新運行問答系統,使用最新數據生成 result_3.xlsx。
def update_from_pdf(self, pdf_path, update_type="新增"):"""從PDF文件更新知識庫:param pdf_path: PDF文件路徑:param update_type: 更新類型("新增"或"變更")"""try:# 從PDF提取信息(復用問題一的代碼)new_info = self._extract_info_from_pdf(pdf_path)if update_type == "新增":self.knowledge_base = pd.concat([self.knowledge_base, new_info], ignore_index=True)note = f"新增競賽: {new_info['賽項名稱'].iloc[0]} {new_info['賽道'].iloc[0]}"else:# 查找并更新現有記錄mask = (self.knowledge_base['賽項名稱'] == new_info['賽項名稱'].iloc[0]) & \(self.knowledge_base['賽道'] == new_info['賽道'].iloc[0])idx = self.knowledge_base[mask].indexif len(idx) > 0:self.knowledge_base.loc[idx[0]] = new_info.iloc[0]note = f"更新競賽: {new_info['賽項名稱'].iloc[0]} {new_info['賽道'].iloc[0]}"else:self.knowledge_base = pd.concat([self.knowledge_base, new_info], ignore_index=True)note = f"未找到匹配競賽,已新增: {new_info['賽項名稱'].iloc[0]} {new_info['賽道'].iloc[0]}"# 保存新版本new_hash = self._calculate_dataframe_hash(self.knowledge_base)self._save_version(version_note=note, data_hash=new_hash)return True, noteexcept Exception as e:return False, f"更新失敗: {str(e)}"