文心ERNIE Bot SDK+LangChain:基于文檔、網頁的個性化問答系統

現在各行各業紛紛選擇接入大模型,其中最火且可行性最高的形式無異于智能文檔問答助手,而LangChain是其中主流技術實現工具,能夠輕松讓大語言模型與外部數據相結合,從而構建智能問答系統。ERNIE Bot SDK已接入文心大模型4.0能力,同時支持對話補全、函數調用、語義向量等功能。

本教程是基于文心一言ERNIE?Bot SDK與LangChain構建基于Embedding Vector方式的文本問答系統, 整體可以解構為三部分。

1、基于ERNIE Bot與LangChain結合的Embedding,獲取向量矩陣并保存

2、基于用戶問題,在向量矩陣庫中搜尋相近的原文句子

3、基于檢索到的原文與Prompt結合,從LLM獲取答案

圖片

背景介紹

問答系統處理流程

加載文件 -> 讀取文本 -> 文本分割 -> 文本向量化 -> 問句向量化 -> 在文本向量中匹配出與問句向量最相似的top_k個 -> 匹配出的文本作為上下文和問題一起添加到Prompt中 -> 提交給LLM生成回答

技術工具
ERNIE Bot SDK

ERNIE Bot SDK 提供便捷易用的接口,可以調用文心大模型的能力,包含文本創作、通用對話、語義向量、AI作圖等。

圖片

LangChain

LangChain 是一個強大的框架,旨在幫助開發人員使用語言模型構建端到端的應用程序。它提供了一套工具、組件和接口,可簡化創建由大型語言模型 (LLM) 和聊天模型提供支持的應用程序的過程。LangChain 可以輕松管理與語言模型的交互,將多個組件鏈接在一起,并集成額外的資源,例如API和數據庫。

項目代碼

環境準備
安裝相關庫
!pip?install?-qr?requirements.txt
讀取 access_token

在星河社區的控制臺訪問令牌中找到自己的access_token,替換access_token.txt或下面代碼中的access_token。

圖片

fileName='access_token.txt'
access_token=''
if?len(access_token)==0:with?open(fileName,'r')?as?f:#逐行讀取文件內容lines?=?f.readlines()for?line?in?lines:if?line[:13]=='access_token=':access_token=line[13:]
assert?len(access_token)>10
print('access_token:',access_token)
LangChain及Embedding部分
獲取文檔載入器

使用GetLoader(source)獲取LangChain中的Loader,GetLoader會根據source類型,調用對應的LangChain文本載入器。

創建或載入向量庫

引入Embeddings函數并切分文本,chunk_size按ERNIE Bot SDK要求設為384

text_splitter?=?RecursiveCharacterTextSplitter(chunk_size=ernieChunkSize,?chunk_overlap=0)
splits?=?text_splitter.split_documents(documents)?

獲取整個文檔或網頁的Embedding向量并保存。

??embeddings=ErnieEmbeddings(access_token=access_token)#?vectorstore?=?Chroma.from_documents(documents=splits,?embedding=OpenAIEmbeddings())vectorstore?=?Chroma.from_documents(persist_directory=persist_directory,documents=splits,?embedding=embeddings)

根據用戶問題獲取文檔中最相近的原文片段

使用了LangChain中的similarity_search_with_score就可以獲取所需的top_k個文案片段,并且返回其score。結果顯示score差別不是很大。

def?searchSimDocs(query,vectorstore,top_k=3,scoreThershold=5):packs=vectorstore.similarity_search_with_score(query,k=top_k)contentList=[]for?pack?in?packs:doc,score=packif?score<scoreThershold:##好像設置5,基本都會返回contentList.append(doc.page_content)#?print('content',contentList)return?contentList

具體Embedding代碼見下方:

import?osos.environ['access_token']=access_token
from?langchain.vectorstores?import?Chroma
from?langchain.chains?import?RetrievalQA
from?langchain_embedding_ErnieBotSDK?import?ErnieEmbeddings#?Load?documentsfrom?langchain.document_loaders?import?WebBaseLoader
from?langchain.document_loaders.text?import?TextLoader
from?langchain.text_splitter?import?RecursiveCharacterTextSplitter
from?langchain.vectorstores?import?Chroma
import?erniebot##?https://python.langchain.com/docs/integrations/chat/ernie#?loader?=?WebBaseLoader("https://cloud.tencent.com/developer/article/2329879")##?創建新的chroma向量庫
def?createDB(loader,persist_directory='./chromaDB'):#loader?=?TextLoader(file_path=file_path,encoding='utf8')documents=loader.load()#?Split?documentsernieChunkSize=384text_splitter?=?RecursiveCharacterTextSplitter(chunk_size=ernieChunkSize,?chunk_overlap=0)splits?=?text_splitter.split_documents(documents)print('splits?len:',len(splits))#,splits[:5])#?Embed?and?store?splitsembeddings=ErnieEmbeddings(access_token=access_token)#?vectorstore?=?Chroma.from_documents(documents=splits,?embedding=OpenAIEmbeddings())vectorstore?=?Chroma.from_documents(persist_directory=persist_directory,documents=splits,?embedding=embeddings)#https://juejin.cn/post/7236028062873550908#?持久化?會結合之前保存下來的?vectorstore#vectorstore.persist()return?vectorstore
##?讀取已保存的chroma向量庫
def?readDB(persist_directory="./chromaDB"):assert?os.path.isdir(persist_directory)#?#?Embed?and?store?splitsembeddings=ErnieEmbeddings(access_token=access_token)vectorstore?=?Chroma(persist_directory=persist_directory,?embedding_function=embeddings)return?vectorstore
##?基于用戶的query去搜索庫中相近的文檔
def?searchSimDocs(query,vectorstore,top_k=3,scoreThershold=5):packs=vectorstore.similarity_search_with_score(query,k=top_k)contentList=[]for?pack?in?packs:doc,score=packif?score<scoreThershold:##好像設置5,基本都會返回contentList.append(doc.page_content)#?print('content',contentList)return?contentListdef?getLoader(source):if?source[-4:]=='.txt':#file_path='doupo.txt'assert?os.path.isfile(file_path)loader?=?TextLoader(file_path=file_path,encoding='utf8')elif?source[:4]=='http':#url='https://zhuanlan.zhihu.com/p/657210829'loader=?WebBaseLoader(source)return?loader#######################################
new=True?##新建向量庫,注意如果拿幾百萬字的小說embedding
source='https://zhuanlan.zhihu.com/p/657210829'
loader=getLoader(source)
if?new:vectorstore=createDB(loader)
else:vectorstore=readDB()
#?初始化?prompt?對象
query?=?"大模型長文本建模的難點是什么?"
contentList=searchSimDocs(query,vectorstore,top_k=5)
print('contentList',contentList)
LLM根據相關文檔片段回答問題

預置Prompt設定LLM角色,該Prompt將與向量計算中相關文檔片段進行結合,作為query輸入給大模型。

prompt=
"你是善于總結歸納并結合文本回答問題的文本助理。請使用以下檢索到的上下文來回答問題。如果你不知道答案,就說你不知道。最多使用三句話,并保持答案簡潔。問題為:\n"+query+"?\n上下文:\n"+'\n'.join(contentList)?+"?\n?答案:"

以下為response解析代碼:

def?packPrompt(query,contentList):prompt="你是善于總結歸納并結合文本回答問題的文本助理。請使用以下檢索到的上下文來回答問題。如果你不知道答案,就說你不知道。最多使用三句話,并保持答案簡潔。問題為:\n"+query+"?\n上下文:\n"+'\n'.join(contentList)?+"?\n?答案:"return?promptdef?singleQuery(prompt,model='ernie-bot'):response?=?erniebot.ChatCompletion.create(model=model,messages=[{'role':?'user','content':?prompt}])print('response',response)try:resFlag=response['rcode']except:????????resFlag=response['code']if?resFlag==200:try:data=response['body']except:data=responseresult=response['result']usedToken=data['usage']['total_tokens']else:result=""usedToken=-1return?result,usedTokenprompt=packPrompt(query,contentList)
res,usedToken=singleQuery(prompt,model='ernie-bot-4')
print(res)

該教程支持直接一鍵fork運行,點擊下方鏈接查看。
https://aistudio.baidu.com/projectdetail/7051316

該教程項目來源于飛槳星河社區五周年開發精品教程征集,更多教程或有投稿需求請點擊底部下方鏈接查看。

https://aistudio.baidu.com/topic/tutorial

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214288.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214288.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214288.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何使用Imagewheel本地搭建一個簡單的的私人圖床公網可訪問?

文章目錄 1.前言2. Imagewheel網站搭建2.1. Imagewheel下載和安裝2.2. Imagewheel網頁測試2.3.cpolar的安裝和注冊 3.本地網頁發布3.1.Cpolar臨時數據隧道3.2.Cpolar穩定隧道&#xff08;云端設置&#xff09;3.3.Cpolar穩定隧道&#xff08;本地設置&#xff09; 4.公網訪問測…

Java:字符流 文件輸出 與 讀入 方法

Java&#xff1a;字節流 文件輸出與讀入方法 并 實現文件拷貝 文章目錄 字符流FileReaderFileWrite 字符流 字符流底層就是字節流。 字符流 字節流 字符集 特點&#xff1a; 輸入流&#xff1a;一次讀入一個字節&#xff0c;遇到中文時&#xff0c;一次讀多個字節。 輸出流…

POJ-2777 Count Color

經典區間染色板子題 #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N 1e610; struct Segment{int l,r,id; }tr[N<<2]; int n,color,m;void pushdown(int u){if(tr[u].id){tr[u<<1].id tr[u<&l…

P5707 【深基2.例12】上學遲到題解

題目 學校和 yyy 的家之間的距離為s米&#xff0c;而 yyy 以v米每分鐘的速度勻速走向學校。 在上學的路上&#xff0c;yyy 還要額外花費10分鐘的時間進行垃圾分類。 學校要求必須在上午8:00到達&#xff0c;請計算在不遲到的前提下&#xff0c;yyy 最晚能什么時候出門。 由…

python中PDF2docx運行時出現錯誤提示:pixmap must be grayscale or rgb to write as png,怎樣解決?

這是由于pixmap&#xff08;像素圖&#xff09;的顏色空間不是灰度或RGB而導致的。可能是因為PDF2docx試圖將不支持的顏色空間轉換為PNG格式造成的。 要解決此問題&#xff0c;可以嘗試以下幾個步驟&#xff1a; 1.升級pdf2docx到最新版本。有時候最新版本已經解決了這個問題…

【影像組學入門百問】1#---#3

#1-影像組學的常規步驟是怎么樣的&#xff1f; 傳統影像組學的步驟包括&#xff1a; 1、影像獲取及預處理&#xff1b; 2、感興趣區(ROI)標定&#xff1b; 3、影像組學特征提取&#xff1b; 4、特征降維&#xff1b; 5、模型建立、優化。 #2-做影像組學用的電腦硬件配置有什么…

計算機視覺之手勢、面部、姿勢捕捉以Python Mediapipe為工具

計算機視覺之手勢、面部、姿勢捕捉以 Python Mediapipe為工具 文章目錄 1.Mediapipe庫概述2.手勢捕捉(hands)3.面部捕捉(face)4.姿勢捕捉(pose) 1.Mediapipe庫概述 Mediapipe是一個開源且強大的Python庫&#xff0c;由Google開發和維護。它提供了豐富的工具和功能&#xff0c…

ExecuteScalar()方法

ExecuteScalar()方法 大家好&#xff0c;我是免費搭建查券返利機器人賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天&#xff0c;我們將深入探討數據庫編程中的一個關鍵主題——ExecuteScalar()方法&#xff…

stm32學習總結:3、Proteus8+STM32CubeMX+MDK很有搞頭

stm32學習總結&#xff1a;3、Proteus8STM32CubeMXMDK很有搞頭 文章目錄 stm32學習總結&#xff1a;3、Proteus8STM32CubeMXMDK很有搞頭一、前言二、資料收集三、實際案例-點燈1、Proteus8安裝2、Proteus創建stm32F013C6項目并添加外圍LED電路3、STM32CubeMX配置F103C6引腳生成…

12.10_黑馬數據結構與算法筆記Java

目錄 058 鏈表 e10 判環算法1 thinking&#xff1a;什么是空指針&#xff1f; 058 鏈表 e10 判環算法2 059 數組 e01 合并有序數組1 059 數組 e01 合并有序數組2 060 隊列 鏈表實現1 061 隊列 鏈表實現2 062 隊列 環形數組實現 方法1-1 063 隊列 環形數組實現 方法1-2…

帶有 RaspiCam 的 Raspberry Pi 監控和延時攝影攝像機

一、說明 一段時間以來&#xff0c;我一直想構建一個運動激活且具有延時功能的樹莓派相機&#xff0c;但從未真正找到我喜歡的案例。我在thingiverse上找到了這個適合樹莓派和相機的好案例。它是為特定的魚眼相機設計的&#xff0c;但從模型來看&#xff0c;我擁有的廉價中國魚…

【Vulnhub 靶場】【Hackable: III】【簡單 - 中等】【20210602】

1、環境介紹 靶場介紹&#xff1a;https://www.vulnhub.com/entry/hackable-iii,720/ 靶場下載&#xff1a;https://download.vulnhub.com/hackable/hackable3.ova 靶場難度&#xff1a;簡單 - 中等 發布日期&#xff1a;2021年06月02日 文件大小&#xff1a;1.6 GB 靶場作者&…

k8s常用操作命令

目標 了解 Kubernetes基礎命令。對已部署的應用故障排除。 基礎命令&#xff1a;create&#xff0c;delete&#xff0c;get&#xff0c;run&#xff0c;expose&#xff0c;set&#xff0c;explain&#xff0c;edit create 命令&#xff1a;根據文件或者輸入來創建資源 # 創建…

消融實驗:深度學習的關鍵分析工具

消融實驗&#xff1a;深度學習的關鍵分析工具 在深度學習和機器學習領域&#xff0c;消融實驗&#xff08;Ablation Study&#xff09;是一種重要的實驗方法&#xff0c;用于理解和評估模型的各個組成部分對其整體性能的貢獻。通過這種方法&#xff0c;研究人員可以更深入地了…

Docker | 自定義網絡

?作者簡介:大家好,我是Leo,熱愛Java后端開發者,一個想要與大家共同進步的男人???? ??個人主頁:Leo的博客 ??當前專欄:Docker系列 ?特色專欄: MySQL學習 ??本文內容: Docker | 自定義網絡 ??個人知識庫: 知識庫,歡迎大家訪問 1.前言 大家好,我是Leo哥…

當視覺遇到毫米波雷達:自動駕駛的三維目標感知基準

? 文章&#xff1a;Vision meets mmWave Radar: 3D Object Perception Benchmark for Autonomous Driving 作者: Yizhou Wang, Jen-Hao Cheng, Jui-Te Huang , Sheng-Yao Kuan , Qiqian Fu , Chiming Ni 編輯&#xff1a;點云PCL 歡迎各位加入知識星球&#xff0c;獲取PDF…

vector類

> 作者簡介&#xff1a;?舊言~&#xff0c;目前大二&#xff0c;現在學習Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右銘&#xff1a;松樹千年終是朽&#xff0c;槿花一日自為榮。 > 目標&#xff1a;熟悉vector庫 > 毒雞湯&#xff1a;從人生低谷…

UVM中的config_db機制傳遞interface

&#xff08;1&#xff09;定義interface interface my_if(input clk, input rst_n);logic [7:0] data;logic valid;endinterface &#xff08;2&#xff09;在tb中使用interface 定義了interface后&#xff0c;在top_tb中實例化DUT時&#xff0c;就可以直接使用。 先…

【面試總結】Java面試題目總結(一)

&#xff08;以下僅為個人見解&#xff0c;如果有誤&#xff0c;歡迎大家批評并指出錯誤&#xff0c;謝謝大家&#xff09; 1.項目中的驗證碼功能是如何實現的&#xff1f; 第一步&#xff1a;在項目的pom.xml文件中導入 EasyCaptcha 的依賴&#xff1b; <dependency>…

軟件崩潰時Visual Studio中看不到有效的調用堆棧,使用Windbg動態調試去分析定位

目錄 1、問題說明 2、使用Windbg查看崩潰時詳細的函數調用堆棧