小伙伴們新年好啊,頹廢的 2023 年總算是過去了,過去這一年因?yàn)樽约旱臓顟B(tài)不太好,一直也沒怎么更新,2024 年是時(shí)候重新拾起行囊再出發(fā)啦!
前言
去年年底我寫過一篇《大模型小助手,Mac 工程師如何擁有自己的人工智能》,在那篇文章里我介紹了如何利用自己手頭的計(jì)算資源(Mac 電腦)快速擁有一個(gè)人工智能助手,然而大多數(shù)人手頭的算力是很孱弱的,以至于大家千方百計(jì)搭橋建梯想要拿到 OpenAI 這艘大船的船票。這無可厚非,但我們知道,在我們這個(gè)偉大的國(guó)家,科技一定是要講究自主研發(fā)的,不然談何遙遙領(lǐng)先。因此在去年 8 月,隨著《生成式人工智能服務(wù)管理暫行辦法》的正式實(shí)施, 中國(guó)自人己的生成式人工智能之路,終于從政策上給出了要求和肯定,讓 AIGC 行業(yè)發(fā)展不再迷茫。
現(xiàn)如今經(jīng)歷了一年多的發(fā)展,國(guó)產(chǎn) AI 已經(jīng)慢慢地走向成熟,其智能體的效果已經(jīng)具備了產(chǎn)業(yè)應(yīng)用場(chǎng)景落地的基本條件。因此今天我準(zhǔn)備從自己的實(shí)際需求入手,拋棄 OpenAI,使用我們國(guó)內(nèi)的 AI 平臺(tái),展示一下如何使用 LlamaIndex 框架和智譜 AI 結(jié)合起來處理常見的應(yīng)用場(chǎng)景——知識(shí)庫檢索。
大煉鋼鐵——國(guó)產(chǎn)大模型間的軍備競(jìng)賽
ChatGPT 及其背后的 GPT4 大火之后,國(guó)內(nèi)迅速刮起一陣自主研發(fā)大模型的風(fēng),先不管開源與否,目前市面上叫得上名號(hào)的就不止以下這些(排名不分先后):
機(jī)構(gòu)/公司 | 模型名稱 |
---|---|
百度 | 文心大模型 |
抖音 | 云雀大模型 |
智譜 | GLM 大模型 |
中國(guó)科學(xué)院 | 紫東太初大模型 |
百川智能 | 百川大模型 |
商湯 | 日日新大模型 |
MiniMax | ABAB 大模型 |
上海人工智能實(shí)驗(yàn)室 | 書生通用大模型 |
科大訊飛 | 星火認(rèn)知大模型 |
騰訊 | 混元大模型 |
阿里巴巴 | 通義千問大模型 |
呂布之后,人人皆有呂布之勇。?國(guó)產(chǎn)大模型亦是如此,GPT4 與大國(guó)政策雙向奔赴后,這些 AI 廠商都想在國(guó)內(nèi)大模型這場(chǎng)軍備競(jìng)賽中占得一席之地。
這些 AI 廠商一般有三種提供服務(wù)的方式:
模型私有部署:直接部署開源或者閉源的模型(需要顯卡);
AI 開發(fā)平臺(tái):很多平臺(tái)提供了 LLM 服務(wù),可以在線進(jìn)行模型測(cè)試、開發(fā)、部署、微調(diào)等服務(wù)(直接付費(fèi)即可);
API 調(diào)用:這個(gè)就和 OpenAI 早期的服務(wù)模式一樣,提供 API 的調(diào)用。
在上一篇文章中,我們選擇了清華大學(xué)與智譜合作開發(fā)且開源的 ChatGLM3 作為私有化部署的模型。鑒于對(duì)其開源產(chǎn)品的豐富產(chǎn)品線以及較好的使用體驗(yàn),這次我們?nèi)匀贿x擇智譜 AI?作為本文的大模型底座。
2024 年 1 月 16 日,智譜 AI 發(fā)布了他們最新的大模型 ChatGLM4,性能全面比肩 GPT-4(樂觀計(jì)算能達(dá)到 GPT-4 九成以上),并且在中文能力上超過了所有競(jìng)爭(zhēng)對(duì)手,長(zhǎng)文本能力也一騎絕塵。筆者體驗(yàn)下來效果非常好,初學(xué)者可以上手體驗(yàn)。
智譜 AI
智譜 AI 是基于清華大學(xué) ChatGLM 系列大模型衍生出的 AI 產(chǎn)品,今天我們主要通過他的開放平臺(tái)賦能 ??https://open.bigmodel.cn/

進(jìn)入開發(fā)工作臺(tái)后,我們可以可以看到最新的 GLM-4 模型已經(jīng)可供使用了,適用于復(fù)雜的對(duì)話交互和深度內(nèi)容創(chuàng)作設(shè)計(jì)場(chǎng)景,今天我們主要用的也是這個(gè)模型。點(diǎn)擊右上角,我們需要查看自己的 API key,新用戶給了一個(gè)月 300 萬額度的體驗(yàn) token,基本夠用了。

點(diǎn)擊「查看 API Key」 可以看到默認(rèn)的 API Key,直接拷貝使用,或者創(chuàng)建新的 API Key,這個(gè) key 我們后面會(huì)用到。

API 的基本使用
這塊的使用參考開發(fā)者后臺(tái)里的接口文檔,基本能了解個(gè)七七八八,這里就簡(jiǎn)單給一個(gè)使用的 demo 了。接口文檔地址 ??https://open.bigmodel.cn/dev/api
首先安裝 zhipuai:
pip?install?zhipuai
目前 zhipuai 的版本已經(jīng)到了 2.0.1,和去年發(fā)布的 1.0.7 在 api 使用上是有一些差異的,需要關(guān)注一下。
寫一個(gè)測(cè)試的例子:
from?zhipuai?import?ZhipuAI
client?=?ZhipuAI(api_key="")?#?填寫您自己的APIKey
response?=?client.chat.completions.create(
????model="glm-4",??#?填寫需要調(diào)用的模型名稱
????messages=[
????????{"role":?"user",?"content":?"作為一名營(yíng)銷專家,請(qǐng)為我的產(chǎn)品創(chuàng)作一個(gè)吸引人的slogan"},
????????{"role":?"assistant",?"content":?"當(dāng)然,為了創(chuàng)作一個(gè)吸引人的slogan,請(qǐng)告訴我一些關(guān)于您產(chǎn)品的信息"},
????????{"role":?"user",?"content":?"智譜AI開放平臺(tái)"},
????????{"role":?"assistant",?"content":?"智啟未來,譜繪無限一智譜AI,讓創(chuàng)新觸手可及!"},
????????{"role":?"user",?"content":?"創(chuàng)造一個(gè)更精準(zhǔn)、吸引人的slogan"}
????],
)
print(response.choices[0].message)
上面代碼我們注意到,messages
?參數(shù)是一個(gè)數(shù)組,其設(shè)計(jì)是天然針對(duì)對(duì)話、以及少樣本提示的。
比如:
messages?=?[
????{"role":?"user",?"content":?'提問1'},
????{"role":?"assistant",?"content":?'回答1'},
????{"role":?"user",?"content":?'提問2'},
????{"role":?"assistant",?"content":?'回答2'},
????{"role":?"user",?"content":?prompt},
]
AI 會(huì)跟去前面的對(duì)話歷史,對(duì)最后的?messages
?進(jìn)行回答。
??:少樣本提示(Few-shot prompting)是人工智能領(lǐng)域中的一個(gè)概念,特別是在自然語言處理(NLP)和機(jī)器學(xué)習(xí)模型訓(xùn)練中。所謂的“少樣本”指的是在模型訓(xùn)練過程中,使用非常有限的數(shù)據(jù)樣本對(duì)模型進(jìn)行訓(xùn)練。這種方法要求模型能夠從少量數(shù)據(jù)中快速學(xué)習(xí)和泛化,以便在新穎或未見過的數(shù)據(jù)上進(jìn)行準(zhǔn)確的預(yù)測(cè)。
知識(shí)庫檢索
大語言模型在專業(yè)領(lǐng)域回答缺乏依據(jù)、存在幻覺已經(jīng)是一種共識(shí),因此,為了在私域知識(shí)問答方面彌補(bǔ)通用大語言模型的一些短板,通常有兩種解決方案:
微調(diào)(fine-tune):利用私有知識(shí)庫對(duì)對(duì) LLM 模型進(jìn)行附加訓(xùn)練,以增加額外的知識(shí)
上下文學(xué)習(xí)( in-context learning):在 LLM 查詢提示中添加一些額外的知識(shí)
據(jù)觀察,目前由于上下文學(xué)習(xí)比微調(diào)更簡(jiǎn)單,所以上下文學(xué)習(xí)比微調(diào)更受歡迎,在這篇論文中講述了這一現(xiàn)象:https://arxiv.org/abs/2305.16938。
對(duì)于上下文學(xué)習(xí),我們通常采取的方案是將私域知識(shí)文檔進(jìn)行切片然后向量化,后續(xù)通過向量檢索進(jìn)行召回,再作為上下文輸入到大語言模型進(jìn)行歸納總結(jié)。
例如,要構(gòu)建一個(gè)可以回答關(guān)于某個(gè)人的任何問題,甚至扮演一個(gè)人的數(shù)字化化身的應(yīng)用程序,我們可以將上下文學(xué)習(xí)應(yīng)用于一本自傳書籍和 LLM。在實(shí)踐中,應(yīng)用程序?qū)⑹褂糜脩舻膯栴}和從書中"搜索"到的一些信息構(gòu)建提示,然后查詢 LLM 來獲取答案。
在這種搜索方法中,實(shí)現(xiàn)從文檔/知識(shí)(上述示例中的那本書)中獲取與特定任務(wù)相關(guān)信息的最有效方式之一是嵌入(Embedding)。
嵌入(Embedding)通常指的是將現(xiàn)實(shí)世界的事物映射到多維空間中的向量的方法。例如,我們可以將圖像映射到一個(gè)(64 x 64)維度的空間中,如果映射足夠好,兩個(gè)圖像之間的距離可以反映它們的相似性。
而 LlamaIndex 就是目前使用較多的工具之一。LlamaIndex 是一個(gè)開源工具包,它能幫助我們以最佳實(shí)踐去做 in-context learning:
它提供了各種數(shù)據(jù)加載器,以統(tǒng)一格式序列化文檔/知識(shí),例如 PDF、維基百科、Notion、Twitter 等等,這樣我們可以無需自行處理預(yù)處理、將數(shù)據(jù)分割為片段等操作。
它還可以幫助我們創(chuàng)建嵌入(以及其他形式的索引),并以一行代碼的方式在內(nèi)存中或向量數(shù)據(jù)庫中存儲(chǔ)嵌入。
它內(nèi)置了提示和其他工程實(shí)現(xiàn),因此我們無需從頭開始創(chuàng)建和研究,例如,《用 4 行代碼在現(xiàn)有數(shù)據(jù)上創(chuàng)建一個(gè)聊天機(jī)器人》。
感興趣的朋友可以去查看?LlmaIndex 官網(wǎng) ?? https://docs.llamaindex.ai/en/stable/?去了解更多信息。

LlamaIndex
先用 Pip 簡(jiǎn)單安裝一下 LlamaIndex:
pip?install?llama-index
然后我們導(dǎo)入下測(cè)試是否安裝成功:
import?llama_index
print(llama_index.__version__)
#?0.9.10
接下來讓 LlamaIndex 使用 智譜 AI 作為大模型底座來實(shí)現(xiàn)基于知識(shí)庫的問答。
LlamaIndex 是一個(gè)開源的,并且在海外十分流行的 in-context learning 工具,因此支持眾多目前火熱的大模型,只是很不湊巧,并沒有 「智譜 AI」 以及國(guó)內(nèi)的一眾 AI 產(chǎn)品,任重道遠(yuǎn)啊。
好在,LlamaIndex 提供了非常靈活的接口,支持我們自定義一個(gè)可以集成的大模型 ??Customizing LLMs within LlamaIndex Abstractions
集成智譜 LLM
LlamaIndex 提供了一個(gè)叫做?CustomLLM
?的抽象類來讓我們方便的集成自己的大模型產(chǎn)品,只需要負(fù)責(zé)將文本傳遞給模型并返回新生成的標(biāo)記即可。通過這種方式,我們可以結(jié)合一些本地模型(例如之前提到的 ChatGLM3),或者是一個(gè) API 的包裝器,當(dāng)然了,如果為了獲取完全私人隱私的大模型體驗(yàn),肯定是本地模型優(yōu)先。本文為了獲得更高效的體驗(yàn),直接集成智譜 AI 的 API 即可。
參考文檔,我們只需要實(shí)現(xiàn)?metadata
、complete
?以及?stream_complete
?三個(gè)重要方法即可,熟悉 OpenAI API 的朋友想必一眼就看出來這三個(gè)是什么東西了。我們只需要參考智譜 AI 的文檔依次實(shí)現(xiàn)即可。這里方便起見,就不實(shí)現(xiàn) stream_complete 的方法,智譜 AI 官網(wǎng)有例子,參考即可。下面是一個(gè)簡(jiǎn)單的 demo??
def?invoke_prompt(prompt):
????response?=?client.chat.completions.create(
????????model="glm-4",
????????messages=[
????????????{"role":?"user",?"content":?prompt},
????????],
????????top_p=0.7,
????????temperature=0.9
????)
????return?str(response.choices[0].message.content)
class?ZhiPuLLM(CustomLLM):
????model_name:?str?=?"glm-4"
????@property
????def?metadata(self)?->?LLMMetadata:
????????"""Get?LLM?metadata."""
????????return?LLMMetadata(
????????????model_name=self.model_name,
????????)
????@llm_completion_callback()
????def?complete(self,?prompt:?str,?**kwargs:?Any)?->?CompletionResponse:
????????response?=?invoke_prompt(prompt)
????????return?CompletionResponse(text=response)
集成智譜 AI 文本嵌入 Embedding
智譜 AI 也提供了文本嵌入接口,那我們當(dāng)然也是直接拿來用了,這樣子就徹底擺脫了了 OpenAI 和自己搭建模型了。
LlamaIndex 的嵌入式基于?BaseEmbedding
?實(shí)現(xiàn)的,參考官網(wǎng)的文檔(Custom Embeddings Implementation),我們也寫一個(gè) 智譜 AI 的實(shí)現(xiàn),直接看代碼:
def?invoke_embedding(query):
????response?=?client.embeddings.create(
????????model="embedding-2",??#?填寫需要調(diào)用的模型名稱
????????input=query,
????)
????return?response.data[0].embedding
class?ZhiPuEmbedding(BaseEmbedding):
????_model:?str?=?PrivateAttr()
????_instruction:?str?=?PrivateAttr()
????def?__init__(
????????????self,
????????????instructor_model_name:?str?=?"text_embedding",
????????????instruction:?str?=?"Represent?a?document?for?semantic?search:",
????????????**kwargs:?Any,
????)?->?None:
????????#?self._model?=?'text_embedding'
????????#?self._instruction?=?instruction
????????super().__init__(**kwargs)
????@classmethod
????def?class_name(cls)?->?str:
????????return?"zhipu_embeddings"
????async?def?_aget_query_embedding(self,?query:?str)?->?List[float]:
????????return?self._get_query_embedding(query)
????async?def?_aget_text_embedding(self,?text:?str)?->?List[float]:
????????return?self._get_text_embedding(text)
????def?_get_query_embedding(self,?query:?str)?->?List[float]:
????????embeddings?=?invoke_embedding(query)
????????return?embeddings
????def?_get_text_embedding(self,?text:?str)?->?List[float]:
????????embeddings?=?invoke_embedding(text)
????????return?embeddings
????def?_get_text_embeddings(self,?texts:?List[str])?->?List[List[float]]:
????????return?[self._get_text_embedding(text)?for?text?in?texts]
知識(shí)庫檢索,啟動(dòng)!
萬事俱備,只欠東風(fēng)。前菜都已準(zhǔn)備完畢,剩下的就是將前面的整合在一起,讓我們看看能不能正常運(yùn)行吧!
首先先準(zhǔn)備一個(gè)你要做 Embedding 的知識(shí)庫,我這里直接用了我的體檢報(bào)告。
#?define?our?LLM
llm?=?ZhiPuLLM()
embed_model?=?ZhiPuEmbedding()
service_context?=?ServiceContext.from_defaults(
????llm=llm,?embed_model=embed_model
)
#?Load?the?your?data
loader?=?CJKPDFReader()
documents?=?loader.load_data(file=self.file_path)
index?=?VectorStoreIndex.from_documents(documents,?service_context=service_context)
#?Query?and?print?response
query_engine?=?index.as_query_engine()
response?=?query_engine.query("在這份體檢報(bào)告里,我的血常規(guī)檢測(cè)有什么問題嗎?")
print(response)
這里我們使用了 LlamaIndex 內(nèi)置的 PDF 解析器,將文件轉(zhuǎn)換成所需的向量 index,直接調(diào)用?query_engine.query()
?函數(shù)查詢即可。至此,一個(gè)簡(jiǎn)易的基于知識(shí)庫檢索的大模型案例便完成了。
通常情況下,我們會(huì)不斷的對(duì)整個(gè)文檔進(jìn)行知識(shí)檢索,因此有必要將我們構(gòu)建的索引持久化,這樣下次再次提問的時(shí)候就可以不用重新 Embedding(當(dāng)然也可節(jié)省 token)。持久化也很簡(jiǎn)單,我們只需要調(diào)用?index.storage_context.persist(persist_dir=PERSIST_DIR)
?函數(shù)即可,等下次再使用的時(shí)候,可以先從持久化的索引文件中 load,同樣很容易,執(zhí)行以下函數(shù)即可:
storage_context?=?StorageContext.from_defaults(persist_dir=PERSIST_DIR)
index?=?load_index_from_storage(storage_context)
我們來看看返回的結(jié)果,是不是還可以呢?文章來源:http://www.zghlxwxcb.cn/news/detail-834763.html

結(jié)語
以上便是本文的全部?jī)?nèi)容了,本文主要介紹了如何使用 LlamaIndex 結(jié)合大模型落地一個(gè)知識(shí)庫索引,主要就是自定義 LLM 和自定義 Embedding 這兩塊。這兩個(gè)點(diǎn)對(duì)接之后,余下的各種玩法也幾乎和使用 OpenAI 無異。如果你對(duì)大模型感興趣的,并且想了解更多可以落地的 AI 玩法的話,不妨給我點(diǎn)個(gè)贊關(guān)注一下,后面再和大家分享。文章來源地址http://www.zghlxwxcb.cn/news/detail-834763.html
到了這里,關(guān)于不用GPT4,如何讓你的AI助理更加智能的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!