
전체 "Rags to Riches"블로그 시리즈를 읽으십시오.
https://dev.to/aws-heroes/rags-to-riches-part-1-generative-ai-retieval-4pd7
AI 검색 패턴에 대해 배우는 데 도움이되는이 OpenAI 기반 RAG 채팅 응용 프로그램. 여기의 기술은 초보자 친화적이며 AWS Lambda에 쉽게 배포하기 쉽습니다. 요구가 커지면보다 강력한 구성 요소 로이 응용 프로그램을 자유롭게 제작하십시오. 헝겊이란? IBM 연구에서 :
RAG는 가장 정확하고 최신 정보에 대한 외부 지식 기반에서 LLM (Lange Language Models)으로 사실을 검색하고 LLM의 생성 프로세스에 대한 통찰력을 제공하기위한 AI 프레임 워크입니다.


이 응용 프로그램을 실행하려면 OpenAI API 키가 있어야합니다. 내 비밀 API 키를 찾을 수있는 곳은 어디에서 무료로 얻을 수 있습니까? 가이드. OpenAI 키가 있으면이 프로젝트의 루트에 .env.development.local 파일을 작성하여 다음과 함께 sk... 대체합니다.
OPENAI_API_KEY=sk...
이 프로젝트는 개발 컨테이너를 지원하므로 vs 코드를 사용하여 컨테이너 에서이 폴더를 열 수 있으며 개발 환경이 생성됩니다. 통합 터미널 또는 노드가 설치되어 있다고 가정하고 로컬 컴퓨터에서 다음 명령을 실행하십시오.
./bin/setup
./bin/server서버 명령은 전면 및 백엔드 개발 서버를 모두 시작합니다. 이 URL을 사용하여 응용 프로그램에 액세스하십시오. http : // localhost : 5173
이 데모 애플리케이션은 분할 스택 아키텍처를 사용합니다. 독특한 프론트 엔드와 백엔드가 있음을 의미합니다. 프론트 엔드는 vue.js 애플리케이션입니까? 주를위한 Pinia 및 개발을위한 and️ Vite. 프론트 엔드도 사용합니까? 테일 윈드 CSS와 함께? 스타일링을위한 Daisyui. 백엔드는? http 프레임 워크에 ❎ express를 사용하는 node.js 응용 프로그램? sqlite3 vss와 함께? 벡터 저장 및 검색을위한 더 나은 SQLITE3.
게시물 전체에 걸쳐 AI 중심 통합 및 신속한 엔지니어링의 기본 사항을 배우면서 RAG 응용 프로그램을 구축하는 데 어떻게 다양한 기술을 탐색 할 것입니다. 이것은 정말 재미있는 공간입니다. 나는 당신이 나만큼 그것을 즐기시기 바랍니다!
그러니 끝을 염두에 두십시오. 우리의 람다래 데모는 현지에서 실행하여 개발하고 배우기 쉽습니다. 어느 시점에서 당신은 그것을 생산에 배송하거나 다른 사람들과 공유 할 수 있습니다. 그렇다면 왜 Lambda에 배포하고 해당 배포 옵션이 제공하는 것이 어떤 이점입니까? 몇 가지 생각 :
이 중에서, 나는 응답 스트리밍이 가장 강력하다고 생각합니다. Lambda의 비교적 새로운 기능인이를 통해 Rag는 Chatgpt와 같이 웹 클라이언트로 텍스트를 되돌릴 수 있습니다. 또한 Lambda는 6MB 응답 페이로드와 30S 타임 아웃 한도를 깨뜨릴 수 있습니다. 람다 웹 어댑터와 함께 프로젝트 template.yaml 의이 몇 줄은 모든 것을 가능하게합니다.
FunctionUrlConfig :
AuthType : NONE
InvokeMode : RESPONSE_STREAM 실행하기 전에 ./bin/deploy 가 처음으로. AWS 콘솔에 로그인하고 먼저 SSM 매개 변수 저장소로 이동하십시오. 거기에서 Path /lambda-rag/OPENAI_API_KEY 사용하여 비밀 문자열 매개 변수를 작성하고 OpenAI API 키에 붙여 넣습니다.
우리의 백엔드에는 매우 기본적인 src/utils/openai.js 모듈이 있습니다. 이는 OpenAI 클라이언트와 도우미 기능을 내보내며 임베딩을 생성합니다. 우리는이 시리즈의 첫 번째 부분의 기본 건축가 섹션에 간단히 포함됩니다. 이 기능은 단순히 사용자의 쿼리를 벡터 임베딩으로 바꾸어 나중에 SQLITE 데이터베이스에 대해 쿼리됩니다. 임베딩을 작성하고 쿼리하는 방법에는 여러 가지가 있습니다. 지금은 단순하게 유지하고 1536 차원 임베딩을 출력하는 OpenAi의 text-embedding-ada-002 모델을 사용합니다.
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는 어떻게 채팅 인터페이스를 만들기 위해 작동하며, Part One에서 논의 된 컨텍스트 창이 어떻게 작동합니까? Lambdarag에게 내 이름을 알려주는 다음 스크린 샷을 고려하고 기억이 있는지 물어보십시오.
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?" } ,
]
} ) ; 조수가 내 이름뿐만 아니라 럭셔리 의류로 우리를 돕기 위해 여기에 있다는 것을 알았습니까? 이것은 역할 프롬프트라는 기술입니다. 우리는이 역할을 src-frontend/utils/roleprompt.js 파일의 사용자의 첫 번째 메시지로 선물하여 Lambdarag 데모에서이를 수행합니다.
람다래 데모가 전적으로 쓰여졌다는 것을 알 수 있습니까? 자바 스크립트 대 파이썬. AI 애플리케이션 구축에 대한 자세한 내용은 결국 파이썬과 더 고급 프레임 워크와 같은 고급 프레임 워크를 배워야 할 수도 있습니다. 랭케인 또는 포옹 얼굴? Transformers.js. 모두 JavaScript 버전이 있습니다. JavaScript 고객을 제공하는 이러한 추세가 계속되기를 바랍니다. 더 접근하기 쉬운 언어처럼 느껴집니다.
다음 섹션에서는 SQLITE의 새로운 VSS 확장 기능을 사용하여 문서의 데이터와 쿼리를 포함하여 내장을 작성하는 방법을 다룹니다.
? amb 대추 Demo Application에는 Kaggle의 고급 의류 데이터 세트에서 ~ 5,000 개의 제품이있는 즉시 사용 가능한 SQLITE 데이터베이스가 포함되어 있습니다. 또한 벡터 임베딩 프리 시드 및 사용할 준비가되어 있습니다!
우리가 sqlite-vss를 파헤 치기 전에, 나는 왜이 확장이 왜 그렇게 놀라운 지 설명하고 싶습니다. 현재까지 SQLITE-VS가 벡터 임베딩을 탐색하는 가장 쉽고 빠른 방법을 발견했습니다. 많은 Genai 프로젝트는 Supabase를 사용하여 훌륭해 보이지만 현지에서 실행하기는 어렵습니다. 여기서 목표는 배우는 것입니다!
응용 프로그램이 커지면 Amazon OpenSearch Serverless를 보는 것이 좋습니다. 벡터 유사성 검색을 지원하는 완전히 관리되고 확장 가능하며 비용 효율적인 서비스입니다. 또한 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 나중에 OpenAI API를 사용하여 각 제품에 대한 임베딩을 생성하는 npm run db:embeddings 스크립트를 실행해야합니다. 모든 API 호출을 완료하는 데 몇 분이 걸립니다. 이 작업에는 로컬 캐시가 포함되어있어 더 빨리 재연됩니다. 마지막으로, DB에서 VACUUM 호출하여 가상 테이블의 낭비되는 공간을 제거하는 npm run db:clean 스크립트가 있습니다. 다시 말하지만,이 모든 것은 데이터베이스를 다시 만들거나 사용자 정의 데이터 세트를 빌드하려는 경우에만 필요합니다. 이 모든 단계를 수행하는 ./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." }
]
} ) ; 함수가 선택된 경우 응답에는 함수 이름 및 매개 변수가 포함됩니다. 귀하의 책임은이를 확인한 다음 기능 및 매개 변수와 일치하는 응용 프로그램의 코드를 호출하는 것입니다. Lambdagpt의 경우 데이터베이스를 쿼리하고 일치하는 행을 반환합니다. src/models/products.js 파일 에서이 작업을 수행합니다.
OpenAI가 결과에 응답하려면 이제 두 개의 추가 메시지가 포함 된 또 다른 요청을 보냅니다. 첫 번째는 "function"유형이며 호출하도록 요청받은 함수의 이름과 매개 변수를 포함합니다. 두 번째는 검색 프로세스에서 반환 된 제품의 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 Store의 fetchResponse 모든 작업을 수행하고 클라이언트 측 상태를 관리합니다.src/utils/functions.json 파일에 더 많은 검색 방법을 추가하는 것을 고려하십시오. 예를 들어, 데이터베이스를 직접 쿼리하는 ID 메소드별 find_style .❤️이 게시물을 즐기고 지식 검색에 AI를 사용하는 방법을 배우는 데 유용한 Lambdarag 데모 애플리케이션을 찾기를 바랍니다. 이 게시물에 대해 질문하고 생각을 공유하십시오. 감사합니다!