前言
什么是大模型?
大型語言模型(LLM)是一種深度學習模型,它使用大量數(shù)據(jù)進行預訓練,并能夠通過提示工程解決各種下游任務。LLM 的出發(fā)點是建立一個適用于自然語言處理的基礎模型,通過預訓練和提示工程的方式實現(xiàn)模型在新的數(shù)據(jù)分布和任務上的強大泛化能力。LLM 旨在解決自然語言處理中的一些關鍵問題,例如文本分類、命名實體識別、情感分析等。
LLM 由多個主要組件組成,包括圖像編碼器、提示編碼器和掩碼解碼器。圖像編碼器主要用于對輸入圖像進行編碼,以便將其轉換為可供模型處理的格式。提示編碼器用于將不同類型的提示(如點、框、文本和掩碼)表示為模型可以理解的形式。掩碼解碼器則將圖像編碼器和提示編碼器生成的嵌入映射到分割掩碼。
LLM 的訓練過程涉及多個步驟,包括預訓練、提示工程和微調。在預訓練階段,模型在大量無監(jiān)督數(shù)據(jù)上進行訓練,以學習自然語言處理中的基本模式和規(guī)律。在提示工程階段,模型根據(jù)特定任務的提示進行調整,以使其能夠解決該任務。最后,在微調階段,模型在少量標注數(shù)據(jù)上進行訓練,以進一步優(yōu)化其性能。
LLM 的優(yōu)點在于其強大的泛化能力和適用性。由于它們在大量數(shù)據(jù)上進行預訓練,因此它們可以輕松地適應新的數(shù)據(jù)集和任務,并且只需要很少的微調數(shù)據(jù)。此外,LLM 還可以應用于多種自然語言處理任務,例如文本分類、命名實體識別、情感分析等。
然而,LLM 也存在一些缺點。首先,由于它們在大量數(shù)據(jù)上進行預訓練,因此它們需要大量的計算資源和時間。其次,LLM 的訓練和部署可能需要大量的內存和計算資源,這可能會限制它們的實際應用。
上面一段話是我詢問大模型后,大模型給出的一個回答。
大模型英文縮寫LLM,全程是Large Language Model(大語言模型)。根據(jù)我的理解,大模型就是參數(shù)量規(guī)模很大的一個語言模型。ChatGPT等大模型的體驗效果就是,能很好地進行對話交互,感覺它是一個很聰明“機器人”,有時候甚至根本就感覺不出來它是“機器人”。
這篇文章我們就來介紹一下如何使用chatGPT的Api來構建一個屬于自己的大模型聊天機器人。
ChatGPT Api簡析
首先來介紹一下chatGPT該如何使用。OpenAI除了給提供了網(wǎng)頁的直接交互體驗外,還提供了一套完整的API接口,這也是我們能夠制造自己機器人的前提。使用這套API接口就能實現(xiàn)和OpenAI能力一樣的效果了。這里貼一個需要魔法的官網(wǎng):官網(wǎng)API文檔 和一個不需要的國內網(wǎng)站:API文檔中文版。我們重點介紹其中的Chat、Embeddings兩個接口。
建議:如果對chatGPT的api比較熟悉,可以跳過這一部分?;蛘咴跒g覽后面的代碼部分感到困惑時再返回來參考。
Chat
這個是聊天接口的url:https://api.openai.com/v1/chat/completions
參數(shù)格式是這樣的:
{
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": "Hello!"}]
}
響應體格式是這樣的:
{
"id": "chatcmpl-123",
"object": "chat.completion",
"created": 1677652288,
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": " Hello there, how may I assist you today?",
},
"finish_reason": "stop"
}],
"usage": {
"prompt_tokens": 9,
"completion_tokens": 12,
"total_tokens": 21
}
}
對于請求參數(shù)來說,需要在其中的messages里添加內容。role參數(shù)描述的是角色,分為system(用于系統(tǒng)指示,比如指示chat gpt要扮演什么角色。此時應該用這個參數(shù)。)、assistant(chat gpt返回消息的標識,說明這個message是chat gpt響應的。)、user(一般用戶進行對話時應該使用這個角色參數(shù)。)和function(下文分析)。content里要放的內容文本,這里就不再多解釋了。
對于響應體來說,前面的一堆都可以忽略,重點還是看messages節(jié)點,我們只要取到了messages里的消息就夠了。
function call
有些時候我們除了和大模型交互外,還希望來點別的東西。比如,我自己數(shù)據(jù)庫里的一些內容,這個大模型總沒辦法知道的吧?例如,我有一些客戶的訂單信息,希望當客戶在和大模型對話的之后能查到自己的訂單相關的內容,這時候要怎么做呢?
首先能確定的是,肯定需要借助外界的力量。我們希望當用戶詢問訂單相關信息時,大模型能夠根據(jù)我們提供的信息,去我們的數(shù)據(jù)庫中進行查詢操作。但是我需要聲明一下,讓大模型去數(shù)據(jù)庫查詢是做不到的。大模型只是相當于一個大腦,單純有腦子的話,既不能吃飯也不能走路。但是呢,腦子可以下達指令??!我們希望大模型在識別到客戶想要查詢訂單信息時,告訴我們一下就行,然后我們自己查詢完數(shù)據(jù)庫,再把相關的信息告訴大模型,這樣不就簡介地解決了這個問題嗎。
在介紹我們的主角function call之前,先說一下如果沒有它該怎么做:我們會給出一個system指令,“當客戶想要查詢訂單信息時,詢問客戶的姓名和訂單號”。我們通過客戶的姓名和訂單號就能確認出客戶的訂單信息了。然后這個時候大模型會主動地去詢問客戶的姓名和訂單號。當獲取到這兩個信息以后,我們再給出一個system指令“將姓名和訂單號按照json格式返回,示例如下:{“name”: “張三”, “orderNo”: “0001”}”。這樣,我們就能獲取到大模型返回的格式化數(shù)據(jù)了(想想如果不是格式化的數(shù)據(jù)會怎么樣?即便正確返回了信息,我們也根本沒有辦法去識別)。隨后我們將json數(shù)據(jù)進行解析,然后去數(shù)據(jù)庫里查詢,再將查詢到的結果給出一個system指令:“客戶的訂單信息是:買了xxx,在xxx時間,發(fā)貨地址是xxx”。到這里,大模型就完成了與客戶的“外界交流”。
上面的過程一看就是很麻煩的,好在OpenAI給我們開放出了這個function call接口。用function call將上面的例子實現(xiàn)一下就是:
{
"name": "findOrder",
"description": "通過客戶的姓名和訂單號,查詢客戶訂單的詳細信息。",
"parameters": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "客戶的姓名"
},
"orderNo": {
"type": "number",
"description": "客戶的訂單號"
}
},
"required": ["name", "orderNo"],
},
}
大腦需要借助這個函數(shù)調用來得到這個能力。其中,description是對函數(shù)調用的說明,告訴大模型該什么時候來執(zhí)行這個函數(shù)調用。properties節(jié)點下的內容是我們要獲取的具體參數(shù),如name和orderNo。這兩個節(jié)點下的description是對參數(shù)的說明。是不是和我們開發(fā)語言中的函數(shù)調用非常的相似?只是將參數(shù)和函數(shù)的作用的注釋告訴了大模型。當大模型根據(jù)函數(shù)的描述,覺得需要的時候就會進行執(zhí)行,返回:
{
"role": "assistant",
"function_call": {
"name": "findOrder",
"arguments": "{"name": "張三", "orderNo": "0001"}"
}
}
注意哦,這兩個屬性應該是大模型詢問用戶后得到的信息。
Embeddings
再介紹一個重量級接口Embeddings。
這個接口是輸入一段文本,輸出這段文本的向量。使用這個api只能用指定的模型,比如text-embedding-ada-002,這個是專門用來文本轉向量的模型。返回結果類似這樣的:
{
"object": "list",
"data": [
{
"object": "embedding",
"embedding": [
0.018990106880664825,
-0.0073809814639389515,
.... (1024 floats total for ada)
0.021276434883475304,
],
"index": 0
}
],
"model": "text-similarity-ada:002"
}
那么什么是向量呢?其實就是字面意思,向量。我們可以把文本按照一定的規(guī)則在三維空間中表示,那么每個文本就都有它在這個規(guī)則下對應的向量。比如我要定義:”你好“的向量是[1,0,0],”你好啊“的向量是[1,0,1],比你好多一個啊。當然實際要比這個復雜的多,通過api返回的結果也可見一斑。不過通俗的理解,就是將一段文本用數(shù)字進行表示了。有了這個數(shù)字,我們就可以根據(jù)文本在空間中向量距離由多進來判斷這兩個文本有多相似了。
制作機器人
有了上面的基礎就可以動手制作自己的聊天機器人了。上面的api介紹過了,再介紹一個java封裝的api包:github地址。
使用maven導入:
<dependency>
<groupId>com.theokanning.openai-gpt3-java</groupId>
<artifactId>{api|client|service}</artifactId>
<version>version</version>
</dependency>
使用grdle導入:implementation 'com.theokanning.openai-gpt3-java:<api|client|service>:<version>
使用起來呢也是非常簡單,配置好你的api key就可以直接用了。只需要調用chat completion接口就能實現(xiàn)自己的聊天機器人了。
上下文
攜帶上下文的方式也很簡單,只需要將自己要輸入的和大模型返回的都放入那個List<ChatMessage>
就可以了。不過需要注意一點,不同的模型允許攜帶的最大上下文是不同的,對于gpt3.5-turbo只能攜帶4096個token,這就意味著不能將所有的歷史上下文都帶上。并且,攜帶越多的上下文,資費也會越多。
由上下文問題,我們想到了一個解決辦法,就是使用前面提到的向量。通常來說,即便用戶需要使用上下文,也一般都在3-5論歷史對話中選取。這樣,我們首先想到的是只攜帶3-5論歷史,對于多余的內容就按時間先后順序刪除掉。但是還有另外一種情況,比如我希望讓大模型結合我給出的文檔內容,我當然不想每次對話都將文檔里的內容全部攜帶上,并且對于較長的文檔來說,也沒有辦法全部攜帶。另外,對于長文檔提問也具有局部性,往往只會用到文檔的一小部分內容。
使用向量就能很好的解決這個問題。首先將我們的文檔內容調用向量接口進行向量化,然后存入到我們的數(shù)據(jù)庫中。當想要問問題時,先將問題向量化,然后去庫中對比,取取最接近的幾條數(shù)據(jù)交給大模型參考,再返回我們對應問題的答案。
向量數(shù)據(jù)庫
直接使用關系型數(shù)據(jù)庫是很難來保存向量的,因此我們考慮直接使用向量數(shù)據(jù)庫。這種專門存儲向量的數(shù)據(jù)庫不僅能提供存儲的功能,一般還有比較相似的功能。比如我們可以讓它返回庫中和一段指定文本最相似的前三個,并且必須高于某個分數(shù)。
向量數(shù)據(jù)庫有很多,這里我們介紹一下milvus,這是它的地址。安裝等步驟就不再介紹了,按照文檔的步驟做就可以了,具體的使用方式在文檔里也有比較詳細的說明。
安裝完后,我們就可以是用它來實現(xiàn)我們上面提到了存儲向量的功能l。
更多場景介紹
其實我們算是介紹了大模型的兩個應用場景:一個是作為聊天機器人,需要注意的是要想連續(xù)對話就需要攜帶上下文。另外一個是文檔的問答助手,需要用到向量數(shù)據(jù)庫來作為倉庫存儲我們的文檔內容。
除此之外,聊天型的大模型還可以有很多的應用呢,比如能夠進行文本內容總結,文本信息提取,文章摘要生成等等。總之,大模型對于語言處理能力還是很強的??梢园l(fā)揮一些想象力來將大模型融入到生活中,提高我們的工作效率和提供生活便捷。
擴展閱讀
文章主要是介紹的使用ChatGPT的api來完成,我們還可以部署自己的大模型來實現(xiàn)前面提到的場景?,F(xiàn)在有一些開源的大模型,能以“比較”低的成本繼續(xù)本地化部署使用。雖然由于參數(shù)量較小,無法媲美ChatGPT,但總歸是數(shù)據(jù)掌握在自己手里,而且有些場景下費用會更低。
目前比較流行開源的大模型有:文章來源:http://www.zghlxwxcb.cn/news/detail-662371.html
- ChatGLM2 這是一個由清華大學聯(lián)合智譜AI開源的模型,github地址。
- 通義千問 由阿里巴巴開源的大模型
- Llama2 meta公司開源的大模型,不過對中文的支持較差
- moss-moon 復旦大學根據(jù)流浪地球中moss的靈感起名,也是一個不錯的大模型
除了開源模型外,還有一些商業(yè)模型,比如科大訊飛的星火大模型,百度的文心一言等。感性的同學可以去網(wǎng)上搜一下,截至目前為止有一些還在內測階段,需要申請才可能允許使用。文章來源地址http://www.zghlxwxcb.cn/news/detail-662371.html
到了這里,關于使用Java和ChatGPT Api來創(chuàng)建自己的大模型聊天機器人的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!