생성 AI(GenAI)

개념에서 코드까지: Couchbase를 사용한 LLM + RAG

GenAI 기술은 2023 년과 2024 년에 확실히 트렌드 아이템이며, 제가 일하는 회사에서  Tikal는 매년 자체적으로 기술 레이더 및 트렌드 보고서를 작성하면서 LLM과 genAI는 제 관심을 피할 수 없었습니다. 개발자로서 저는 모든 종류의 TypeScript 오류와 신비한 보푸라기 문제를 해결하기 위해 생성형 AI 챗봇에 자주 문의하고, IDE에서 genAI 보조 도구를 사용하고, PR을 개선하는 데 도움을 받습니다. 이 기술은 삶을 바꿀 수도 있습니다.

기술자, 특히 소프트웨어 개발자로서 이 새로운 트렌드는 우리가 작업하는 모든 프로젝트에 이러한 기능을 통합할 수 있는 기회를 열어주었고, 친구와 동료들이 이러한 옵션을 탐색하는 것을 보고 저도 그렇게 해야겠다는 결심을 하게 되었습니다!

그리고 바로 그 프로젝트가 있었습니다:

아마추어 무용단에서 춤을 추는 아마추어 무용수인 저는 아마추어 예술가들이 어떻게 하면 지역과 전 세계의 다양한 문화 행사를 탐색하여 원하는 공연 초대를 받을 수 있을지 궁금할 때가 많습니다. 저희는 모든 것을 알 수 있는 리소스, 인맥, 지식을 가지고 있지 않습니다. 물론 검색 엔진이나 전문 웹사이트도 있지만, 무엇을 어떻게 검색해야 하는지 알아야 하기 때문에 저는 genAI를 사용하여 추천을 받기로 결정했습니다.

1단계 - 할 수 있나요?

LLM 중 하나를 사용하여 추천 엔진의 가능성을 확인하는 작업에는 여러 genAI 채팅 서비스에서 계정을 개설하고 동일한 질문을 하는 것이 포함되었습니다:

우리는 아마추어 이스라엘 민속 춤 의 댄서들을 포함한 휠체어. 우리는 찾고 있습니다 문화 그리고 민속 이벤트 그리고 축제 in 유럽 공연 초대를 받을 수 있는 옵션에 대해 문의할 수 있습니다. 비용 충당. 몇 가지를 추천해 주시겠어요?

2024년 상반기 결과는 채팅 서비스마다 차이가 있었습니다:

    • 결과를 쿼리할 수 있는 전용 웹사이트로 연결됨
    • 실제 결과 제공

결과를 반환 한 사람들로부터 관련성과 정확성을 기준으로 결과의 품질을 평가 한 결과 다음과 같이 끝났습니다. OpenAI GPT-3 를 선택할 수 있습니다.

2단계 - 이 정도면 충분할까요?

1단계의 채팅 도우미 중 한 명이 다른 웹사이트를 확인해보라고 제안했던 것을 기억하면서, 그 데이터 중 일부를 결과에 포함시킬 수 있다면 어떨까요?

모델을 학습시킨 사람과 학습 시점에 따라 달라진다는 점을 고려할 때, 더 많은 데이터 소스를 기반으로 추천을 하고 싶었고 RAG를 사용하면 가능하다는 것을 알았습니다. 우선 RAG란 무엇인가요?

검색 증강 생성(RAG)

RAG는 "외부" 데이터를 추가하여 LLM에서 받은 결과를 보강하고 최적화하는 프로세스입니다. 외부 데이터 소스(전용 웹사이트)에서 동일한 검색을 기반으로 한 결과를 추가할 수 있다면 애플리케이션이 제공하는 결과의 다양성을 확장할 수 있습니다.

그러기 위해서는 다음이 필요합니다:

    • 외부 데이터 소스 - 실험을 위해 다음에 대한 평가판 계정을 만들었습니다. predictHQ의 이벤트 API
    • 내 외부 데이터 저장소는 정확히 일치하지 않는 유사도 검색을 허용하는 엔진입니다.

RAG가 데이터에 액세스할 수 있도록 만들기

데이터, 데이터의 모양, 데이터에 포함된 기능에 대한 조사를 마쳤다면, 이제 사용할 데이터 기능을 선택하여 RAG에서 사용할 수 있도록 만들어야 합니다.

유사도 검색을 허용하려면 데이터를 검색 가능한 형식으로 변환해야 합니다. 비슷합니다. 정확한 일치 항목이 아니라 유사한 일치 항목을 찾기 때문에 이를 위한 두 가지 일반적인 기술이 있습니다:

RAG 기법 세부 정보
벡터 검색(일반 RAG라고도 함) 정보 조각과 질문은 다음과 같이 변환됩니다. 벡터 의 숫자(부동 소수점).

수학적 계산을 사용하여 문제와 데이터 간의 유사성을 결정합니다.

GraphRAG 정보 조각과 질문은 다음과 같이 변환됩니다. 그래프 정점과 가장자리.

그래프 관계의 유사성을 비교합니다.

데이터 표현을 생성하는 프로세스를 다음과 같이 호출합니다. 임베딩이 문서에서는 벡터 검색에 초점을 맞출 것입니다.

유사성 메트릭

3가지 일반적인 옵션이 있습니다(간단히 말해서):

    • 도트 곱: 각 벡터의 값의 곱을 기반으로 유사도 계산하기
    • 코사인: 코사인: 벡터 사이의 각도를 기준으로 합니다.
    • L2_norm: 벡터 사이의 유클리드 거리, 벡터 사이의 각도와 각 벡터의 길이를 기준으로 합니다.

자세히 알아보기 벡터 유사도 옵션.

3단계 - 어떻게 하나요?

이 작업을 수행하는 방법과 실제 코드 및 스크린샷을 살펴보기 전에 이러한 아키텍처가 어떻게 구축되는지, 그리고 Couchbase가 어떻게 도입되는지 살펴보겠습니다:

 



이것이 실제로 의미하는 바는 다음과 같습니다:

    • 수집 앱으로 이동합니다:
      1. 외부 API에서 데이터 가져오기
      2. 벡터 임베딩 만들기
      3. 카우치베이스 컬렉션에 데이터 로드
    • 카우치베이스에서 벡터 검색 인덱스 만들기
    • 에 신청할 수 있습니다:
      1. 카우치베이스 데이터에 결과 요청
      2. 벡터 검색 결과를 LLM 프롬프트에 컨텍스트로 추가합니다.
      3. 일관된 결과를 사용자에게 반환

수집 애플리케이션

이 과정이 가장 오래 걸렸고, 다양한 필드와 다양한 형식의 임베딩을 만드는 데 시간을 보냈습니다. 결국 단순화를 위해 제가 수집한 지리 정보만 사용하기로 결정했습니다:

임베딩을 만들기 위해 저는 텍스트 임베딩, 즉 텍스트 표현과 텍스트 표현을 '비교'하는 임베딩을 사용하기로 했습니다. 임베딩 자체에는 약 1500개의 숫자가 포함되어 있습니다(작은 숫자).

코드 자체는 매우 복잡하지는 않지만 시간이 많이 소요될 수 있는데, 5000개의 이벤트에 대한 임베딩 1개를 만드는 데 제 M1 16GB MacBook 프로에서는 약 1시간이 걸렸습니다.

pandas2를 사용하는 전체 코드는 다음에서 확인할 수 있습니다. 리포지토리에 저장합니다.

카우치베이스 수집 및 검색 색인

질문과 외부 API를 기반으로 준비한 결과 간에 유사한 데이터를 검색할 수 있도록 하기 위해 다음과 같이 합니다.

    1. 카우치베이스 컬렉션 만들기
    2. 준비된 데이터를 카우치베이스 컬렉션에 업로드합니다. 임베딩 포함
    3. 벡터 유사성 알고리즘을 선택하여 임베딩 필드에 검색 인덱스를 생성하여 벡터를 비교합니다.

새로운 Couchbase 컬렉션

제 애플리케이션의 경우 호스팅된 Couchbase 서비스인 Capella를 사용하기로 선택했는데, 설정이 매우 쉽습니다. 가입하고 클라우드 서비스를 선택한 다음 새 프로젝트를 만들었습니다.

프로젝트를 클릭하고 데이터 도구 탭으로 이동하면 이제 준비한 데이터에 대한 새 컬렉션을 만들 수 있습니다:

제가 준비한 데이터를 업로드하는 데는 몇 가지 옵션이 있습니다. 파일 크기가 다소 크기 때문에 저는 cbimport 유틸리티를 사용하세요.

제가 선택한 것은 ID 필드를 JSON 문서의 문서로 설정합니다. 를 컬렉션에 추가합니다.

기억하세요 그 전에 먼저 해야 할 일이 있습니다:

    • 최소 쓰기 권한이 있는 데이터베이스 액세스 사용자/비밀번호 만들기
    • 호스트의 호출을 위해 클러스터를 엽니다.
    • 클러스터용 인증서 다운로드

추론된 문서 스키마는 다음을 보여줍니다. 임베딩 필드를 숫자 배열 유형으로 생성한 것으로 간주합니다:

벡터 유사도 검색을 허용하려면 검색 탭으로 이동하여 검색 인덱스를 만들어 보겠습니다.

검색 색인에 대한 임베딩 필드를 당연히 선택해야 하지만 설정해야 할 매개변수가 더 많다는 것을 알 수 있습니다:

유사성 메트릭이 무엇인지 이미 논의했지만, Couchbase는 l2_norm(즉, 유클리드 거리)과 도트 곱을 지원하므로 "도트 제품"를 사용하면 추천 시스템에 더 유용할 수 있습니다.

다음 단계는 질문과 유사하게 벡터가 어두워질 때마다 반환될 문서에서 추가 필드를 선택하는 것입니다:

필드를 하나 이상 추가하지 않으면 반환되는 데이터가 없으므로 애플리케이션이 실패합니다.

인덱스 필드 선택이 완료되었습니다:

프로젝트의 중요한 지점에 도달하여 이제 준비한 데이터에 대해 유사도 검색을 실행할 수 있지만 첫 번째 시도에서 유사도 검색이 작동하지 않을 수 있습니다. 유사도 검색에서 결과를 얻거나 결과를 얻지 못하는 이유를 확인하기 위한 몇 가지 팁을 간략하게 설명하겠습니다:

    • 데이터를 만들 때와 검색을 준비할 때 임베딩 기술이 동일한지 확인하세요.
    • 비교하려는 정보에 대해 간단하고 예측 가능한 형식으로 시작하세요. 예: , ,
    • 임베딩을 생성하는 데이터에 실수로 추가되는 정보가 없는지 확인하세요(예: 줄 바꿈이 있는 경우).
    • 정확히 일치하는 검색이 작동하는지 확인합니다:
      • 임베딩을 생성한 정확한 데이터 검색하기
      • 임베딩 벡터를 비교하여 생성 및 검색 부분에서 동일한 임베딩이 생성되었는지 확인합니다(여기서 디버깅이 유용합니다). 차이가 있는 경우 1-3단계로 돌아가세요.

유사성 검색이 작동하면 점차적으로 필드를 더 추가하고, 형식, 임베딩 및 기타 누락되었다고 생각되는 모든 것을 변경하세요.

임베딩이 변경되면 그 의미를 기억하세요:

    1. 임베딩 다시 만들기
    2. 잘린 컬렉션에 변경 사항 데이터 로드하기
    3. 필요한 경우 검색 색인 변경
    4. 코드 변경이 필요합니다.

이러한 단계는 특히 임베딩 생성에 시간이 많이 소요될 수 있으므로 먼저 시작하는 것이 좋습니다:

    • 문서의 일부
    • 작고 빠른 임베딩 기술

LLM 및 RAG 애플리케이션

애플리케이션이 해야 할 일은 다음과 같습니다:

    1. 사용자 질문과 유사한 결과를 찾도록 Couchbase에 요청하세요.
    2. LLM에 대한 프롬프트 질문에 컨텍스트에 결과를 추가합니다.
    3. LLM에게 질문하기

간단하게 하기 위해 이 코드를 Python에서 Jupyter 노트북으로 만들었는데, 이 노트북은 다음에서 찾을 수 있습니다. 저장소. 이를 위해 다음 라이브러리를 사용했습니다:

    1. 카우치베이스: 내 카펠라 클러스터에 연결 및 인증하기
    2. LangChain대규모 언어 모델(LLM)로 구동되는 애플리케이션을 개발하기 위한 프레임워크입니다:
      1. 임베딩
      2. 카우치베이스를 벡터 저장소로 사용
      3. "OpenAI와 '채팅'
    3. LangGraph: LLM 애플리케이션의 흐름을 생성하기 위한 상태 저장형 멀티 액터 LLM 애플리케이션을 구축하기 위한 프레임워크입니다.

LangChain은 애플리케이션을 작성, 빌드, 배포 및 모니터링할 수 있는 라이브러리 세트이며, 타사 API, 데이터베이스, 웹 검색 등과 같은 다양한 부분을 코드에 통합할 수 있는 많은 에이전트와 확장 기능을 갖추고 있습니다.

최근에는 개발자가 조건, 루프(그래프가 DAG일 필요는 없습니다!), 사용자 상호작용, 그리고 아마도 가장 많이 찾는 기능을 통해 LLM 애플리케이션의 더 복잡한 토폴로지를 구축할 수 있게 해주는 LangChain의 홈에서 LangGraph에 대해서도 배웠습니다: 상태 유지.

코드를 살펴보기 전에 환경 파일(.env)을 살펴보고 어떤 자격 증명과 기타 기밀 데이터가 필요한지 확인해 보겠습니다:

각 그래프 노드의 상태는 다음과 같습니다:

감속기를 정의하지 않으면 각 그래프 노드 간에 상태를 덮어쓰게 되며, 상태 클래스의 메시지 멤버에는 새 메시지를 목록에 추가하는 감속기가 있다는 점에 유의하세요.

카우치베이스에 연결하여 LLM 애플리케이션의 벡터 저장소로 사용하려면, 클러스터에 인증하고 클러스터 연결을 벡터 저장소용 LangChain 객체에 전달합니다:

명심해야 할 두 가지 중요한 세부 사항이 있습니다:

    • 애플리케이션에 임베딩하기 필수 섭취 부분에 사용된 것과 동일해야 합니다.
    • 기본 임베딩 필드 이름은 'embedding'이며, 검색 인덱스에서 해당 필드 이름이 다른 경우 CouchbaseVectorStore 인스턴스화 시 설정해야 합니다(embedding_key).

이제 LangGraph 애플리케이션을 작성하고 Couchbase를 벡터 저장소로 사용할 준비가 되었습니다. 각 그래프에는 노드, 시작점, 방향이 지정된 가장자리가 필요합니다.

그래프는 벡터 스토어에서 데이터를 가져와서 이 정보를 LLM 프롬프트 컨텍스트에 계속 추가합니다.

위 코드에서는 두 개의 노드로 변환됩니다:

    1. 벡터_검색(진입점)
    2. 챗봇(종료 지점)

그림이 천 마디 말보다 중요하기 때문에 다음 코드를 사용하여 그래프를 시각화했습니다:

그 결과 다음과 같은 그림이 완성되었습니다:

langGraph의 더 많은 시각화 옵션은 다음을 참조하세요. LangGraph의 주피터 노트북.

벡터 스토어에 요청한다는 것은 비슷한 위치의 데이터를 검색하는 것을 의미하며, 쿼리 형식이 임베드된 텍스트와 동일하고 결과가 다음 노드에서 사용할 상태에 추가되는 것을 알 수 있습니다.

챗봇 노드는 메시지에서 정보를 가져와서 LLM에 보내는 프롬프트 질문에 포함합니다.

상태는 인메모리 데이터베이스 sqlite에 보관된다는 점에 유의하세요. 그래프를 사용하려면 다음 샘플을 자유롭게 사용하세요:

그리고 아마추어 그룹이 초대를 요청할 수 있는 문화 행사를 추천하는 LLM 애플리케이션을 만들었습니다.

요약

LLM 애플리케이션을 시작하는 것은 흥미진진하고, 제 소견으로는 즉각적인 특성으로 인해 재미있고 흥미진진하며 실행 가능한 램프업이지만, 애플리케이션을 개선하고 더 강력하게 만드는 것은 더 많은 과제를 숨기고 있습니다.

이 글에서는 기술 또는 RAG를 통해 외부 데이터로 우리 모드의 지식을 활용하는 문제와 이를 위해 Couchbase를 활용하는 방법에 대해 집중적으로 설명했습니다.

LLM 애플리케이션이 벡터 검색에서 찾을 수 있는 임베딩을 만들면 첫 번째 시도에서 작동하지 않을 수 있다는 점을 기억하는 것이 중요합니다. 형식이 맞는지 확인하고 간단한 임베딩으로 시작하고 가능한 한 디버깅을 사용하세요.

또한 LLM 애플리케이션에서 복잡한 의사 결정과 흐름을 생성할 수 있는 LangChain의 LangGraph 기능도 시연했습니다.

LLM 애플리케이션과 함께 즐거운 여정을 보내세요.



이 문서 공유하기
받은 편지함에서 카우치베이스 블로그 업데이트 받기
이 필드는 필수 입력 사항입니다.

Author

Posted by 시갈 샤하라바니 - 기술 리더, Tikal

저는 티칼의 기술 리더이자 그룹 리더로서 백엔드 및 데이터 시스템에 대한 열정을 가지고 있습니다. 여가 시간에는 수영과 이스라엘 민속 춤을 즐깁니다.

댓글 남기기

카우치베이스 카펠라를 시작할 준비가 되셨나요?

구축 시작

개발자 포털에서 NoSQL을 살펴보고, 리소스를 찾아보고, 튜토리얼을 시작하세요.

카펠라 무료 사용

클릭 몇 번으로 Couchbase를 직접 체험해 보세요. Capella DBaaS는 가장 쉽고 빠르게 시작할 수 있는 방법입니다.

연락하기

카우치베이스 제품에 대해 자세히 알고 싶으신가요? 저희가 도와드리겠습니다.