如果用戶的OpenAI 未進(jìn)行訂閱,這里則需要修改model為:”OPENAI_API_MODEL”: “gpt-3.5-turbo”

3.下載本地模型。如果您遇到wget命令的問(wèn)題,您可以手動(dòng)從此鏈接(https://huggingface.co/TheBloke/Mistral-7B-Instruct-v0.2-GGUF/resolve/main/mistral-7b-instruct-v0.2.Q6_K.gguf)下載模型并保存在’models’目錄中。

bash download-models.sh

4.啟動(dòng)演示:

注:需要啟動(dòng) Docker Desktop`

bash run.sh

5.訪問(wèn) http://localhost:8501/ 上的用戶界面

在阿里云/AWS服務(wù)器運(yùn)行

我們?cè)诎⒗镌坪虯WS上都測(cè)試過(guò)這個(gè)流程,在公有云上的過(guò)程中,1-4步和上面設(shè)置一樣,請(qǐng)確認(rèn)服務(wù)器上已安裝Docker引擎。

如果服務(wù)器上配置有GPU,在第四步的命令中我們可以指定使用GPU來(lái)運(yùn)行LLM:

bash run.sh -gpu

和本地運(yùn)行不一樣的是,在云上運(yùn)行的時(shí)候我們需要設(shè)置防火墻規(guī)則之后才能訪問(wèn)界面。

5.配置防火墻規(guī)則

例如,對(duì)于阿里云,可參考https://help.aliyun.com/zh/simple-application-server/user-guide/manage-the-firewall-of-a-server

6.訪問(wèn) http://{云CPU實(shí)例的IP地址}:8501 上的用戶界面

可以在云服務(wù)商工作臺(tái)處查看服務(wù)器的IP地址,或者在連接服務(wù)器后使用如下命令查看IP地址:

curl ip.sb

隨后在瀏覽器中訪問(wèn) http://{云CPU實(shí)例的IP地址}:8501 訪問(wèn)web ui.

瀏覽器訪問(wèn)Web UI?

現(xiàn)在讓我們通過(guò)上傳一些示例數(shù)據(jù)來(lái)使用Web UI:

1.訪問(wèn)提供的鏈接(https://github.com/ppasupat/WikiTableQuestions/releases/download/v1.0.2/WikiTableQuestions-1.0.2-compact.zip)下載一組示例CSV文件。解壓下載的文件。在演示中,我們將使用位于“WikiTableQuestions/csv/200-csv/11.csv”的文件。

2. 進(jìn)入U(xiǎn)I后,首先上傳一個(gè)CSV文件,比如剛剛解壓的文件。選擇“LLM類型”來(lái)處理您的查詢。您可以在“ChatGPT”和“Local_LLM”之間進(jìn)行選擇。

3.選擇引擎來(lái)查詢您的表格數(shù)據(jù)文件。有兩個(gè)選項(xiàng):“MixSelfConsistency[1]”和“ChainOfTable[2]”。

4. 選擇完這些選項(xiàng)后,您現(xiàn)在可以根據(jù)CSV文件中的數(shù)據(jù)提問(wèn)了。例如,“誰(shuí)贏得了1972年的最佳男演員獎(jiǎng)?”點(diǎn)擊“查詢”按鈕提交您的問(wèn)題,并從選擇的LLM獲得答案。

5. 在UI的側(cè)邊欄上,有一個(gè)查看LLM推理跟蹤的選項(xiàng)。這個(gè)功能可以讓您看到LLM逐步處理您的問(wèn)題的過(guò)程,從而提供了如何得出答案的見(jiàn)解。

05 代碼結(jié)構(gòu)說(shuō)明

該演示的代碼[3]主要包括以下幾個(gè)文件:

06 查詢引擎的運(yùn)作機(jī)制

在演示中,我們使用了一個(gè)名為“11.csv”的CSV文件,該文件來(lái)自“WikiTableQuestions/csv/200-csv”示例數(shù)據(jù)集。該CSV文件包含在下表中顯示的結(jié)構(gòu)化表格數(shù)據(jù)。讓我們來(lái)探索一下查詢引擎對(duì)于問(wèn)題“哪位提名者在1972年獲得了奧斯卡最佳男演員獎(jiǎng)?”是如何回答的。

“MixSelfConsistency” 查詢引擎

“MixSelfConsistency” 引擎通過(guò)循環(huán)遍歷兩種不同的可配置迭代次數(shù)的查詢路徑來(lái)運(yùn)行。這兩個(gè)路徑分別被稱為“文本推理”和“符號(hào)推理”。

“文本推理”路徑

這個(gè)路徑很直接。它將 CSV 文件的內(nèi)容直接整合到提示詞中,從而形成一個(gè)綜合查詢,然后輸入給LLM。我們執(zhí)行了三次這個(gè)流程,得到了結(jié)果列表:

['Gene Hackman', 'Gene Hackman', 'Gene Hackman'].

“符號(hào)推理”路徑

這條路徑使用LlamaIndex的PandasQueryEngine。該查詢引擎將CSV文件加載到pandas數(shù)據(jù)幀中,然后根據(jù)給定的問(wèn)題生成pandas指令以獲取結(jié)果。在演示中,我們得到了三條 pandas 指令,每條指令對(duì)應(yīng)一次迭代運(yùn)行。

第一次運(yùn)行:

df[(df['Award'] == 'Academy Awards, 1972') & (df['Category'] == 'Best Actor') & (df['Result'] == 'Won')]['Nominee']

第二次運(yùn)行

df[(df['Award'] == 'Academy Awards, 1972') & (df['Category'] == 'Best Actor') & (df['Result'] == 'Won')]['Nominee'].iloc[0]

第三次運(yùn)行

df[(df['Award'] == 'Academy Awards, 1972') & (df['Category'] == 'Best Actor') & (df['Result'] == 'Won')]['Nominee']

因此,結(jié)果列表為:

[    '2    Gene Hackman\nName: Nominee, dtype: object',    
     'Gene Hackman',
    '2    Gene Hackman\nName: Nominee, dtype: object'
]

自洽性聚合

最后一步是將從”文本推理”和”符號(hào)推理”生成的合并表中統(tǒng)計(jì)每個(gè)推理結(jié)果出現(xiàn)的次數(shù),然后返回出現(xiàn)次數(shù)最多的那個(gè)推理結(jié)果,即為答案。在我們的演示中,出現(xiàn)計(jì)數(shù)最高并因此被判定為最有可能的答案的推理結(jié)果是”Gene Hackman”。

優(yōu)點(diǎn)和缺點(diǎn)

“MixSelfConsistency”查詢引擎通過(guò)融合文本推理和符號(hào)推理,并利用混合自洽性機(jī)制,提高了準(zhǔn)確性。但是,對(duì)這些查詢路徑進(jìn)行多次迭代運(yùn)算可能會(huì)導(dǎo)致整體響應(yīng)時(shí)間變長(zhǎng)。

“ChainOfTable” 查詢引擎?

“ChainOfTable”引擎最初采用一系列操作將原始表格修改成可以直接處理查詢的格式。隨后,它將經(jīng)過(guò)修改的表格和問(wèn)題結(jié)合起來(lái)創(chuàng)建一個(gè)提示詞,以便 LLMs 能夠推導(dǎo)出最終答案。這個(gè)最后階段類似于“MixSelfConsistency”引擎中的”文本推理”路徑。

表格操作鏈 

讓我們深入了解一下它構(gòu)建操作鏈的方法。在每次迭代中,引擎都會(huì)提示 LLM 下一步的操作,同時(shí)考慮當(dāng)前的表格狀態(tài)和之前的操作歷史??赡艿牟僮靼ǎ?nbsp;

1. f_add_column():當(dāng)表格需要額外的推斷數(shù)據(jù)來(lái)準(zhǔn)確響應(yīng)查詢時(shí),使用這個(gè)操作添加新列。

2. f_select_row():當(dāng)只有特定行與問(wèn)題相關(guān)時(shí),使用這個(gè)操作來(lái)隔離并專注于特定行。

3. f_select_column():與f_select_row()類似,使用這個(gè)操作將關(guān)注點(diǎn)縮小到回答查詢所需的特定列上。

4. f_group_by():對(duì)于涉及具有相同值及其計(jì)數(shù)項(xiàng)的查詢,使用這個(gè)操作可根據(jù)這些項(xiàng)進(jìn)行分組,從而提高數(shù)據(jù)表述的清晰度。

5. f_sort_by():如果查詢涉及某列中數(shù)據(jù)的順序或排名,使用這個(gè)操作會(huì)根據(jù)問(wèn)題的上下文對(duì)該項(xiàng)進(jìn)行排序。

演示案例

回到我們的演示,讓我們重新審視一下查詢:“哪位提名者在1972年獲得了奧斯卡最佳男主角獎(jiǎng)?”。作為回應(yīng),”ChainOfTable”引擎在第一次迭代時(shí)執(zhí)行了操作f_select_row([‘row 3’])。此操作導(dǎo)致創(chuàng)建了一個(gè)新的表,結(jié)構(gòu)如下:

最終的查詢變得直接了當(dāng),直接得出了最終答案:“Gene Hackman?!?/p>

優(yōu)點(diǎn)和缺點(diǎn)

“ChainOfTable”引擎創(chuàng)建了一系列操作,將原始表格轉(zhuǎn)化為與最終問(wèn)題更加吻合的版本。這種方法顯著提高了對(duì)那些無(wú)法從原始表格中立即得出答案的查詢的準(zhǔn)確性,需要一系列表格操作來(lái)澄清問(wèn)題。然而,這個(gè)過(guò)程要求每次與 LLM的交互都要在提示中包含當(dāng)前表格的內(nèi)容。這種方法可能會(huì)影響 LLMs 的性能,特別是在處理大型表格時(shí),因?yàn)閿?shù)據(jù)的大小直接影響處理負(fù)載。

性能比較

在我們的查詢引擎演示中,每次執(zhí)行查詢都會(huì)提供兩個(gè)關(guān)鍵信息:查詢引擎的響應(yīng)和生成該響應(yīng)所需的時(shí)間。通過(guò)使用演示中的 CSV 文件進(jìn)行實(shí)驗(yàn),我們發(fā)現(xiàn)當(dāng)使用 ChatGPT 推理時(shí),”MixSelfConsistency “引擎往往比 “ChainOfTable “引擎更快、更準(zhǔn)確。

需要注意的是,這些結(jié)果并不是通過(guò)系統(tǒng)的基準(zhǔn)測(cè)試或?qū)煞N查詢引擎的全面比較得出的。我們提到的結(jié)果完全基于我們有限的實(shí)驗(yàn)。因此,這些結(jié)果應(yīng)被視為初步觀察結(jié)果,而非最終結(jié)論。

我們鼓勵(lì)對(duì)這一領(lǐng)域感興趣的個(gè)人以我們的演示為起點(diǎn),進(jìn)行更廣泛的比較或基準(zhǔn)測(cè)試。

07 使用體會(huì)

與LLMs的交互

在本次演示的實(shí)現(xiàn)過(guò)程中,一個(gè)關(guān)鍵部分是與用于查詢的 LLMs 的 API 建立連接。這包括設(shè)置與 ChatGPT 的 OpenAI API 的建立連接以及與本地 LLMs 的類似 API 建立連接。以下是代碼的第一部分:

self.openai_llm = OpenAI(model=OPENAI_API_MODEL)
self.local_llm = OpenAILike(
   api_base=API_BASE,
   api_key=API_KEY,
   model=MODEL_NAME,
   is_chat_model=True,
   is_function_calling_model=True,
   context_window=3900,
   timeout=MAC_M1_LUNADEMO_CONSERVATIVE_TIMEOUT,
)

此外,設(shè)置 ServiceContext 對(duì)于 LLMs 也非常重要,特別是對(duì)于本地 LLMs 。本地 LLMs 使用的是 Huggingface 的本地 embed_model(來(lái)自此文檔https://docs.llamaindex.ai/en/stable/module_guides/models/embeddings.html,本地 embed_model 指的是 “BAAI/bge-large-en” ):

if llm_type == GPT_LLM:
   chosen_llm = self.openai_llm
   embed_model = OpenAIEmbedding(embed_batch_size=10)
   service_context = ServiceContext.from_defaults(
       chunk_size=1024, llm=chosen_llm, embed_model=embed_model)
else:
   chosen_llm = self.local_llm
   service_context = ServiceContext.from_defaults(
       chunk_size=1024, llm=chosen_llm, embed_model="local")
   set_global_service_context(service_context)

上述實(shí)現(xiàn)在功能上是可行的,但在靈活性和切換不同 LLM(如 OpenAI 和本地 LLM )的易用性方面并不理想。在理想的設(shè)置中,類似 OpenAI 或 OpenAILike 的類應(yīng)能夠與 OpenAI 模型和本地 LLMs 建立連接。這可以通過(guò)簡(jiǎn)單地指定這些兼容 API 的 api_base 和 api_key 來(lái)實(shí)現(xiàn)。

正如 LlamaIndex 所解釋的那樣,OpenAILike類是對(duì) OpenAI 模型的輕量級(jí)封裝。其目的是確保與提供 OpenAI 兼容 API 的第三方工具兼容。然而,目前 LlamaIndex 限制了使用自定義模型的 OpenAI 類的使用,主要是因?yàn)樾枰獜哪P兔Q中推斷出某些元數(shù)據(jù)。

這個(gè)限制說(shuō)明未來(lái)需要優(yōu)化實(shí)現(xiàn)過(guò)程,讓用戶更容易集成和切換不同 LLMs,無(wú)論是 OpenAI 還是本地 LLMs。

OpenAI兼容的API服務(wù)

選擇使用與 OpenAI 兼容的 API 服務(wù)作為應(yīng)用程序和 LLMs 之間的中介是一個(gè)戰(zhàn)略性的決定,旨在提高模塊化和增強(qiáng)靈活性。這種方法允許在不更改應(yīng)用程序代碼的情況下無(wú)縫更換 LLMs,從而減輕了直接集成可能出現(xiàn)的兼容性問(wèn)題。這樣的設(shè)置確保應(yīng)用程序?qū)λ鼈兘换サ木唧w LLMs 保持中立,從而便于更容易地進(jìn)行更新和維護(hù)。

在選擇合適的 API 服務(wù)的過(guò)程中,我們最初的選擇是 GPT4All Rest API。眾所周知,GPT4All是一個(gè)很好的工具,通過(guò)在標(biāo)準(zhǔn)硬件上啟用對(duì) LLMs 的使用,使其更加大眾化。然而,現(xiàn)在 GPT4All Rest API 與當(dāng)前的 OpenAI API 規(guī)范不兼容,因此我們無(wú)法切換后端的 LLM 服務(wù)。隨后,我們?cè)u(píng)估了 LocalAI ,它被證明與 LlamaIndex OpenAILike 類兼容并且能夠有效地運(yùn)行。這種兼容性對(duì)我們來(lái)說(shuō)十分重要,LocalAI 符合當(dāng)前的規(guī)范,并能夠與我們的框架平滑集成。

管理Docker鏡像的大小

選擇在Docker容器中運(yùn)行我們的演示是由Docker為L(zhǎng)LM應(yīng)用提供的諸多優(yōu)勢(shì)驅(qū)動(dòng)的,包括增強(qiáng)的可移植性、可重現(xiàn)性、可擴(kuò)展性、安全性、資源效率和簡(jiǎn)化的部署流程。然而,在構(gòu)建我們的演示的Docker鏡像過(guò)程中,我們注意到安裝PyTorch后鏡像大小顯著增加。為了解決這個(gè)問(wèn)題并減小CPU實(shí)例的Docker鏡像大小,我們選擇直接從官方的wheel安裝PyTorch,下載地址為 http://download.pytorch.org/whl/cpu:

pip install --no-cache-dir -r requirements.txt \    --extra-index-url https://download.pytorch.org/whl/cpu

此方法顯著減少了壓縮后的鏡像大小,僅為 435.06 MB,而GPU實(shí)例的壓縮后大小則變得更大了,為 5.38 GB。對(duì)于那些希望用 CPU 實(shí)例構(gòu)建鏡像的人來(lái)說(shuō),采用這種策略尤為有效,這一策略在功能和效率之間取得了平衡。

08 鏈接

本文Github 鏈接:

https://github.com/LinkTime-Corp/llm-in-containers/tree/main/tabular-data-analysis

博客原文:

https://blog.gopenai.com/enhancing-tabular-data-analysis-with-llms-78af1b7a6df9

[1]MixSelfConsistency

https://github.com/run-llama/llama-hub/tree/main/llama_hub/llama_packs/tables/mix_self_consistency

[2]ChainOfTable

https://github.com/run-llama/llama-hub/tree/main/llama_hub/llama_packs/tables/chain_of_table

[3]演示代碼

https://github.com/LinkTime-Corp/llm-in-containers/tree/main/tabular-data-analysis/src

[4]main.py

https://github.com/LinkTime-Corp/llm-in-containers/blob/main/tabular-data-analysis/src/main.py

[5]backend.py

https://github.com/LinkTime-Corp/llm-in-containers/blob/main/tabular-data-analysis/src/backend.py

[6]constants.py

https://github.com/LinkTime-Corp/llm-in-containers/blob/main/tabular-data-analysis/src/constants.py

分享到

zhupb

相關(guān)推薦