AI 챗봇은 기업과 조직에 필수적인 도구가 되었습니다. 하지만 대부분의 챗봇 솔루션은 클라우드 기반 모델에 의존하기 때문에 지연 시간, API 제한, 그리고 가장 중요한 개인 정보 보호 문제가 발생합니다. AI 챗봇을 온전히 자체 시스템에서 실행하면서도 모든 기능을 갖춘 데이터 플랫폼으로 대화 기록을 보관할 수 있다면 어떨까요?
이 게시물에서는 추론 등을 위해 로컬에서 컨테이너화된 모델을 실행할 수 있는 Docker의 새로운 기능인 Docker Model Runner와 대화를 저장, 검색 및 검색하는 Couchbase Capella를 사용하여 자체 호스팅 AI 챗봇을 설정하는 방법을 안내합니다. 그 결과 사용자가 제어할 수 있는 빠르고 비공개적이며 유연한 챗봇이 탄생합니다.
시작할 준비가 되셨나요? 시작하세요!
Docker 모델 러너 설정
먼저 모델 러너 기능을 사용할 수 있도록 Docker 데스크톱 및 CLI 버전이 최신 상태인지 확인합니다. 다음을 실행하여 이를 수행합니다. 도커 모델 상태
를 입력합니다. 성공하면 다음과 같은 성공 메시지가 출력됩니다. 도커 모델 러너가 실행 중입니다.
. 그렇지 않은 경우에는 먼저 최신 버전의 Docker를 구하여 설치해야 합니다. Docker를 업데이트한 후 해당 명령을 다시 실행하면 정상적으로 작동합니다.
그렇게 한 후에는 Docker Model Runner를 사용하여 컨테이너 이미지를 Llama 3.2 모델로 가져와 로컬에서 사용할 수 있도록 합니다:
도커 모델 풀 AI/llama3.3
다음을 실행하여 Llama 3.2 모델을 성공적으로 다운로드했는지 확인할 수 있습니다. 도커 모델 목록
를 클릭하면 사용 가능한 모델을 확인할 수 있습니다:
{"object":"list","data":[{"id":"ai/llama3.3","object":"model","created":1741794281,"owned_by":"docker"}]}
테스트해보고 싶으신가요? 대화형 모드에서 모델을 여는 것은 아주 쉽습니다! 실행하기만 하면 됩니다. 도커 모델 실행 AI/llama3.3
를 입력하면 대화형 모드로 전환됩니다:
대화형 채팅 모드가 시작되었습니다. 종료하려면 '/bye'를 입력합니다.
>
이제 Llama 3.2를 다운로드하여 사용할 준비가 되었으니, 이제 자체 호스팅 AI 챗봇 모델을 활용하는 간단한 백엔드 애플리케이션을 구축할 차례입니다.
챗봇 만들기
생성할 애플리케이션은 다음 작업을 수행합니다:
-
- Llama 3.2를 로컬에서 실행하려면
도커 모델 실행
CLI 명령 - 모델에 사용자 메시지를 프롬프트로 보내기
- 카우치베이스 카펠라에 채팅 기록 저장하기
- 이전 채팅 검색
- Llama 3.2를 로컬에서 실행하려면
모든 기능을 갖춘 애플리케이션을 콘솔에서 강력한 AI 기반 챗봇으로 즉시 사용할 수 있습니다. 여기서 함께 구축한 코드는 필요에 따라 리팩터링할 수 있는 기반을 제공합니다. 웹 애플리케이션의 백엔드로 전환하고 싶을 수도 있습니다. 이를 위해서는 몇 가지 수정만 하면 됩니다.
애플리케이션에는 몇 가지 종속성이 필요하므로 프로젝트 디렉토리에서 다음을 실행합니다. 엔피엠 설치 카우치베이스 리드라인 동기화
. 우리는 Couchbase Node.js SDK를 사용하여 Couchbase Capella 데이터 스토어와 상호 작용하며, 다음을 사용합니다. 리드라인 동기화
를 사용하여 애플리케이션이 터미널에서 사용자와 상호 작용하도록 할 수 있습니다.
Capella에서 채팅 데이터를 저장할 버킷을 설정하고 Capella 자격 증명을 준비해 두었는지 확인하세요. 항상 그렇듯이 자격 증명을 버전 관리에 저장하지 마세요. 로컬 개발 시 환경 변수를 사용하여 자격 증명을 공개되지 않고 안전하게 유지하세요.
저희는 애플리케이션에서 네 가지 기능을 구축하고 있습니다:
-
askAI
를 사용하여 로컬에서 실행되는 AI 모델에 메시지를 공급하는 프로세스를 캡슐화합니다.storeChat
을 클릭해 채팅 내역을 카펠라로 전송합니다.fetchChatHistory
를 클릭하여 채팅 대화 검색메인
를 사용하여 애플리케이션의 기본 인터페이스 역할을 합니다.
먼저 메인
함수를 추가하면 나머지는 모두 마무리됩니다. 이 함수는 사용자가 언제든지 종료할 수 있는 루프를 만들어 지속적인 채팅 환경을 제공합니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
비동기 함수 메인() { const { 클러스터, 컬렉션 } = 기다림 카우치베이스 연결(); 콘솔.로그("자체 호스팅 AI 챗봇(라마 3.2 + 아카펠라)"); 콘솔.로그("아래에 메시지를 입력하세요. 지난 채팅을 보려면 '기록'을, 종료하려면 '종료'를 입력하세요."); 동안 (true) { const 사용자 메시지 = readlineSync.질문("> "); 만약 (사용자 메시지.toLowerCase() === "exit") { 콘솔.로그("안녕!"); break; } 만약 (사용자 메시지.toLowerCase() === "역사") { const 역사 = 기다림 fetchChatHistory(클러스터); 콘솔.로그("\n📜 채팅 기록:"); 역사.forEach((채팅) => { 콘솔.로그(`🧑 ${채팅.사용자}\n🤖 ${채팅.응답}\n`); }); 계속; } 콘솔.로그("🤖 생각..."); const aiResponse = 기다림 askAI(사용자 메시지); 콘솔.로그(`🤖 ${aiResponse}\n`); 기다림 storeChat(컬렉션, 사용자 메시지, aiResponse); } } |
보시다시피, 저희는 Capella의 데이터 저장소 위에 구축된 기능, 즉 채팅 자체 내에서 이전 채팅 기록을 검색할 수 있는 기능을 도입했습니다. 이 기능은 사용자가 새 세션을 시작할 때마다 채팅 컨텍스트를 되찾는 데 유용할 수 있습니다.
이제 우리는 메인
함수부터 시작하여 이 함수가 호출하는 지원 함수를 만들어 보겠습니다. askAI
함수입니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
비동기 함수 askAI(프롬프트) { 반환 new 약속((해결, 거부) => { exec( `도커 모델 실행 ai/llama3.3 "${프롬프트}"`, (오류, stdout, stderr) => { 만약 (오류) { 콘솔.오류(`오류 실행 중 모델: ${오류.메시지}`); 거부(오류); } 만약 (stderr) { 콘솔.오류(`Docker stderr: ${stderr}`); } 해결(stdout.트림()); // AI 응답 반환 } ); }); } |
다음으로 storeChat
함수입니다:
1 2 3 4 5 6 7 8 9 |
비동기 함수 storeChat(컬렉션, 사용자 메시지, aiResponse) { const 채팅독 = { 사용자: 사용자 메시지, 응답: aiResponse, 타임스탬프: new 날짜().toISOString(), }; 기다림 컬렉션.업서트(`chat_${날짜.지금()}`, 채팅독); } |
마지막으로 fetchChatHistory
함수입니다:
1 2 3 4 5 6 7 8 9 |
비동기 함수 fetchChatHistory(클러스터, limit = 5) { const 쿼리 = ` 선택 사용자, 응답, 타임스탬프 FROM `챗봇` 주문 BY 타임스탬프 DESC LIMIT ${limit}; `; const 결과 = 기다림 클러스터.쿼리(쿼리); 반환 결과.행; } |
기능을 완료한 후에는 다음을 추가해야 합니다. require
문을 추가하고 Couchbase Capella 클러스터에 대한 연결을 생성합니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
const { exec } = require("child_process"); const readlineSync = require("READLINE-SYNC"); const 카우치베이스 = require("couchbase"); require("dotenv").구성(); 비동기 함수 카우치베이스 연결() { 시도 { const 클러스터 = 기다림 카우치베이스.연결(COUCHBASE_URL, { 사용자 이름: couchbase_username, 비밀번호: couchbase_password, }); const 버킷 = 클러스터.버킷("챗봇"); const 컬렉션 = 버킷.기본 컬렉션(); 콘솔.로그("카우치베이스 카펠라에 연결됨"); 반환 { 클러스터, 컬렉션 }; } catch (err) { 콘솔.오류("카우치베이스에 연결하지 못했습니다:", err); 프로세스.exit(1); } } |
마지막으로, 스크립트 마지막에 메인
함수를 삽입하여 main();
를 입력합니다.
완료되면 개인 정보를 보호하면서 동시에 저장 및 검색을 위해 Capella를 활용하는 완전히 준비된 AI 챗봇을 자체 머신에서 호스팅할 수 있습니다.
자체 호스팅 AI 챗봇 사용하기
나만의 챗봇을 사용할 준비가 되었습니다! 보내는 모든 쿼리는 Llama 3.2 모델을 사용하여 컴퓨터에서 로컬로만 처리됩니다. 어떤 AI 제공업체에도 원격으로 전송되지 않습니다.
사용해 볼 준비가 되었다면 다음을 실행하여 사용해 보세요:
노드 index.js # 또는 파일 이름을 지정합니다.
실행하면 다음과 같은 내용이 표시됩니다:
카우치베이스 카펠라에 연결
자체 호스팅 AI 챗봇(라마 3.2 + 아카펠라)
아래에 메시지를 입력합니다. 지난 채팅을 보려면 '기록'을 입력하고 종료하려면 '종료'를 입력합니다.
>
이제 질문을 하고 상호작용을 시작하세요. 다음은 예상할 수 있는 간단한 예시입니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
연결됨 에 카우치베이스 카펠라 🚀 Self-호스팅 AI 챗봇 (라마 3.2 + 카펠라) 유형 당신의 메시지 아래. 유형 'history' 에 보기 과거 채팅 또는 'exit' 에 종료. > Should I pack a 레인코트 에 대한 바르셀로나 에 대한 a 여행 거기 에서 의 끝 의 3월? 답변 만 와 함께 "yes" 또는 "no". 🤖 사고... 🤖 예. > 말하기 me 왜 I should pack a 레인코트 에 대한 바르셀로나 에서 의 끝 의 3월. 제한 당신의 답변 에 15 단어 또는 덜. 🤖 사고... 🤖 당신 may 필요 a 레인코트 as 3월 날씨 in 바르셀로나 can be 예측 불가능 그리고 rainy, up 에 10C. > exit 👋 안녕! |
로컬에서 AI 모델을 실행하는 Docker Model Runner의 개인 정보 보호 우선 접근 방식과 함께 Couchbase Capella의 확장성 및 보안을 사용하면 사용자 개인 정보를 우선시하는 동적 AI 애플리케이션을 구축할 수 있습니다. 또한 자체 머신에서 모델을 실행하면 더 빠른 추론, 즉각적인 사용자 지정, 추가 메타데이터 저장 기능, 챗봇의 동작을 미세 조정할 수 있는 유연성을 모두 자체 환경에서 누릴 수 있습니다.
Capella와 도커 모델 러너의 조합은 외부 API에 의존하지 않고도 AI 애플리케이션을 구축하는 데 필요한 속도, 제어 및 개인정보 보호 기능을 제공합니다. 챗봇을 만들든, 데이터를 분석하든, AI 기반 워크플로를 실행하든, 이 설정은 구축하는 모든 것이 효율적이고 확장 가능하며 완벽하게 제어되도록 보장합니다.
유일한 질문은 '무엇을 만들 것인가'입니다.
-
- 개발자 커뮤니티와 소통하기 를 클릭하고 무엇을 만들고 있는지 보여주세요!