
請閱讀完整的“ Rags to Riches”博客系列:
https://dev.to/aws-heroes/rags-to-part-part-part-1-generative-ai-retreeval-4pd7
這個基於OpenAI的RAG聊天應用程序,可以幫助您了解AI檢索模式。這裡的技術是初學者友好的,易於部署到AWS Lambda。隨著您的需求增長,可以隨意使用更強大的組件生產此應用程序。什麼是抹布?來自IBM研究:
RAG是將事實從外部知識庫中檢索到最準確,最新信息的大型語言模型(LLM)的AI框架,並使用戶深入了解LLMS的生成過程。


您必須有一個OpenAI API鍵來運行此應用程序。您可以使用此處免費獲得一個,我可以在哪裡找到我的秘密API密鑰?指導。擁有OpenAi密鑰後,請在此項目的根部創建一個.env.development.local文件,並用您的鍵代替sk...
OPENAI_API_KEY=sk...
該項目支持開發容器,這意味著您可以使用VS代碼在容器中打開此文件夾,並將為您創建開發環境。假設您已經安裝了節點,請在集成終端或本地計算機上運行以下命令。
./bin/setup
./bin/server服務器命令將啟動前端和後端開發服務器。使用此URL訪問您的應用程序。 http:// localhost:5173
該演示應用程序使用拆分堆棧體系結構。這意味著有獨特的前端和後端。前端是vue.js應用程序嗎? Pinia用於狀態,⚡️Vite進行開發。前端還使用?尾風CSS以及? Daisyui用於造型。後端是? Node.js應用程序,該應用程序用於HTTP框架,以及? sqlite3 vss與? Better-Sqlite3用於矢量存儲和搜索。
在整個帖子中,我們將更詳細地探索各種技術,以及它們如何幫助我們在學習AI驅動的集成和及時工程的基礎上構建抹布應用程序。這是一個有趣的空間。希望您和我一樣喜歡它!
因此,讓我們從最後開始。我們的Lambdarag演示在本地運行,以使開發和學習變得易於發展。在某個時候,儘管您可能想將其運送到生產或與他人分享您的工作。那麼,為什麼要部署到Lambda,該部署選項提供什麼好處?一些想法:
在所有這些中,我認為響應流是最強大的。這是Lambda的一個相對較新的功能,它使我們的抹布可以像chatgpt一樣將文本流回Web客戶端。它還允許Lambda打破6MB響應有效載荷和30S超時限制。項目template.yaml中的這幾行與lambda Web適配器一起使一切成為可能。
FunctionUrlConfig :
AuthType : NONE
InvokeMode : RESPONSE_STREAM在您首次./bin/deploy之前。確保您登錄AWS控制台,然後首先導航到SSM參數存儲。從那裡創建一個使用路徑/lambda-rag/OPENAI_API_KEY的秘密字符串參數,並在OpenAI API密鑰中粘貼。
我們的後端有一個非常基本的src/utils/openai.js模塊。這將導出OpenAI客戶端以及輔助功能以創建嵌入。我們在本系列第一部分的基本建築師部分中簡要介紹嵌入。此功能只需將用戶的查詢變成矢量嵌入,後來對我們的SQLite數據庫進行了查詢。有很多方法可以創建和查詢嵌入。目前,我們將保持簡單,並使用OpenAI的text-embedding-ada-002型號,該型號輸出1536個維嵌入。
import { OpenAI } from "openai" ;
export const openai = new OpenAI ( {
apiKey : process . env . OPENAI_API_KEY ,
} ) ;
export const createEmbedding = async ( query ) => {
const response = await openai . embeddings . create ( {
model : "text-embedding-ada-002" ,
input : query ,
} ) ;
return JSON . stringify ( response . data [ 0 ] . embedding ) ;
} ;那麼,OpenAI的API如何創建聊天界面?第一部分中討論的上下文窗口如何發揮作用?考慮以下屏幕截圖,我告訴Lambdarag我的名字,然後詢問是否記得。
像大多數Web應用程序一樣,Chatgpt是無狀態的。 LLM模型沒有會話。每次發送消息時,都必須將所有先前的消息(上下文)發送到完成點。這就是為什麼我們使用? PINIA用於客戶端州管理。因此,從API的角度來看,它在下面看起來像這樣。
await openai . chat . completions . create ( {
model : "gpt-3.5-turbo-16k" ,
messages : [
{ role : "user" , content : "Hello my name is Ken Collins." } ,
{ role : "assistant" , content : "Hello Ken Collins! How can I..." } ,
{ role : "user" , content : "Do you remember my name?" } ,
]
} ) ;您是否注意到助手不僅對我的名字做出了回應,而且知道這是為了幫助我們穿著豪華服裝嗎?這是一種稱為角色提示的技術。我們在lambdarag演示中做到這一點,通過將此角色預先在src-frontend/utils/roleprompt.js文件中預先準備到用戶的第一個消息。
您可能已經註意到Lambdarag演示完全寫在其中? JavaScript對Python。當您了解有關構建AI應用程序的更多信息時,您可能最終必須學習Python以及更高級的框架??蘭鏈還是擁抱臉?變形金剛。所有這些都有JavaScript版本。我希望提供JavaScript客戶的這種趨勢將繼續。感覺就像是一種更容易獲得的語言。
在下一部分中,我們將介紹如何使用SQLite的新VSS擴展名來使用您的數據創建嵌入式文檔。
lambdarag演示應用程序包含一個現成的SQLite數據庫,其中包含來自Kaggle豪華服裝數據集的5,000個產品。它還具有預先種子的矢量嵌入式嵌入,並可以使用!
在我們深入研究sqlite-vss之前,我想解釋為什麼我認為這個擴展是如此的驚人。迄今為止,我發現SQLite-VSS是探索向量嵌入的最簡單,最快的方法。許多Genai項目都使用Supabase,這似乎很棒,但很難在本地運行。這裡的目標是學習!
隨著您的應用程序的增長,我強烈建議您查看Amazon OpenSearch無服務器。這是一項完全管理,高度可擴展且具有成本效益的服務,可支持向量相似性搜索。它甚至支持Faiss進行預過濾。
讓我們看一下Sqlite-VSS。本文介紹了矢量搜索的SQLITE擴展名,涵蓋了標準表的創建以及用於嵌入的虛擬表以及如何查詢它們的虛擬表。 lambdarag演示在我們的db/create.js文件中遵循所有這些模式。我們由此產生的模式是:
CREATE TABLE products (
id INTEGER PRIMARY KEY ,
name TEXT ,
category TEXT ,
subCategory TEXT ,
description TEXT ,
embedding BLOB
);
CREATE TABLE IF NOT EXISTS " vss_products_index " (rowid integer primary key autoincrement, idx);
CREATE TABLE sqlite_sequence (name,seq);
CREATE TABLE IF NOT EXISTS " vss_products_data " (rowid integer primary key autoincrement, _);
CREATE VIRTUAL TABLE vss_products using vss0 (
embedding( 1536 )
);如果要重新創建SQLITE數據庫或構建自定義數據集,則可以通過更改db/create.js並運行npm run db:create來做到這一點。這將刪除現有數據庫,並使用來自任何CSV文件,支持模式或您願意編碼的過程的數據重新創建它。
> npm run db:create
> [email protected] db:create
> rm -rf db/lambdarag.db && node db/create.js
Using sqlite-vss version: v0.1.1
Inserting product data...
██████████████████████████████████░░░░░░ 84% | ETA: 2s | 4242/5001之後,您需要運行npm run db:embeddings腳本,該腳本使用OpenAI API為每種產品創建嵌入式。這需要幾分鐘才能完成所有API調用。該任務包括本地緩存,以使重新運行更快。最後,有一個npm run db:clean Script,該腳本調用DB上的VACUUM ,以刪除虛擬表的浪費空間。同樣,僅當您要重新創建數據庫或構建自定義數據集時,才需要所有這些。有一個./bin/setup-db包裝器腳本可以為您完成所有這些步驟。
好的,所以我們有一個產品數據庫及其匹配的向量嵌入,用於語義搜索。我們如何從聊天到從數據庫中檢索項目進行編碼? Openai具有這個名為函數調用的驚人功能。在我們的演示中,它允許LLM搜索產品並向您描述結果。
但是它怎麼知道?您只需描述應用程序所隱含的一系列功能以及在聊天完成API調用中即可。 OpenAI將會1)自動確定函數應調用2)返回所需參數的函數名稱。您的要求看起來像這樣。
await openai . chat . completions . create ( {
model : "gpt-3.5-turbo-16k" ,
functions : '[{"search_products":{"parameters": {"query": "string"}}}]' ,
messages : [
{ role : "user" , content : "I need a cool trucker hat." }
]
} ) ;如果選擇了函數,則響應將包括函數和參數的名稱。您的責任是檢查此問題,然後調用與功能和參數匹配的應用程序代碼。對於lambagpt,這將是查詢數據庫並返回任何匹配行。我們在src/models/products.js文件中執行此操作。
為了使OpenAI響應結果,我們向其發送了另一個請求,現在還包括另外兩條消息。第一個是類型“函數”,包括要求您致電的函數的名稱和參數。第二個是類型的“用戶”,其中包括從我們的檢索過程中返回的產品的JSON數據。 Openai現在將響應,好像它一直都有這些知識!
await openai . chat . completions . create ( {
model : "gpt-3.5-turbo-16k" ,
functions : '[{"search_products":{"parameters": {"query": "string"}}}]' ,
messages : [
{ role : "user" , content : "I need a cool trucker hat." } ,
{ role : "function" , name : "search_products" , content : '{"query":"trucker hats"}' } ,
{ role : "user" , content : '[{"id":3582,"name":"Mens Patagonia Logo Trucker Hat..."}]' } ,
]
} ) ;由於所有消息都保持在客戶端狀態,因此您可以使用整齊的調試技術看到它們。打開src-frontend/components/Message.vue文件並進行以下更改。
'border-b-base-300': true,
'bg-base-200': data.role === 'user',
- 'hidden': data.hidden,
+ 'hidden': false,現在,您可以在UI中查看所有消息的狀態。這是調試應用程序並查看正在發生的事情的好方法。
我希望您能找到有關如何增強OpenAI聊天完成方式以獲取知識檢索的快速概述。還有很多要探索和做的事情。這裡有一些想法可以讓您入門:
src-frontend/stores/messages.js Pinia商店中的fetchResponse在這裡完成了所有工作並管理客戶端狀態。src/utils/functions.json文件中添加更多檢索方法。例如,通過ID方法的find_style可以直接查詢數據庫。❤️我希望您喜歡這些帖子,並找到Lambdarag演示應用程序,可用於學習如何使用AI進行知識檢索。隨時提出問題並分享您對此帖子的想法。謝謝你!