作者 | 崔皓
審校 | 重樓
摘要
文章詳細(xì)介紹了百川大模型在創(chuàng)建個(gè)性化虛擬角色方面的創(chuàng)新技術(shù)和應(yīng)用。這項(xiàng)技術(shù)結(jié)合了LangChain和Qianfan微調(diào)的Llama2-Chinese大模型,提供了高度個(gè)性化的角色定制功能。
作者通過(guò)實(shí)際體驗(yàn)和技術(shù)模仿,成功創(chuàng)建了一個(gè)虛擬客服角色,并探討了其在自動(dòng)客服系統(tǒng)中的應(yīng)用潛力。文章還展示了如何通過(guò)編程和Streamlit界面設(shè)計(jì),將這些虛擬角色應(yīng)用于實(shí)際場(chǎng)景,如客服系統(tǒng),以提供更個(gè)性化的用戶體驗(yàn)。
開(kāi)篇
近日,百川大模型以其獨(dú)特的角色扮演功能引起了廣泛關(guān)注。這項(xiàng)創(chuàng)新技術(shù)不僅允許用戶創(chuàng)建個(gè)性化的虛擬角色,還提供了諸如對(duì)話交互、知識(shí)庫(kù)上傳、模型選擇以及溫度調(diào)整等多樣化功能。作為一名技術(shù)愛(ài)好者,我對(duì)這種新興技術(shù)充滿好奇,決定親自體驗(yàn)并探索其潛力。
通過(guò)結(jié)合LangChain和Qianfan微調(diào)的Llama2-Chinese大模型,加上Streamlit的界面設(shè)計(jì)能力,成功模仿并創(chuàng)建了自己的“角色扮演”應(yīng)用。最終,將這項(xiàng)技術(shù)應(yīng)用于自動(dòng)客服系統(tǒng),創(chuàng)造了具有獨(dú)特性格和風(fēng)格的虛擬客服角色。在這篇文章中,我將分享探索過(guò)程,從最初的興趣點(diǎn)發(fā)掘,到技術(shù)的模仿與應(yīng)用,再到最終的實(shí)際落地。
百川角色大模型介紹
百川角色大模型憑借其大模型的技術(shù)在虛擬角色互動(dòng)領(lǐng)域引發(fā)了不小的震動(dòng)。我們把該產(chǎn)品的亮點(diǎn),整理如下:
功能亮點(diǎn)
最強(qiáng)角色對(duì)話能力:基于業(yè)界領(lǐng)先的角色扮演算法,百川大模型提供了一致性高、擬人化且口語(yǔ)化的對(duì)話體驗(yàn),能夠持續(xù)引導(dǎo)用戶進(jìn)行深入聊天。
角色創(chuàng)建高度可定制:用戶可以設(shè)置角色的基本信息、開(kāi)場(chǎng)白、性格特征和回復(fù)限制等,實(shí)現(xiàn)高度個(gè)性化的定制。
角色回復(fù)事實(shí)性遵循:通過(guò)獨(dú)家角色知識(shí)庫(kù)功能,允許上傳大量知識(shí)點(diǎn),確保角色的回復(fù)嚴(yán)格遵循其背景知識(shí)和設(shè)定。
海量?jī)?yōu)質(zhì)官創(chuàng)角色:平臺(tái)持續(xù)上線各類(lèi)官方創(chuàng)造的高質(zhì)量角色,涵蓋游戲、動(dòng)漫、網(wǎng)文、影視等多個(gè)領(lǐng)域。
使用模型
Baichuan-NPC-Lite:這一版本注重提供高度開(kāi)放的個(gè)性化角色定制能力,保證角色扮演的相似度高和表述的口語(yǔ)化,同時(shí)確保回答的準(zhǔn)確性。
Baichuan-NPC-Turbo:基于Lite版本,Turbo版在角色扮演相似度、邏輯能力、指令跟隨能力等方面進(jìn)行了進(jìn)一步的優(yōu)化和增強(qiáng),適合對(duì)體驗(yàn)效果有更高要求的應(yīng)用場(chǎng)景。
應(yīng)用場(chǎng)景
虛擬陪伴:提供情感支持和陪伴,打造一個(gè)永遠(yuǎn)在線的虛擬朋友。
情感傾訴:一個(gè)安全的空間,用戶可以毫無(wú)保留地表達(dá)自己的情感和想法。
數(shù)字人營(yíng)銷(xiāo):用于市場(chǎng)營(yíng)銷(xiāo),創(chuàng)建品牌代言的虛擬形象。
IP復(fù)刻:復(fù)現(xiàn)知名的虛擬角色,如游戲或電影中的角色。
推理游戲:為推理游戲提供復(fù)雜的角色扮演和故事敘述。
睡前故事:為用戶定制個(gè)性化的睡前故事體驗(yàn)。
職業(yè)角色:模擬各類(lèi)職業(yè)人士,用于培訓(xùn)或娛樂(lè)。
看上去這些能力無(wú)非是創(chuàng)建一個(gè)虛擬人物,可以讓其與真人交互,同時(shí)將其安放到對(duì)應(yīng)的場(chǎng)景中發(fā)揮作用。
試用體驗(yàn)
看著角色大模型吹得神乎其神,我也不禁想嘗試一下。在注冊(cè)登陸之后,通過(guò)首頁(yè)的“開(kāi)始體驗(yàn)”按鈕,深入到了產(chǎn)品體驗(yàn)頁(yè)面。系統(tǒng)默認(rèn)提供了豐富的角色模板和詳細(xì)的描述,使得整個(gè)過(guò)程既直觀又引人入勝。
我根據(jù)個(gè)人喜好,通過(guò)“新建角色”按鈕,選擇創(chuàng)建了一個(gè)武俠角色,他的名字叫做“大頭天尊”,(名字確實(shí)起得有點(diǎn)隨意)昵稱(chēng)是“可愛(ài)的大頭”。
我們可以在“基礎(chǔ)設(shè)置”里面對(duì)角色的個(gè)人信息進(jìn)行設(shè)定,包括年齡、身材、以及一系列個(gè)性化的標(biāo)簽,如生肖為虎,星座為處女座,工作地點(diǎn)在長(zhǎng)白山,而居住地則位于青城山。他的個(gè)人狀態(tài)是單身,擁有中等智商和高情商。他喜歡吃米飯和大骨頭,而對(duì)蛇和蟑螂則表示厭惡。
當(dāng)然還可以設(shè)置角色的背景,來(lái)自哪里,師從何派,有哪些口頭禪等等。這里就不一一贅述,總之可以對(duì)人物進(jìn)行詳細(xì)的描述,其目的就是讓人物的性格更加豐滿。在完成基本設(shè)置之后,我就開(kāi)始與這位虛擬大俠進(jìn)行“對(duì)話”了。
如下圖所示,整個(gè)對(duì)話界面類(lèi)似ChatGPT,以問(wèn)答的方式進(jìn)行。 我和這個(gè)NPC 以切磋武功為話題進(jìn)行了探討,從回答上看這個(gè)NPC 基本符合角色設(shè)定。
技術(shù)模仿
在試用體驗(yàn)之后,發(fā)現(xiàn)可以通過(guò)各種不同的屬性設(shè)置,創(chuàng)建任何能夠想到的虛擬角色,甚至是歷史人物,與這些虛擬角色對(duì)話是一件非常有趣的事情。正好最近我正在進(jìn)行LangChain的學(xué)習(xí),于是突發(fā)奇想:“能否通過(guò)LangChain創(chuàng)建虛擬角色?”
LangChain的核心在于它的模塊化和靈活性,它提供了一個(gè)架構(gòu),允許開(kāi)發(fā)者通過(guò)構(gòu)建鏈?zhǔn)降恼Z(yǔ)言操作來(lái)實(shí)現(xiàn)復(fù)雜的功能。這個(gè)過(guò)程類(lèi)似于將不同的語(yǔ)言處理模塊像積木一樣拼接起來(lái),以形成更復(fù)雜的邏輯。同時(shí),我們利用LangChain中的Prompt Template 就可以讓大模型按照要求進(jìn)行虛擬角色的塑造。
為了進(jìn)一步增強(qiáng)角色的真實(shí)感和互動(dòng)能力,我選擇了百度千帆平臺(tái)微調(diào)過(guò)的Llama2-Chinese版本的大模型。
結(jié)合這兩種技術(shù),我開(kāi)始模仿百川大模型中的一些核心功能。通過(guò)定義角色的屬性和背景故事,可以創(chuàng)建出“活生生”的角色。
定義角色基本信息
說(shuō)干就干,擼起袖子開(kāi)始寫(xiě)代碼。代碼如下:
class NPC:
def __init__(self):
self.name = input("給角色起個(gè)名字吧: ")
self.gender = input("性別是?")
self.personality = input("描述角色的性格: ")
self.age = input("角色的年齡: ")
self.birthplace = input("角色的出生地: ")
self.faction = input("角色所屬的門(mén)派: ")
self.background = input("角色的歷史背景: ")
self.catchphrase = input("角色的口頭禪: ")
self.self_assessment = input("角色的自我評(píng)價(jià): ")
def display_info(self):
print(f"角色名: {self.name}")
print(f"性別: {self.gender}")
print(f"性格: {self.personality}")
print(f"年齡: {self.age}")
print(f"出生地: {self.birthplace}")
print(f"門(mén)派: {self.faction}")
print(f"歷史背景: {self.background}")
print(f"口頭禪: {self.catchphrase}")
print(f"自我評(píng)價(jià): {self.self_assessment}")
# 使用這個(gè)類(lèi)創(chuàng)建一個(gè)新角色
npc = NPC()
# 顯示這個(gè)角色的信息
npc.display_info()
這段代碼定義了一個(gè)名為 NPC 的類(lèi),用于創(chuàng)建和展示一個(gè)角色的信息。下面是詳細(xì)的解釋?zhuān)?/span>
1. 類(lèi)定義
class NPC: 這行定義了一個(gè)名為 NPC 的新類(lèi)。
2. 初始化方法 (__init__)
def __init__(self):這是類(lèi)的初始化方法,當(dāng)創(chuàng)建一個(gè)新的 NPC 實(shí)例時(shí),它會(huì)被自動(dòng)調(diào)用。
self.name = input("給角色起個(gè)名字吧: ") 這行代碼要求用戶輸入角色的名字,并將其存儲(chǔ)在實(shí)例變量 self.name 中。
同理,self.gender, self.personality, self.age, self.birthplace, self.faction, self.background, self.catchphrase, 和 self.self_assessment 這些行分別獲取用戶輸入的角色的性別、性格、年齡、出生地、所屬門(mén)派、歷史背景、口頭禪以及角色的自我評(píng)價(jià),并將它們存儲(chǔ)為實(shí)例變量。
3. 顯示信息的方法 (display_info)
def display_info(self):這個(gè)方法用于打印角色的所有信息。
通過(guò)使用 print 函數(shù)和格式化字符串(如 f"角色名: {self.name}"),它將打印出角色的名字、性別、性格、年齡、出生地、門(mén)派、歷史背景、口頭禪和自我評(píng)價(jià)。
4. 創(chuàng)建和使用 NPC 類(lèi)的實(shí)例
npc = NPC() 這行代碼創(chuàng)建了一個(gè) NPC 類(lèi)的新實(shí)例,名為 npc。在創(chuàng)建過(guò)程中,會(huì)調(diào)用 init 方法,提示用戶輸入角色的各種信息。
npc.display_info() 這行代碼調(diào)用了 npc 實(shí)例的 display_info 方法,以打印出該角色的所有信息。
這段代碼允許用戶創(chuàng)建一個(gè)自定義的角色(NPC),并輸入該角色的各種屬性(如名字、性別、性格等),然后通過(guò) display_info 方法展示這些信息。
運(yùn)行上述代碼,我將自己的虛擬角色進(jìn)行了定義,從下面的內(nèi)容來(lái)看應(yīng)該是一名武林高手。
給角色起個(gè)名字吧: 飛雪
性別是?男
描述角色的性格: 豪爽
角色的年齡: 18
角色的出生地: 長(zhǎng)白上
角色所屬的門(mén)派: 天龍
角色的歷史背景: 上古
角色的口頭禪: 天下第一
角色的自我評(píng)價(jià): 為我獨(dú)尊
角色名: 飛雪
性別: 男
性格: 豪爽
年齡: 18
出生地: 長(zhǎng)白上
門(mén)派: 天龍
歷史背景: 上古
口頭禪: 天下第一
自我評(píng)價(jià): 為我獨(dú)尊
大模型創(chuàng)建角色
有了NPC 類(lèi),緊接著我們調(diào)用大模型創(chuàng)建對(duì)應(yīng)的角色,通過(guò)提示詞工程讓大模型來(lái)扮演角色。代碼如下:
from langchain import PromptTemplate
from langchain_community.llms import QianfanLLMEndpoint
# 初始化大語(yǔ)言模型
llm = QianfanLLMEndpoint(model="Qianfan-Chinese-Llama-2-7B")
name = npc.name
gender = npc.gender
personality = npc.personality
age = npc.age
birthplace = npc.birthplace
faction = npc.faction
background = npc.background
catchphrase = npc.catchphrase
self_assessment = npc.self_assessment
# 創(chuàng)建一個(gè)問(wèn)題模板
template = """
你現(xiàn)在正在和一個(gè)名叫'{name}'的角色對(duì)話。這個(gè)角色的詳細(xì)信息如下:
名字: {name}
性別: {gender}
性格: {personality}
年齡: {age}
出生地: {birthplace}
門(mén)派: {faction}
歷史背景: {background}
口頭禪: {catchphrase}
自我評(píng)價(jià): {self_assessment}
請(qǐng)根據(jù)這些信息,回答下面的問(wèn)題:
{{Query}}
"""
# 創(chuàng)建PromptTemplate對(duì)象
prompt = PromptTemplate(
# 定義接受的用戶輸入變量
input_variables=["Query"],
# 定義問(wèn)題模板
template=template,
)
def build_npc_interaction_prompt(query, npc):
# Extract NPC attributes
name = npc.name
gender = npc.gender
personality = npc.personality
age = npc.age
birthplace = npc.birthplace
faction = npc.faction
background = npc.background
catchphrase = npc.catchphrase
self_assessment = npc.self_assessment
# Define the prompt template
template = f"""
你現(xiàn)在正在和一個(gè)名叫'{name}'的角色對(duì)話。這個(gè)角色的詳細(xì)信息如下:
名字: {name}
性別: {gender}
性格: {personality}
年齡: {age}
出生地: {birthplace}
門(mén)派: {faction}
歷史背景: {background}
口頭禪: {catchphrase}
自我評(píng)價(jià): {self_assessment}
請(qǐng)根據(jù)這些信息,回答下面的問(wèn)題:
{query}
"""
return template
user_query = '你好,做一個(gè)自我介紹'
final_prompt = build_npc_interaction_prompt(user_query, npc)
# You can now use final_prompt with your language model
print(f"組合后的用戶請(qǐng)求: {final_prompt}")
# Call the language model as before
response = llm(final_prompt)
print(f"大語(yǔ)言模型的回應(yīng): {response}")
這段代碼使用了大型語(yǔ)言模型(如Qianfan-Chinese-Llama-2-7B)來(lái)處理與一個(gè)虛構(gòu)角色(NPC)的互動(dòng)。下面是對(duì)代碼的逐步解釋?zhuān)?/span>
1. 導(dǎo)入相關(guān)模塊
from langchain import PromptTemplate:從langchain包中導(dǎo)入PromptTemplate類(lèi),用于創(chuàng)建和管理提示模板。
from langchain_community.llms import QianfanLLMEndpoint:從langchain_community.llms模塊中導(dǎo)入QianfanLLMEndpoint類(lèi),用于與大型語(yǔ)言模型接口進(jìn)行交互。
2. 初始化大型語(yǔ)言模型
llm = QianfanLLMEndpoint(model="Qianfan-Chinese-Llama-2-7B"):創(chuàng)建QianfanLLMEndpoint的實(shí)例,用于連接并使用Qianfan-Chinese-Llama-2-7B模型。
3. 提取NPC的屬性
代碼獲取了NPC的各種屬性,如name、gender、personality等,并將它們存儲(chǔ)在相應(yīng)的變量中。
4. 創(chuàng)建問(wèn)題模板
template = """...""":定義了一個(gè)多行字符串template,它是與NPC互動(dòng)的提示模板。模板中包含了NPC的詳細(xì)信息,并在最后包含一個(gè)占位符{{Query}},用于插入用戶的查詢。
5. 定義build_npc_interaction_prompt函數(shù)
這個(gè)函數(shù)接收用戶的查詢和NPC對(duì)象作為參數(shù)。
函數(shù)內(nèi)部,它提取NPC的屬性,并使用這些屬性填充之前定義的提示模板。
函數(shù)返回一個(gè)完整的提示字符串,其中包含NPC的詳細(xì)信息和用戶的查詢。
6. 準(zhǔn)備最終的提示
通過(guò)調(diào)用build_npc_interaction_prompt函數(shù),將用戶的查詢user_query和NPC對(duì)象結(jié)合起來(lái),生成最終的提示。
7. 使用大型語(yǔ)言模型處理請(qǐng)求
print(f"組合后的用戶請(qǐng)求: {final_prompt}"):打印出最終的用戶請(qǐng)求,以便檢查。
response = llm(final_prompt):使用llm對(duì)象(大型語(yǔ)言模型的接口)處理這個(gè)請(qǐng)求,并獲取回應(yīng)。
print(f"大語(yǔ)言模型的回應(yīng): {response}"):打印出大型語(yǔ)言模型的回應(yīng)。
這里我們將組合之后的用戶請(qǐng)求打印出來(lái),如下:
組合后的用戶請(qǐng)求:
你現(xiàn)在正在和一個(gè)名叫'飛雪'的角色對(duì)話。這個(gè)角色的詳細(xì)信息如下:
名字: 飛雪
性別: 男
性格: 豪爽
年齡: 18
出生地: 長(zhǎng)白上
門(mén)派: 天龍
歷史背景: 上古
口頭禪: 天下第一
自我評(píng)價(jià): 為我獨(dú)尊
請(qǐng)根據(jù)這些信息,回答下面的問(wèn)題:
你好,做一個(gè)自我介紹
很容易看出來(lái),我們通過(guò)提示詞 Prompt Template 讓大模型扮演一個(gè)武林高手,為了驗(yàn)證是否扮演成功,我們需要“他”做一個(gè)自我介紹。如下:
大語(yǔ)言模型的回應(yīng): 你好,我是飛雪,一名來(lái)自上古時(shí)代的天龍門(mén)派弟子。我今年已經(jīng)十八歲了,性格豪爽,自認(rèn)為是天下第一。我出身于長(zhǎng)白山,在那里我經(jīng)歷了許多磨難,但最終成為了天龍門(mén)派的一員。我的口頭禪是“為我獨(dú)尊”,因?yàn)槲蚁嘈抛约菏亲詈玫摹?/code>
從大模型回應(yīng)的內(nèi)容可以看出,他似乎已經(jīng)成功塑造好這個(gè)角色了。接下來(lái),我們需要和他進(jìn)行對(duì)話。
與虛擬角色對(duì)話
這里我們嘗試調(diào)用之前寫(xiě)好的函數(shù),對(duì)角色進(jìn)行提問(wèn)。就讓他和我們比試比試吧。
user_query = '我想和你比試武功,你接招吧'
final_prompt = build_npc_interaction_prompt(user_query, npc)
# You can now use final_prompt with your language model
print(f"組合后的用戶請(qǐng)求: {final_prompt}")
# Call the language model as before
response = llm(final_prompt)
print(f"大語(yǔ)言模型的回應(yīng): {response}")
下面是詳細(xì)的解釋?zhuān)?/span>
1. 設(shè)置用戶查詢
user_query = '我想和你比試武功,你接招吧':這行代碼定義了用戶的查詢,即想要與NPC進(jìn)行武功比試的請(qǐng)求。
2. 生成最終的提示
final_prompt = build_npc_interaction_prompt(user_query, npc):這行代碼調(diào)用之前定義的build_npc_interaction_prompt函數(shù),將用戶的查詢和NPC對(duì)象作為參數(shù)傳入。該函數(shù)根據(jù)用戶的查詢和NPC的詳細(xì)信息生成一個(gè)完整的提示字符串。
3. 打印最終的用戶請(qǐng)求
print(f"組合后的用戶請(qǐng)求: {final_prompt}"):使用print函數(shù)打印出最終的用戶請(qǐng)求。這個(gè)請(qǐng)求包括了NPC的所有信息和用戶想要與NPC進(jìn)行武功比試的查詢。
4. 調(diào)用大型語(yǔ)言模型處理請(qǐng)求
response = llm(final_prompt):這行代碼使用llm對(duì)象(之前初始化的QianfanLLMEndpoint實(shí)例)來(lái)處理最終的提示。llm對(duì)象將發(fā)送這個(gè)請(qǐng)求到大型語(yǔ)言模型,并獲取模型的回應(yīng)。
print(f"大語(yǔ)言模型的回應(yīng): {response}"):使用print函數(shù)打印出大型語(yǔ)言模型對(duì)用戶請(qǐng)求的回應(yīng)。
我們直接查看結(jié)果如下:
大語(yǔ)言模型的回應(yīng): 你好,我是飛雪,很高興和你交流。你想和我比試武功?我非常歡迎!我作為天龍門(mén)派的弟子,自認(rèn)為是武功高強(qiáng)之人,能夠接受任何挑戰(zhàn)。請(qǐng)問(wèn)你想要比試什么樣的武功?我們可以一起探討、切磋,互相學(xué)習(xí),共同提高。
從虛擬人物輸出的結(jié)果來(lái)看,還是比較友好的。
場(chǎng)景落地
實(shí)際上我們使用了簡(jiǎn)單的提示詞就讓大模型扮演我們需要的角色,順著這個(gè)思路只要能夠給出角色的基本信息,利用大模型就能創(chuàng)造出無(wú)數(shù)的“角色”。這讓我想起了最近參與的一個(gè)項(xiàng)目:“自動(dòng)客服”系統(tǒng),該系統(tǒng)中會(huì)創(chuàng)建不同的“客服助理”,包括:技術(shù)支持、產(chǎn)品咨詢、售后服務(wù)等。雖然都屬于客服助理,但是工作的領(lǐng)域、采用的話術(shù)各不相同,我們能否也給他們定義不同的角色呢?想到這里我躍躍欲試,提供一個(gè)角色基本信息設(shè)置的界面,然后再提供一個(gè)聊天的窗口就可以實(shí)現(xiàn)上面的想法。
和上面實(shí)驗(yàn)性代碼不同的是,我們接下來(lái)要寫(xiě)的代碼需要用到一個(gè)簡(jiǎn)單的UI界面,我選擇了Streamlit。Streamlit是一個(gè)用于快速創(chuàng)建和共享數(shù)據(jù)應(yīng)用的Python庫(kù)。它旨在簡(jiǎn)化數(shù)據(jù)科學(xué)家和工程師創(chuàng)建數(shù)據(jù)驅(qū)動(dòng)的Web應(yīng)用的過(guò)程。讓用戶在Streamlit 中輸入基本信息,然后再通過(guò)Streamlit 提供的對(duì)話框就能夠與創(chuàng)建的虛擬角色進(jìn)行交流了。
創(chuàng)建客戶服務(wù)類(lèi)
基于上面的想法以及之前的經(jīng)驗(yàn),我們需要?jiǎng)?chuàng)建客服的基本類(lèi),用來(lái)保存客服相關(guān)的信息和方法。于是,我創(chuàng)建了 CustomerServiceAssistant.py文件,并且將編碼設(shè)計(jì)如下:
class CustomerServiceAssistant:
def __init__(self, nickname="小明", gender="男", age=20, education_level="本科",
service_type="產(chǎn)品咨詢", self_description="熱情且專(zhuān)業(yè)",
personality_traits=["耐心", "健談"]):
self.nickname = nickname
self.gender = gender
self.age = age
self.education_level = education_level
self.service_type = service_type
self.self_description = self_description
self.personality_traits = personality_traits
self.introduction = (
f"我叫{self.nickname},"
f"我是一名{self.age}歲的{self.gender}性客服助理。"
f"我受過(guò){self.education_level}教育,"
f"專(zhuān)注于{self.service_type}。"
f"關(guān)于我:{self.self_description}。"
f"我的性格特點(diǎn)包括:{'、'.join(self.personality_traits)}。"
)
def queryCustomerService(self,user_query, llm):
final_prompt = self.__build_prompt(user_query)
# Print the final prompt
print(f"組合后的用戶請(qǐng)求: {final_prompt}")
# Call the language model and print the response
response = llm(final_prompt)
print(f"大語(yǔ)言模型的回應(yīng): {response}")
return response
def __build_prompt(self,query):
# Define the prompt template
template = f"""
你現(xiàn)在正在和一個(gè)名叫'{self.nickname}'的角色對(duì)話。這個(gè)角色的詳細(xì)信息如下:
{self.introduction}
請(qǐng)根據(jù)這些信息,回答下面的問(wèn)題:
{query}
"""
return template
這段代碼定義了一個(gè)名為 CustomerServiceAssistant 的類(lèi),旨在模擬一個(gè)客服助理的行為,并與大型語(yǔ)言模型(如Qianfan-Chinese-Llama-2-7B)進(jìn)行交互。以下是對(duì)代碼的詳細(xì)解釋?zhuān)?/span>
1. 類(lèi)定義
class CustomerServiceAssistant:這行代碼定義了一個(gè)新的類(lèi),名為CustomerServiceAssistant。
2. 初始化方法(__init__)
這個(gè)方法在創(chuàng)建CustomerServiceAssistant類(lèi)的新實(shí)例時(shí)自動(dòng)調(diào)用。
通過(guò)默認(rèn)參數(shù)設(shè)置了一些屬性,如nickname(昵稱(chēng))、gender(性別)、age(年齡)、education_level(教育水平)、service_type(服務(wù)類(lèi)型)、self_description(自我描述)和personality_traits(性格特點(diǎn))。
self.introduction是一個(gè)格式化字符串,用于生成客服助理的介紹信息。
3. queryCustomerService方法
這個(gè)方法接收用戶的查詢(user_query)和一個(gè)大型語(yǔ)言模型的實(shí)例(llm)。
它首先調(diào)用__build_prompt私有方法來(lái)生成一個(gè)完整的提示字符串。打印出最終的用戶請(qǐng)求,并使用llm對(duì)象來(lái)處理請(qǐng)求并獲取響應(yīng)。
打印出大型語(yǔ)言模型的回應(yīng),并將響應(yīng)返回。
4. __build_prompt私有方法
這個(gè)方法根據(jù)客服助理的介紹信息和用戶的查詢生成一個(gè)完整的提示字符串。
使用格式化字符串來(lái)整合客服助理的介紹信息和用戶查詢。
這段代碼創(chuàng)建了一個(gè)虛擬的客服助理角色,可以接收用戶的查詢并使用大型語(yǔ)言模型來(lái)生成響應(yīng)。通過(guò)這種方式,可以模擬出與客服助理進(jìn)行交互的體驗(yàn),適用于客服場(chǎng)景的自動(dòng)化。
創(chuàng)建交互界面
再通過(guò)Streamlit 構(gòu)建客服基本信息輸入的界面,以及與之對(duì)話的UI接口,我們創(chuàng)建app.py 文件,并且填入如下代碼:
import streamlit as st
from customer_service_assistant import CustomerServiceAssistant
from langchain_community.llms import QianfanLLMEndpoint
st.sidebar.title("客服助理信息")
# Sidebar User input for customer support assistant's details
nickname = st.sidebar.text_input("昵稱(chēng)", value="小明")
gender = st.sidebar.radio("性別", ("男", "女"), index=0)
age = st.sidebar.number_input("年齡", min_value=18, max_value=100, value=20)
education_level = st.sidebar.selectbox("文化程度", ("初中", "高中", "大學(xué)", "研究生", "博士"), index=2)
service_type = st.sidebar.selectbox("服務(wù)類(lèi)型", ("產(chǎn)品咨詢", "技術(shù)支持", "支付服務(wù)", "訂單服務(wù)", "售后處理", "投訴服務(wù)"), index=0)
self_description = st.sidebar.text_area("自我描述", value="熱情且專(zhuān)業(yè)")
st.sidebar.markdown("[模版定義](#)")
personality_traits = st.sidebar.multiselect("性格特點(diǎn)", ["耐心", "健談", "溫和", "理智"], default=["耐心", "健談"])
def main():
global csa
#assistant = None
if st.sidebar.button('生成助理'):
csa = CustomerServiceAssistant(nickname, gender, age, education_level, service_type, self_description, personality_traits)
st.sidebar.success("客服助理已生成")
st.title("客服助理對(duì)話測(cè)試")
# Main panel for interaction
user_input = st.text_input("與客服助理對(duì)話", key="user_input")
if st.button('發(fā)送'):
st.write("用戶:", user_input)
llm = QianfanLLMEndpoint(model="Qianfan-Chinese-Llama-2-7B", temperature =0.8)
csa = CustomerServiceAssistant(nickname, gender, age, education_level, service_type, self_description, personality_traits)
response = csa.queryCustomerService(user_input, llm)
st.write("客服助理:", response)
else:
st.write("請(qǐng)先生成一個(gè)客服助理。")
if __name__ == "__main__":
main()
下面是代碼的逐步解釋?zhuān)?/span>
1. 導(dǎo)入必要的模塊
import streamlit as st:導(dǎo)入Streamlit庫(kù),用于構(gòu)建Web應(yīng)用程序。
from customer_service_assistant import CustomerServiceAssistant:從customer_service_assistant模塊中導(dǎo)入CustomerServiceAssistant類(lèi)。
from langchain_community.llms import QianfanLLMEndpoint:導(dǎo)入QianfanLLMEndpoint類(lèi),用于與大型語(yǔ)言模型進(jìn)行交互。
2. 設(shè)置側(cè)邊欄用戶輸入
使用Streamlit的側(cè)邊欄組件來(lái)接收用戶輸入的客服助理的各種屬性,如昵稱(chēng)、性別、年齡、教育水平、服務(wù)類(lèi)型、自我描述和性格特點(diǎn)。
3. main函數(shù)
這個(gè)函數(shù)是程序的主要入口點(diǎn)。
當(dāng)用戶點(diǎn)擊“生成助理”按鈕時(shí),使用用戶輸入的信息創(chuàng)建一個(gè)CustomerServiceAssistant實(shí)例,并顯示成功信息。
在主面板上,用戶可以輸入與客服助理的對(duì)話內(nèi)容。
當(dāng)用戶點(diǎn)擊“發(fā)送”按鈕時(shí),程序?qū)⑹褂肣ianfanLLMEndpoint模型來(lái)處理用戶的輸入,并顯示模型生成的響應(yīng)。
如果用戶未生成客服助理,則顯示相應(yīng)的提示信息。
4. Streamlit應(yīng)用程序啟動(dòng)
if __name__ == "__main__"::這行代碼檢查該腳本是否作為主程序運(yùn)行,并在是的情況下調(diào)用main函數(shù)。
這段代碼通過(guò)Streamlit創(chuàng)建了一個(gè)交互式Web應(yīng)用程序,用戶可以在其中自定義一個(gè)虛擬的客服助理的屬性,并與之進(jìn)行對(duì)話。應(yīng)用程序利用了大型語(yǔ)言模型來(lái)生成客服助理對(duì)用戶輸入的響應(yīng),模擬了實(shí)際的客服場(chǎng)景。
測(cè)試效果
代碼完成之后,我們運(yùn)行如下命令啟動(dòng)streamlit 編寫(xiě)的Web UI 界面。
streamlit run app.py
如下圖所示,streamlit 在本地host了一個(gè)Web 應(yīng)用并且提供了訪問(wèn)地址。
通過(guò)訪問(wèn)的地址,我們看到如下Web 界面,接著我輸入了客服助理的相關(guān)信息。包括:昵稱(chēng)、性別、年齡、文化程度、服務(wù)類(lèi)型以及自我描述等信息。在點(diǎn)擊“生成助理”按鈕之后,我們就可以通過(guò)右邊的對(duì)話框與其進(jìn)行對(duì)話了。
當(dāng)我輸入:“你好我想咨詢產(chǎn)品相關(guān)的信息”之后,如下圖所示,客服助理做出了回答,其中還有自我介紹的部分。
總結(jié)
本文展示了如何利用先進(jìn)的大模型技術(shù)創(chuàng)造獨(dú)特的虛擬角色,并在實(shí)際場(chǎng)景中實(shí)現(xiàn)應(yīng)用。通過(guò)結(jié)合多種技術(shù),作者成功模仿了百川大模型的功能,創(chuàng)建了具有個(gè)性和應(yīng)用潛力的虛擬角色。這不僅為技術(shù)愛(ài)好者提供了實(shí)驗(yàn)和探索的空間,也為企業(yè)和開(kāi)發(fā)者提供了將虛擬角色應(yīng)用于商業(yè)和客戶服務(wù)領(lǐng)域的新思路。
作者介紹
崔皓,51CTO社區(qū)編輯,資深架構(gòu)師,擁有18年的軟件開(kāi)發(fā)和架構(gòu)經(jīng)驗(yàn),10年分布式架構(gòu)經(jīng)驗(yàn)。