1
背景
ChatGPT引起巨大的業界震撼,各行各業都在討論大語言模型、通用人工智能。AI經歷了五十多年的發展,現在正處于產業結構水平化發展的關鍵時期。這一變化源于NLP領域范式的轉變,從“預訓練 微調”向“預訓練、提示、預測”模式演進。在這一新模式下,下游任務適應預訓練模型,使得一個大型模型能適用于多個任務。這一變化為AI產業的水平化分工奠定了基礎,大型語言模型成為基礎設施,Prompt Engineering公司層出不窮,專注于連接用戶和模型。AI產業的分工初步形成,包括底層基礎設施(云服務商)、大型模型、Prompt Engineering平臺和終端應用。隨著AI產業變革,開發者可以充分利用大型語言模型(LLM)和Prompt Engineering來開發創新應用。
2
Prompt-Ops下的應用
目前要開發一個基于LLM的應用,我們面臨最大的工程上的問題是什么?
- 大語言模型不能聯網,無法獲取最新的信息
- 大語言模型沒有我們私有的數據,無法回答垂直方向的問題
- 大語言模型的開放API(text-davinci-003)沒有像ChatGPT那樣優秀的上下文能力
- 大語言模型無法驅動其他工具。
2.1 Langchain等工程框架解決了這些工程上的問題
以Langchain為例簡單來說:LangChain是 LLM 底層能力的封裝,是一種 Prompt Engineering或者說是Prompt-Ops。
- 它可以接入各種不同LLM的服務,抽象了各種大語言模型的調用
- 它可以創建各種PromptTemplate,實現定制化的Prompt模版
- 它可以創建鏈來組合調用PromptTemplate
- 它可以通調用各種工具,實現GPT-3目前不擅長的事情,比如搜索/數學/鏈接私有數據庫/Python代碼
- 它可以使用代理, 驅動LLM 來確定采取哪些行動以及采取何種順序。動作可以是使用工具并觀察其輸出,也可以是返回給用戶。
- 它可以通過它的Memory模塊,來實現對話歷史的建模。
2.2 一些Langchain的開發例子
2.2.1 結合搜索的GPT
這是一個用ChatGPT和LangChain開發的Demo對比的例子,輸入的都是“誰是周杰倫的老婆?她當前的年齡乘以0.23是多少?”。可以看出ChatGPT或者GPT-3.5因為沒有搜索能力,回答的結果是錯誤的。右邊用LangChain結合OpenAI的GPT-3.5的API則輸出了正確的結果,他會逐步去搜索獲得正確信息,得出正確結果,而且中間的過程是框架自動處理的,我除了輸入問題沒有其他操作。
2.2.2 將自然語言轉為python代碼并自行糾錯
這是一個非常令人震驚的例子,在這個流程中,它自己發現函數未定義的報錯并自行糾正。
2.2.3 使用GPT-3 Statmuse Langchain查詢NBA數據
Fuzzy API composition: querying NBA stats with GPT-3 Statmuse Langchain
使用Langchain與體育數據搜索網站相結合,提問復雜的數據問題并得到準確的回復。例如:“波士頓凱爾特人隊在這個 2022-2023 賽季的 NBA 賽季場均防守得分是多少?與他們上賽季的平均水平相比,百分比變化如何?”
2.2.4 連接Python REPL打開瀏覽器播放音樂
一個蠻科幻的場景,我用Langchain接入了Python REPL工具,輸入“給我放一首歌”,它導入了webBrowser包,調用代碼打開了瀏覽器,給我播放了一首 《never gonna give you up》
def pythonTool(): Bash = BashProcess() python_repl_util = Tool( "Python REPL", PythonREPL().run, """A Python shell. Use this to execute python commands. Input should be a valid python command. If you expect output it should be printed out.""", ) command_tool = Tool( name="bash", description="""A Bash shell. Use this to execute Bash commands. Input should be a valid Bash command. If you expect output it should be printed out.""", func=bash.run, ) # math_tool = _get_llm_math(llm) # search_tool = _get_serpapi() tools = [python_repl_util, command_tool] agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True) agent.run("給我播放一首音樂")
2.2.5 連接私有數據
連接私有數據對第三方企業做LLM應用來說非常重要。下面舉幾個例子
- LangchainJs的文檔,結合了Langchain:AI-powered search for LangchainJS Documentation,你可以直接問文檔內容、技術細節。
- 數據庫產品 Supabase也做了同樣的事情,將自己的文檔與ChatGPT相連接,使得開發者可以很方便的詢問/查找自己遇到的技術問題。https://supabase.com/docs
- 政府信息問答的一個例子:Co-pilot for government
法律公文和政策條款一般都非常復雜繁瑣,這個demo中將舊金山政府的信息用Langchain與GPT結合,做到詢問其中細節能獲得準確回復的效果。
> Entering new AgentExecutor chain...I need to find out the size limit for a storage shed without a permit and then search for sheds that are smaller than that size.Action: SF Building Codes QA SystemAction Input: "What is the size limit for a storage shed without a permit in San Francisco?"Observation: The size limit for a storage shed without a permit in San Francisco is 100 square feet (9.29 m2).Thought:Now that I know the size limit, I can search for sheds that are smaller than 100 square feet.Action: GoogleAction Input: "Storage sheds smaller than 100 square feet"Observation: Results 1 - 24 of 279 ...Thought:I need to filter the Google search results to only show sheds that are smaller than 100 square feet and suitable for backyard storage.Action: GoogleAction Input: "Backyard storage sheds smaller than 100 square feet"Thought:I have found several options for backyard storage sheds that are smaller than 100 square feet and do not require a permit. Final Answer: The size limit for a storage shed without a permit in San Francisco is 100 square feet. There are many options for backyard storage sheds that are smaller than 100 square feet and do not require a permit, including small sheds under 36 square feet and medium sheds between 37 and 100 square feet.
2.3 結合私有數據問答
LLM應用與私有數據交互非常重要,我看到無數人在問一些ChatGPT無法回答的問題了:問認不認識誰、問自己公司業務細節、問各種可能不包含在預訓練數據集里的東西。這些都已用Langchain和LlaMaIndex來解決。試想一下,將私有數據與LLM相結合,將改變數據原有的訪問方式,通過問答能很自然地獲取到自己需要的信息,這是比當前的搜索/打標分類都要高效的數據交互方式。
2.3.1 如何構建一個基于私有數據的LLM問答系統
向量數據庫現在看起來是構建LLM App中很關鍵的一個組件。首先 LLM 的預訓練和微調過程不可能包含我們所期待的私有數據,因此如何將LLM關聯到私有數據成為一個很關鍵的需求。而且LLM的“接口”-自然語言通常不是像Key-Value的映射那樣精確地。
而且在這一階段我們希望LLM去理解我們的知識庫,而不是簡單的在其中搜索相同的字符串,我們希望詢問關于我們知識庫的細節,并給出一定理解后的答案(以及來源),這樣匹配向量這樣的搜索方式是一個非常合適且關鍵的解決方案。還有一個關鍵點是,LLM在每次調用是按token計費(即文本量),并且目前的接口的上下文有著4096 tokens的限制。,因此面對龐大的數據,我們也不可能將所有的數據一次性傳給LLM。因此才有了第一張圖那個流程圖的結構。
本地預先將我們私有的數據轉成向量存在Qdrant里,用戶問答時,將用戶的問題轉為向量,然后去Qdrant里進行搜索(相似性匹配)得到Top K個結果,然后將這些結果(注意這里的結果已經是自然語言了)傳給LLM進行總結輸出。
2.3.2 結合私有數據問答的抽象流程
這里使用Langchain社區博客的流程圖為例
私有數據分割成小于LLM上下文的分塊,創建向量后存入向量數據庫
將問題計算向量后在向量數據庫進行相似性搜索,算出相關性較高的top k個結果后拼接prompt送往LLM獲得答案。
2.3.3 重要組件
- OpenAI Ada模型:text-embedding-ada-002模型可以快速編碼一個1536維的向量,我們可以使用這個向量來計算文本之間的相似性。
- Langchain / LLamaIndex:Langchain包含多種文本拆分器與文檔連接器,方便將文件進行拆分并且在向量數據庫中索引;LlamaIndex 可以從向量存儲加載數據,類似于任何其他數據連接器。然后可以在 LlamaIndex 數據結構中使用此數據。
- 向量數據庫,選型比較多:Chroma / FAISS / Milvus / PGVector / Qdrant / Pinecone等等。
2.3.4 OpenAI私有部署與成本的問題
再來聊聊最近那個OpenAI私有部署的新聞,如果用Langchain來做鏈接,面對龐大的私有數據,用一個embedding模型(OpenAI的ada)計算輸入問題向量,用Qdrant等向量數據庫來管理私有數據的向量和向量搜索,用Langchain來做中間的鏈接雖然可以解決問題,但是token的消耗卻是不容忽視的成本問題。私有部署 微調可能能解決大部分前面提到的問題。可能是有錢大公司用Model instance和fine-tuning,小公司獨立開發者用Langchain等框架。更未來OpenAI的LLM服務能力外溢,可能不需要Prompt了,甚至把Langchain的功能都能包括了,LLM應用的開發接入也許只需要一個接口調用。
2.4 2023年的LLM應用技術棧
2023 用來簡單搭建 AI Demo 的最新技術棧:
- 托管: Vercel
- 前端: Next.js
- 后端: Vercel with flask
- 數據庫: Supabase
- AI 模型: OpenAI / Replicate / Hugging Face
- LLM框架層: LangChain / LLaMaIndex
- 向量存儲/搜索: Pinecone / FAISS
2.5 Prompt-Ops 目前最大的問題
一些關于 Langchain 這類Prompt-Ops這類工具的反對觀點:stream.thesephist.com主要問題是在這類工具/框架,將自然語言作為代碼和LLM的連接,使用非確定性語言本身作為控制流,有點瘋狂。而且本身評估模型輸出效果現在是個很麻煩的事,沒有很好的解決方案,很多都是維護一個巨大的電子表格,靠人去評估。(也有用LLM評估LLM的方案,還比較早期)所以要投入生產,真實面對用戶而不是作為twitter演示可能還有很多工作要做。
詳細說說測試環節面臨的巨大挑戰。假如你的產品有一套研發階段效果很好的prompt,交給測試后,可能測試上百條上千條就能看出問題了。由于效果無法保證,真正推出給c端用戶會面臨很大的挑戰。而且沒有用微調服務或者model instance的話,如果OpenAI更新了模型,你的生產環境的prompt可能需要全部重新測試一下效果。你的prompt也需要和代碼一樣按版本來管理,不管有沒有prompt變更,每個版本上線前都需要進行回歸測試。沒有好的自動化評估方案的話,大量的case都需要測試人工來看會耗費非常多的人力。
結合私有數據的LLM應用目前開發起來在工程上已經有很多不錯的方案了,很容易跑出效果不錯的demo,但還是需要非常謹慎對待這樣一種應用。畢竟我們不只是要做一個在社交媒體或者Leader面前演示的項目。提供給用戶輸入的是一個對話框,自然語言寬泛到即使你測試上萬條結果也可能出現意想不到的結果,畢竟像new bing和chatGPT這樣的產品也會被Prompt Injection。面對這種不確定性,工程上如何去避免,測試如何去覆蓋都是一個成熟產品待解決或者說還有很多工作可以做的問題。
但我覺得也不必完全否定這類Prompt-Ops工具/框架,畢竟現階段確實能做出很多不錯的demo來驗證想法。
3
未來可能的一些產品形態
聊聊ChatGPT API開放后LLM應用可能的形態。
- 對話聊天,是最直觀的應用方式,在API上做好對話歷史的管理。
- 虛擬角色聊天,在基礎對話聊天上,對API的prefix_message上做一些角色定義的prompt,可以實現類似Character.ai的效果。更深入可能是作為游戲角色、虛擬人、XR助手等。
- 類似Notion的文本輔助撰寫工具,目前Notion、FlowUs都做了類似的應用。未來各家社區的發布器集成也是一個趨勢,減低用戶發布門檻,提升發布質量。
- 數據總結性工具,實現Chat-Your-Data,提供文檔的輸入給用戶,讓用戶可以與自己提供的數據聊天,本質只涉及到互聯網公開的數據與用戶私有的數據。
- 大企業的Chat-Your-Data,各家大公司在原有業務基礎上,結合大企業的私有數據,提供更優質的服務。比如結合用戶點評的大眾點評,能夠用“想去放neo-soul和R&B音樂的酒吧”,比如我們的商詳頁,能夠總結所有用戶對這個商品的評價,并且可以讓用戶對這個商品的資料進行問答。
- 與政務、醫療、教育等領域結合,融合線上機構官網、線下大屏,提供更好的市民服務。
- 與其他工具比如IFTTT或者各種私有協議相結合,實現LLM可以訪問更多的工具和系統,舉個例子:iot場景,Office Copilot。
LLM應用實際是一種新的人機交互方式,能夠讓用戶用自然語言與我們目前的系統溝通,很多應用甚至可以簡化到只有一個聊天窗口。
4
總結
目前來說由于通用大模型訓練/部署的高成本來說,產業水平化分工的條件基本成熟,世界上并不需要很多個大模型,做LLM的應用將會是中小型企業和個人開發者的必然選擇。新形態的編程/工程范式需要工程師去及時學習理解。目前的開源技術棧已經能滿足大部分產品的需求,可以嘗試快速實踐demo來驗證想法。
參考資料:
- https://blog.langchain.dev/tutorial-chatgpt-over-your-data/
Tutorial: ChatGPT Over Your Data
- https://qdrant.tech/articles/langchain-integration/
Question Answering with LangChain and Qdrant without boilerplate
- https://mp.weixin.qq.com/s/VZ6n4qlDx4bh41YvD1HqgQ
Atom Capital:深入探討ChatGPT帶來的產業變革
作者:misotofu
來源:微信公眾號:得物技術
出處:https://mp.weixin.qq.com/s/A8LfEDhL7GlqJdttgNfeJA
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。