面向開發(fā)者的LLM入門教程-聊天Chat:定義聊天機器人: 定義一個適用于您文檔的聊天機器人 通過上述所學(xué)內(nèi)容,我們可以通過以下代碼來定義一個適用于私人文檔的聊天機器人……
哈嘍!伙伴們,我是小智,你們的AI向?qū)?。歡迎來到每日的AI學(xué)習(xí)時間。今天,我們將一起深入AI的奇妙世界,探索“面向開發(fā)者的LLM入門教程-聊天Chat:定義聊天機器人”,并學(xué)會本篇文章中所講的全部知識點。還是那句話“不必遠征未知,只需喚醒你的潛能!”跟著小智的步伐,我們終將學(xué)有所成,學(xué)以致用,并發(fā)現(xiàn)自身的更多可能性。話不多說,現(xiàn)在就讓我們開始這場激發(fā)潛能的AI學(xué)習(xí)之旅吧。
面向開發(fā)者的LLM入門教程-聊天Chat:定義聊天機器人:
定義一個適用于您文檔的聊天機器人
通過上述所學(xué)內(nèi)容,我們可以通過以下代碼來定義一個適用于私人文檔的聊天機器人:
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter,
RecursiveCharacterTextSplitter
from langchain.vectorstores import DocArrayInMemorySearch
from langchain.document_loaders import TextLoader
from langchain.chains import RetrievalQA, ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory
from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import TextLoader
from langchain.document_loaders import PyPDFLoader
def load_db(file, chain_type, k):
“””
該函數(shù)用于加載 PDF 文件,切分文檔,生成文檔的嵌入向量,創(chuàng)建向量數(shù)據(jù)庫,定義檢索器,并創(chuàng)建聊
天機器人實例。
參數(shù):
file (str): 要加載的 PDF 文件路徑。
chain_type (str): 鏈類型,用于指定聊天機器人的類型。
k (int): 在檢索過程中,返回最相似的 k 個結(jié)果。
返回:
qa (ConversationalRetrievalChain): 創(chuàng)建的聊天機器人實例。
“””
# 載入文檔
loader = PyPDFLoader(file)
documents = loader.load()
# 切分文檔
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000,
chunk_overlap=150)
docs = text_splitter.split_documents(documents)
# 定義 Embeddingsembeddings = OpenAIEmbeddings()
# 根據(jù)數(shù)據(jù)創(chuàng)建向量數(shù)據(jù)庫
db = DocArrayInMemorySearch.from_documents(docs, embeddings)
# 定義檢索器
retriever = db.as_retriever(search_type=”similarity”, search_kwargs={“k”: k})
# 創(chuàng)建 chatbot 鏈,Memory 由外部管理
qa = ConversationalRetrievalChain.from_llm(
llm=ChatOpenAI(model_name=llm_name, temperature=0),
chain_type=chain_type,
retriever=retriever,
return_source_documents=True,
return_generated_question=True,
)
return qa
import panel as pn
import param
# 用于存儲聊天記錄、回答、數(shù)據(jù)庫查詢和回復(fù)
class cbfs(param.Parameterized):
chat_history = param.List([])
answer = param.String(“”)
db_query = param.String(“”)
db_response = param.List([])
def __init__(self, **params):
super(cbfs, self).__init__( **params)
self.panels = []
self.loaded_file = “docs/matplotlib/第一回:Matplotlib初相識.pdf”
self.qa = load_db(self.loaded_file,”stuff”, 4)
# 將文檔加載到聊天機器人中
def call_load_db(self, count):
“””
count: 數(shù)量
“””
if count == 0 or file_input.value is None: # 初始化或未指定文件 :
return pn.pane.Markdown(f”Loaded File: {self.loaded_file}”)
else:
file_input.save(“temp.pdf”) # 本地副本
self.loaded_file = file_input.filename
button_load.button_style=”outline”
self.qa = load_db(“temp.pdf”, “stuff”, 4)
button_load.button_style=”solid”
self.clr_history()
return pn.pane.Markdown(f”Loaded File: {self.loaded_file}”)
# 處理對話鏈
def convchain(self, query):
“””
query: 用戶的查詢
“””
if not query:
return pn.WidgetBox(pn.Row(‘User:’, pn.pane.Markdown(“”, width=600)),
scroll=True)
result = self.qa({“question”: query, “chat_history”: self.chat_history})
self.chat_history.extend([(query, result[“answer”])])
self.db_query = result[“generated_question”]
self.db_response = result[“source_documents”]
self.answer = result[‘answer’]
self.panels.extend([
pn.Row(‘User:’, pn.pane.Markdown(query, width=600)),
pn.Row(‘ChatBot:’, pn.pane.Markdown(self.answer, width=600, style=
{‘background-color’: ‘#F6F6F6’}))
])
inp.value = ” # 清除時清除裝載指示器
return pn.WidgetBox(*self.panels,scroll=True)
# 獲取最后發(fā)送到數(shù)據(jù)庫的問題
@param.depends(‘db_query ‘, )
def get_lquest(self):
if not self.db_query :
return pn.Column(
pn.Row(pn.pane.Markdown(f”Last question to DB:”, styles=
{‘background-color’: ‘#F6F6F6’})),
pn.Row(pn.pane.Str(“no DB accesses so far”))
)
return pn.Column(
pn.Row(pn.pane.Markdown(f”DB query:”, styles={‘background-color’:
‘#F6F6F6’})),
pn.pane.Str(self.db_query )
)
# 獲取數(shù)據(jù)庫返回的源文件
@param.depends(‘db_response’, )
def get_sources(self):
if not self.db_response:
return
rlist=[pn.Row(pn.pane.Markdown(f”Result of DB lookup:”, styles=
{‘background-color’: ‘#F6F6F6’}))]
for doc in self.db_response:
rlist.append(pn.Row(pn.pane.Str(doc)))
return pn.WidgetBox(*rlist, width=600, scroll=True)
# 獲取當(dāng)前聊天記錄
@param.depends(‘convchain’, ‘clr_history’)
def get_chats(self):
if not self.chat_history:
return pn.WidgetBox(pn.Row(pn.pane.Str(“No History Yet”)), width=600,
scroll=True)
rlist=[pn.Row(pn.pane.Markdown(f”Current Chat History variable”, styles=
{‘background-color’: ‘#F6F6F6’}))]
for exchange in self.chat_history:
rlist.append(pn.Row(pn.pane.Str(exchange)))
return pn.WidgetBox(*rlist, width=600, scroll=True)
# 清除聊天記錄
def clr_history(self,count=0):
self.chat_history = []
return
接著可以運行這個聊天機器人:
# 初始化聊天機器人
cb = cbfs()
# 定義界面的小部件
file_input = pn.widgets.FileInput(accept=’.pdf’) # PDF 文件的文件輸入小部件
button_load = pn.widgets.Button(name=”Load DB”, button_type=’primary’) # 加載數(shù)據(jù)庫
的按鈕
button_clearhistory = pn.widgets.Button(name=”Clear History”,
button_type=’warning’) # 清除聊天記錄的按鈕
button_clearhistory.on_click(cb.clr_history) # 將清除歷史記錄功能綁定到按鈕上
inp = pn.widgets.TextInput( placeholder=’Enter text here…’) # 用于用戶查詢的文本輸入
小部件
# 將加載數(shù)據(jù)庫和對話的函數(shù)綁定到相應(yīng)的部件上
bound_button_load = pn.bind(cb.call_load_db, button_load.param.clicks)
conversation = pn.bind(cb.convchain, inp)
jpg_pane = pn.pane.Image( ‘./img/convchain.jpg’)
# 使用 Panel 定義界面布局
tab1 = pn.Column(
pn.Row(inp),
pn.layout.Divider(),
pn.panel(conversation, loading_indicator=True, height=300),
pn.layout.Divider(),
)
tab2= pn.Column(
pn.panel(cb.get_lquest),
pn.layout.Divider(),
pn.panel(cb.get_sources ),
)
tab3= pn.Column(
pn.panel(cb.get_chats),
pn.layout.Divider(),
)
tab4=pn.Column(
pn.Row( file_input, button_load, bound_button_load),
pn.Row( button_clearhistory, pn.pane.Markdown(“Clears chat history. Can use
to start a new topic” )),
pn.layout.Divider(),
pn.Row(jpg_pane.clone(width=400))
)
# 將所有選項卡合并為一個儀表盤
dashboard = pn.Column(
pn.Row(pn.pane.Markdown(‘# ChatWithYourData_Bot’)),
pn.Tabs((‘Conversation’, tab1), (‘Database’, tab2), (‘Chat History’, tab3),
(‘Configure’, tab4))
)
dashboard
以下截圖展示了該機器人的運行情況:
您可以自由使用并修改上述代碼,以添加自定義功能。例如,可以修改 load_db 函數(shù)和 convchain方法中的配置,嘗試不同的存儲器模塊和檢索器模型。
此外,panel 和 Param 這兩個庫提供了豐富的組件和小工具,可以用來擴展和增強圖形用戶界面。Panel 可以創(chuàng)建交互式的控制面板,Param 可以聲明輸入?yún)?shù)并生成控件。組合使用可以構(gòu)建強大的可配置GUI。
您可以通過創(chuàng)造性地應(yīng)用這些工具,開發(fā)出功能更豐富的對話系統(tǒng)和界面。自定義控件可以實現(xiàn)參數(shù)配置、可視化等高級功能。歡迎修改和擴展示例代碼,開發(fā)出功能更強大、體驗更佳的智能對話應(yīng)用。
嘿,伙伴們,今天我們的AI探索之旅已經(jīng)圓滿結(jié)束。關(guān)于“面向開發(fā)者的LLM入門教程-聊天Chat:定義聊天機器人”的內(nèi)容已經(jīng)分享給大家了。感謝你們的陪伴,希望這次旅程讓你對AI能夠更了解、更喜歡。謹(jǐn)記,精準(zhǔn)提問是解鎖AI潛能的鑰匙哦!如果有小伙伴想要了解學(xué)習(xí)更多的AI知識,請關(guān)注我們的官網(wǎng)“AI智研社”,保證讓你收獲滿滿呦!


微信掃一掃
支付寶掃一掃