天天看點

如何在10分鐘内建構智能應用?——大語言模型帶來的應用開發革命

作者:famotime

楔子:泯然衆人的Siri

很早以前,人類就萌生了與計算機進行自然語言互動的想法,著名的“圖靈測試”也是基于人機對話場景設計的。1966年,Joseph Weizenbaum在MIT開發了世界上第一個聊天機器人Eliza。但由于當時技術條件所限,Eliza隻能進行有限的模式比對,對話能力非常受限,真正智能、自然的對話能力一直是AI領域的“聖杯”。直到21世紀,統計機器學習和神經網絡的發展才使聊天機器人有了長足的進步,然而訓練一個聊天機器人仍需要海量的資料、算力和研發時間。

如何在10分鐘内建構智能應用?——大語言模型帶來的應用開發革命

2011年10月,蘋果首度曝光其智能助手Siri的時候,很多人認為Siri開啟了“未來移動裝置使用方式的一種全新可能性”,但十多年過去了,人們對Siri曾經抱有的期望已經一一落空。每位使用者都在 Siri 上遇到過自己的“失望時刻 ”——它可能沒聽懂一句簡單的指令,甚至搞不定一項最基本的操作,更不可能跟你做一些深入的主題讨論,比如談談AI技術派别,聊聊歐洲文學史,或者僅僅是制定一份粗糙的旅遊出行計劃。如果這都能稱之為“智能”,那“智能”已經低到了塵埃裡。

直到2022年底ChatGPT的橫空出世,讓過去人們在Siri身上冷卻的希望,再度活泛起來。

10分鐘快速建構智能聊天機器人

如何在10分鐘内建構智能應用?——大語言模型帶來的應用開發革命

如今,借助OpenAI的開放API,隻需要用幾行代碼,10分鐘内就可以快速建構一個具備生活常識且學識豐富的智能聊天機器人。主要步驟如下:

  1. 注冊OpenAI賬号,擷取API Key;
  2. 安裝OpenAI Python庫;
  3. 準備prompt(輸入提示),調用Model完成對話;

下面是示例代碼:

import os
import openai

OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")
openai.api_key = OPENAI_API_KEY

def get_completion_from_messages(messages, model="gpt-3.5-turbo", temperature=0):
    # 傳遞整個messages,可指定角色
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=temperature, # 控制模型輸出的随機程度
    )
# print(str(response.choices[0].message))
    return response.choices[0].message["content"]           

調用API時除了選擇模型,還可以調整以下參數,生成不同風格的文本,實作更加符合需求的互動:

  • max_tokens:生成文本的最大TOKEN數,通常是單詞或子詞數;
  • temperature:随機性參數,降低temperature會得到更加保守可預測的結果;
  • top_p: nucleus sampling參數,控制生成文本的多樣性;
  • n: 生成的候選響應數量;
  • presence_penalty:懲罰現有内容的重複機率;
  • frequency_penalty:懲罰高頻詞彙出現的機率;

OpenAI提供的文本生成接口是沒有狀态的,預設情況下聊天機器人并沒有記憶,但解決辦法也簡單,就是每次發問時把曆史對話記錄一股腦的都發給AI大模型。系統預置了幾個不同的角色,assistant是聊天機器人自己,system是對機器人的背景設定,user是問話的使用者。上面的截圖舉了一個例子,使用者一開始告訴了機器人自己的姓名,然後在後續對話中把曆史聊天記錄一并帶上發給機器人,機器人就可以憑借這份上下文記錄,正确的“回憶”出使用者的姓名了。

圍繞提示詞開發場景化智能應用

如何在10分鐘内建構智能應用?——大語言模型帶來的應用開發革命

僅僅調用接口,開發一個跟OpenAI原生能力一緻的聊天機器人并沒有多大意義,更重要的是借助預訓練的大模型,我們可以快速開發出适用于特定場景的智能應用。其中的關鍵是建構好prompt,讓模型明确應用場景和預期結果。Prompt可以包含:

  • 背景資訊:為模型提供應用場景的上下文;
  • 訓示:明确告知模型應該做什麼;
  • 示例:提供輸入和期望輸出的示例;

更多關于Prompt Engineering(提示工程)的原則和技巧,參見我的另一篇博文:問題比答案重要——10分鐘學到吳恩達ChatGPT Prompt課程精粹 。

在上圖中舉了一個智能客服的例子,可以看到寥寥幾行Python代碼跟第一個例子幾乎沒有差別,但是程式中加入了大量自然語言描述,其中一部分是供查詢的産品資訊,另外一部分(中間圖示的步驟1...步驟2等)則是如何處理客戶問題的流程描述。

delimiter = "# # # # "
system_message = f"""
請按照以下步驟回答客戶的查詢。客戶的查詢将以四個井号(# )分隔,即 {delimiter}。
步驟 1:{delimiter} 首先确定使用者是否正在詢問有關特定産品或産品的問題。産品類别不算。
步驟 2:{delimiter} 如果使用者詢問特定産品,請确認産品是否在以下清單中。所有可用産品:
産品:TechPro超極本
類别:計算機和筆記本電腦
品牌:TechPro
型号:TP-UB100
保修期:1年
評分:4.5
特點:13.3英寸顯示屏,8GB RAM,256GB SSD,Intel Core i5處理器
描述:一款适用于日常使用的時尚輕便的超極本。
價格:$799.99
……
步驟 3:{delimiter} 如果消息中包含上述清單中的産品,請列出使用者在消息中做出的任何假設,例如筆記本電腦 X 比筆記本電腦 Y 大,或者筆記本電腦 Z 有 2 年保修期。
步驟 4:{delimiter} 如果使用者做出了任何假設,請根據産品資訊确定假設是否正确。
步驟 5:{delimiter} 如果使用者有任何錯誤的假設,請先禮貌地糾正客戶的錯誤假設(如果适用)。隻提及或引用可用産品清單中的産品,因為這是商店銷售的唯一五款産品。以友好的口吻回答客戶。
使用以下格式回答問題:
步驟 1:{delimiter} <步驟 1的推理>
步驟 2:{delimiter} <步驟 2 的推理>
步驟 3:{delimiter} <步驟 3 的推理>
步驟 4:{delimiter} <步驟 4 的推理>
回複客戶:{delimiter} <回複客戶的内容>
請確定在每個步驟之間使用 {delimiter} 進行分隔。"""           

這種以自然語言描述業務邏輯的開發模式,是基于大語言模型的應用開發與傳統智能應用開發的最大不同,極大地降低了開發門檻,普通使用者都可以參與到AI應用創造中來。傳統的機器學習方法需要先收集大量對話語料,然後訓練語言模型,建構和調優過程至少需要幾個月時間。而Prompt編寫的方式十分自由靈活,通過在prompt中嵌入角色設定,就可以讓聊天機器人模拟不同人格,通過提前預設關鍵詞,就可以實作場景化的問答服務,不需要獨立訓練模型,甚至不需要調優,寫幾段文字描述就可以讓聊天機器人适應不同的場景,而且取得良好的效果,這樣的即時體驗是以前難以想象的。

更進一步,如果要開發複雜的生産環境應用,直接調用OpenAI API仍有諸多不便之處,比如實際業務場景經常需要多步處理,這時我們可以借助LangChain這樣的開源架構。它為開發人員提供了建立由LLM(大型語言模型)驅動的應用程式所需的工具,比如針對多步處理,LangChain提供了稱之為“鍊”的功能元件,友善開發人員将不同的元件“鍊”在一起,以建立更進階的LLM應用。

如何在10分鐘内建構智能應用?——大語言模型帶來的應用開發革命

LangChain的核心概念包括:

LLM 大語言模型:本質上是大語言模型的包裝器,封裝不同大型語言模型的差異化接口。

Chains 鍊:提供了調用多個處理結果并連結在一起以實作複雜目标的能力。 例如從特定 URL 檢索資料,彙總檢索到的文本,再利用生成的摘要來回答問題。

Prompts 提示:通過專門的類和函數(包括提示模闆)簡化了Prompt的建立和管理。

Document Loaders and Utils 文檔工具:文檔加載器将各種資料源轉換為文本進行處理,而 utils 子產品提供各類處理工具和代碼片段。

Vectorstores 向量存儲:使用嵌入模型将每個文檔向量化并存儲在資料庫中,以便後續通過向量有效地檢索相關文檔。

Agents 代理:“代理”可以根據使用者輸入調用工具完成靈活、不确定的複雜任務。

如何在10分鐘内建構智能應用?——大語言模型帶來的應用開發革命

大模型基于本地知識庫的問答,作為一個典型場景用例,可以參考之前的博文:創造一個真正懂你的AI個人助理!——如何為ChatGPT提供本地知識庫?

大語言模型帶來的應用開發革命

相比過去的知識工程方法,經過預訓練的大語言模型解決了傳統AI系統普遍面臨的知識擷取瓶頸。它像一個無所不知的百曉生,擁有廣博的知識與強大的語言了解能力,這使得我們可以直接通過自然語言描述來完成業務程式設計,而不再需要人工進行大批量的資料準備、清洗、标注、模型調優、算法編寫等繁重勞動。

相比傳統機器學習方式的智能應用開發,基于大語言模型的應用開發有以下方面的不同:

  • 訓練資料:無需人工标注資料,大模型可以通過Prompt提示完成遷移學習;
  • 開發方式:基于自然語言程式設計,不再需要編寫規則、特征工程等;
  • 開發體驗:互動式、直覺、類似人類使用語言,無需了解機器學習原理;
  • 開發效率:幾行代碼打造原型,大幅降低開發成本;
  • 可擴充性:通過不斷提供新樣本來優化和擴充模型能力,無需從頭重新訓練;

當然,大模型也面臨巨大算力消耗、訓練代價高、系統偏差等問題。我們仍需保持清醒、審慎的态度,将這個強大的新工具運用于造福人類的目的。但這些變化毋庸置疑的解放了AI應用開發者的生産力,使他們可以關注更高層次的使用者需求,而非重複枯燥的特征提取、模型訓練調參等工作。同時,自然語言取代了傳統的程式設計語言,使廣大非技術人員也能參與到AI創作中來,這将帶來革命性的變化。

也許,我們正站在人工智能新紀元的門檻上,超大規模的語言模型正如同熔爐中燒紅的鋼鐵,散發着熾熱的光芒。它照亮了從人類大腦到機器應用的最後一公裡,更多基于大模型的智能應用必将快速發展起來,整個世界都将會是以而不同。

繼續閱讀