선물(직업 등)
Thomas는 2024년 4월 베스파에 수석 소프트웨어 엔지니어로 입사했습니다. AI 컨설턴트로 근무하기 전에는 실제로 Vespa의 기술을 기반으로 대규모 PDF 컬렉션을 구축했습니다. RAG 애플리케이션.
PDF는 기업 세계에서 어디에나 존재하며, PDF에서 정보를 검색하고 검색하는 기능은 일반적인 사용 사례입니다. 문제는 많은 PDF가 일반적으로 다음 범주 중 하나 이상에 속한다는 것입니다:
- 스캔 문서이기 때문에 텍스트를 쉽게 추출할 수 없기 때문에 OCR을 사용해야 하며, 이는 복잡성을 더합니다.
- 여기에는 텍스트 추출이 가능하더라도 쉽게 검색할 수 없는 많은 수의 차트, 표, 다이어그램이 포함되어 있습니다.
- 여기에는 때때로 귀중한 정보가 포함된 많은 이미지가 포함되어 있습니다.
다음 용어에 유의하세요. 콜팔리 두 가지 의미가 있습니다:
- 특히 모델링 및 관련 논문 또는 논문 토론(이전) VLM(PaliGemma) 상에서 LoRa 어댑터를 학습시켜 '사후 상호작용'을 위한 공동 텍스트 및 이미지 임베딩(이미지의 각 패치당 하나의 임베딩)을 생성합니다. 콜버트 시각적 언어 모델을 확장하는 방법.
- 또한 시각적 문서 검색을 나타냅니다. 오리엔테이션 의 기능을 효율적인 포스트 인터랙션 메커니즘과 결합했습니다. 이 방향은 원본 논문의 특정 모델에 국한된 것이 아니라 ColQwen2를 사용하자는 제안이나 Vespa의 VLM과 같은 다른 VLM에도 적용될 수 있습니다. 노트북 .
이 블로그 게시물에서는 콜팔리 임베드를 사용하여 베스파에서 시각적 RAG를 보여주는 실시간 데모 애플리케이션을 구축하는 방법에 대해 자세히 알아보겠습니다. 애플리케이션의 아키텍처, 사용자 경험, 애플리케이션 구축에 사용된 기술 스택에 대해 설명합니다.
다음은 데모 앱의 스크린샷입니다:
첫 번째 예는 일반적인 쿼리는 아니지만 특정 유형의 쿼리에 대한 시각적 검색의 힘을 보여줍니다. 이는 "보이는 대로 검색(WYSIWYS)" 패러다임의 좋은 예입니다.
유사성 매핑은 가장 유사한 섹션을 강조 표시하여 사용자가 페이지의 어느 부분이 검색어와 가장 관련이 있는지 쉽게 확인할 수 있도록 합니다.


PDF를 검색 가능하게 만드는 데 따르는 어려움을 직접 경험한 Thomas는 특히 시각 언어 모델링(VLM) 분야의 최신 개발에 관심이 많습니다.
콜팔리에 대한 이전 게시물을 읽은 후 베스파 블로그 게시물 와의 협업 조 버검 일련의 심도 있는 토론 끝에 그는 영감을 받아 Vespa를 사용하여 시각적 RAG 애플리케이션을 구축하는 프로젝트를 제안했습니다.
베스파에서는 직원들이 각 반복 주기에 수행하고자 하는 업무 프로그램을 제안할 수 있는 기회가 있습니다. 제안된 업무가 회사의 목표와 부합하고 다른 긴급한 우선순위가 없다면 바로 시작할 수 있습니다. 컨설팅 업계 출신인 Thomas에게 이러한 자율성은 신선한 바람을 불러일으킵니다.
TL;DR
우리는 실시간 데모 애플리케이션이 문서에서는 Vespa와 Python에서 FastHTML만 사용하여 ColPali 임베딩을 사용하여 PDF 기반 Visual RAG를 구현하는 방법을 설명합니다.
복제 코드도 제공합니다:
- 실행 가능한 노트북Visual RAG를 구현하기 위해 나만의 Vespa 애플리케이션을 설정하는 데 사용됩니다.
- FastHTML 애플리케이션 코드를 사용하여 베스파 애플리케이션과 상호 작용하는 웹 애플리케이션을 설정할 수 있습니다.
프로젝트 목표
이 프로젝트에는 두 가지 주요 목표가 있습니다:
1. 실시간 데모 구축
개발자는 터미널 JSON 출력을 UI로 사용하는 데모에 만족할 수 있지만, 사실 대부분의 사람들은 웹 인터페이스를 선호합니다.
이를 통해 법률, 금융, 건설, 학술, 의료 등 다양한 영역과 사용 사례에 적합한 ColPali 임베딩을 기반으로 한 Vespa의 PDF Visual RAG를 시연할 수 있습니다.
앞으로 이 기능이 중요해질 것이라고 확신하지만, 아직 이를 입증하는 실제 애플리케이션을 보지 못했습니다.
동시에 효율성, 확장성, 사용자 경험 측면에서 많은 귀중한 인사이트를 얻을 수 있었습니다. 또한 좋은 사용자 경험을 제공할 만큼 충분히 빠른지 궁금하기도 하고 약간 긴장되기도 했습니다.
예를 들어, 베스파의 유용한 기능 몇 가지를 강조하고 싶었습니다:
- 단계별 정렬
- 키워드 연관성 제안
- 다중 벡터 MaxSim 계산
2. 오픈 소스 템플릿 만들기
다른 사람들이 자신만의 Visual RAG 애플리케이션을 구축할 수 있도록 템플릿을 제공하고자 합니다.
다른 템플릿은 이 템플릿으로 충분합니다.더 단순하게특정 프로그래밍 언어나 프레임워크를 많이 익힐 필요가 없습니다.
데이터 집합 만들기
데모에서는 이미지, 표, 차트의 형태로 중요한 정보가 많이 포함된 PDF 문서 데이터 세트를 사용하고자 했습니다. 또한 모든 이미지를 VLM에 직접 업로드하는 것이 불가능하다는 것을 입증하기 위해 충분한 크기의 데이터 세트가 필요했습니다(검색 단계 생략).
활용 gemini-1.5-flash-8b
현재 최대 입력 이미지 수는 3600개입니다.
저희의 요구 사항을 충족하는 공개 데이터 세트가 없었기 때문에 자체 데이터 세트를 만들기로 결정했습니다.
자랑스러운 노르웨이 국민으로서 노르웨이 정부 글로벌 연금 기금(GPFG, 석유 기금이라고도 함)이 2000년부터 연례 보고서와 거버넌스 문서를 웹사이트에 게시하고 있다는 사실을 알게 되어 매우 기뻤습니다. 웹사이트에는 저작권에 대한 언급이 없으며 최근의표현는 세계에서 가장 투명한 펀드라는 것을 입증했기 때문에 이 데이터를 실증 목적으로 사용할 수 있다고 확신합니다.
이 데이터 세트에는 2000년부터 2024년까지 총 6992페이지에 달하는 116개의 다양한 PDF 보고서가 포함되어 있습니다.
이미지, 텍스트, URL, 페이지 번호, 생성된 질문, 쿼리 및 ColPali 임베딩을 포함하는 데이터 세트는 이제 다음과 같이 게시됩니다. 다음은 다음과 같습니다..

합성 쿼리 및 질문 생성
또한 각 페이지에 대한 합성 쿼리와 질문도 생성합니다. 이는 두 가지 용도로 사용할 수 있습니다:
- 사용자가 입력할 때 검색창에 키워드 연관성 제안을 제공합니다.
- 평가 목적.
질문과 쿼리를 생성하는 데 사용하는 힌트는 다음에서 제공됩니다. 다니엘 반 스트라이언의 이 멋진 블로그 게시물.
您是一名投资者、股票分析师和金融专家。接下来您将看到挪威政府全球养老基金(GPFG)发布的报告页面图像。该报告可能是年度或季度报告,或关于责任投资、风险等主题的政策报告。
您的任务是生成检索查询和问题,这些查询和问题可以用于在大型文档库中检索此文档(或基于该文档提出问题)。
请生成三种不同类型的检索查询和问题。
检索查询是基于关键词的查询,由 2-5 个单词组成,用于在搜索引擎中找到该文档。
问题是自然语言问题,文档中包含该问题的答案。
查询类型如下:
1. 广泛主题查询:覆盖文档的主要主题。
2. 具体细节查询:涵盖文档的某个具体细节或方面。
3. 可视元素查询:涵盖文档中的某个可视元素,例如图表、图形或图像。
重要指南:
- 确保查询与检索任务相关,而不仅仅是描述页面内容。
- 使用基于事实的自然语言风格来书写问题。
- 设计查询时,以有人在大型文档库中搜索此文档为前提。
- 查询应多样化,代表不同的搜索策略。
将您的回答格式化为如下结构的 JSON 对象:
{
"broad_topical_question": "2019 年的责任投资政策是什么?",
"broad_topical_query": "2019 责任投资政策",
"specific_detail_question": "可再生能源的投资比例是多少?",
"specific_detail_query": "可再生能源投资比例",
"visual_element_question": "总持有价值的时间趋势如何?",
"visual_element_query": "总持有价值趋势"
}
如果没有相关的可视元素,请在可视元素问题和查询中提供空字符串。
以下是需要分析的文档图像:
请基于此图像生成查询,并以指定的 JSON 格式提供响应。
只返回 JSON,不返回任何额外说明文本。
당사는 다음을 사용합니다. gemini-1.5-flash-8b
질문과 쿼리를 생성합니다.
다음 사항에 유의하십시오.
처음 실행했을 때 매우 긴 문제가 생성되는 것을 발견하여 세대 구성 추가 maxOutputTokens=500
매우 유용합니다.
또한 생성된 질문과 쿼리에서 '문자열'이 질문에 여러 번 나타나는 등 몇 가지 이상한 점이 발견되었습니다. 생성된 질문과 쿼리에 대해 보다 심층적인 검증을 실시할 계획입니다.
전체적으로 파이썬 사용
우리의 타겟 고객은 성장하는 데이터 과학 및 AI 커뮤니티입니다. 이 커뮤니티는 깃허브에서 Python에 가장 큰 기여를 하는 커뮤니티 중 하나가 될 가능성이 높습니다. 옥토버스 상태 보고서가장 인기 있고 가장 빠르게 성장하는 프로그래밍 언어로 꼽히는 주된 이유 중 하나는 세계에서 가장 인기 있는 프로그래밍 언어 중 하나이기 때문입니다.
쿼리 임베디드 추론을 위해 백엔드에서 Python을 사용해야 합니다( 콜팔리 엔진-도서관), 베스파가 기본적으로 지원되기 전까지는 ColpaliEmbedder
(개발 중, 참조 깃허브 이슈). 프런트엔드에 다른 언어(및 해당 프레임워크)를 사용하면 프로젝트의 복잡성이 증가하여 다른 사람이 애플리케이션을 재현하기가 더 어려워집니다.
그래서 전체 애플리케이션을 Python으로 빌드하기로 결정했습니다.
프런트엔드 프레임워크 선택
스트림라이트 및 그라디오
저희는 Gradio와 Streamlit을 사용하여 간단한 PoC(개념 증명)를 구축하는 것이 매우 쉽다는 것을 인정하며, 과거에도 이러한 목적으로 이를 사용했습니다. 하지만 이 두 가지를 사용하지 않기로 결정한 이유는 크게 두 가지입니다:
- 프로덕션 환경에서 사용할 수 있는 전문가 수준의 UI가 필요했습니다.
- 좋은 성능이 필요합니다. 몇 초를 기다리거나 UI가 간헐적으로 멈추는 것만으로는 우리가 제시하려는 애플리케이션에 충분하지 않습니다.
운동을 좋아하는 만큼, 스트림릿 화면의 오른쪽 상단에 표시되는 '실행 중' 메시지가 마음에 들지 않습니다.

FastHTML을 구출하다
그렇습니다. answer.ai 충성도 높은 팬들의 마음을 사로잡았습니다. 그래서 올해 초에 출시했을 때 FastHTML3그렇다면 기꺼이 사용해 보겠습니다.
FastHTML은 순수 파이썬을 사용하여 최신 웹 애플리케이션을 구축하기 위한 프레임워크입니다. 이 프레임워크의 비전(미래)::
FastHTML은 범용 풀스택 웹 프로그래밍 시스템으로, 장고, NextJS, 루비 온 레일즈와 같은 범주에 속합니다. 빠른 프로토타입을 만드는 가장 쉬운 방법이자 확장 가능하고 강력하며 풍부한 애플리케이션을 만드는 가장 쉬운 방법이라는 비전을 가지고 있습니다.
FastHTML은 기본 스타렛 노래로 응답 uvicorn.
다음이 함께 제공됩니다. Pico CSS 를 사용했습니다. 팀의 숙련된 웹 개발자인 레안드로는 최근에 발견한 테일윈드 CSS를 사용해보고 싶어 했습니다. shad4fast우리는 FastHTML과 SHADCN/UI 의 아름다운 UI 구성 요소는
Pyvespa
베스파 파이썬 클라이언트 pyvespa 과거에는 주로 베스파 애플리케이션 프로토타이핑에 사용되었습니다. 하지만 최근에는 파이브스파를 통해 Vespa 기능을 더 많이 지원하기 위해 노력해 왔습니다. 이제 프로덕션 배포가 지원되며 pyvespa를 통한 Vespa의 고급 구성이 추가되었습니다! services.xml
함수를 사용할 수 있습니다. 자세한 내용은 다음을 참조하세요. 이 노트북의 예시 및 세부 정보
따라서 사용자 정의 Java 컴포넌트가 필요하지 않은 대부분의 베스파 애플리케이션은 파이브스파로 빌드할 수 있습니다.
일화:
파이브스파의 고급 설정 기능은 실제로 FastHTML이 다음과 같은 사실에 영향을 받습니다. ft
-는 컴포넌트를 래핑하고 HTML 태그로 변환하는 방식에서 영감을 얻었습니다. 파이브스파에는 vt
-컴포넌트는 유사한 작업을 수행하여 베스파로 변환합니다. services.xml
Tags. 이에 관심이 있는 독자는 다음을 확인할 수 있습니다. 이 PR 자세히 알아보세요. 이 접근 방식은 지원되는 모든 태그에 대해 사용자 지정 클래스를 구현하는 것에 비해 많은 작업을 절약할 수 있습니다.
또한 파이브스파를 사용하여 베스파 애플리케이션을 구축하는 과정을 통해 실제 검증을 수행할 수 있었습니다.
소프트웨어
Vespa를 기본적으로 지원하는 콜팔리 임베더로서, 여전히 WIP 상태에서는 추론을 완료하는 데 GPU가 필요하다는 것을 알고 있습니다. Colab에서의 실험 결과, T4 인스턴스로 충분하다는 결론을 내렸습니다.
데이터 세트의 PDF 페이지를 Vespa에 임베드하기 전에 임베딩을 생성하기 위해 서버리스 GPU 제공업체(모달 (우리가 가장 좋아하는 것 중 하나). 하지만 데이터 세트의 페이지 수가 6,692페이지에 불과하기 때문에 Macbook M2 Pro를 사용하여 5~6시간 동안 임베드를 만들었습니다.
신탁 관리
여기에는 많은 옵션이 있습니다. AWS, GCP 또는 Azure와 같은 기존 클라우드 제공업체를 사용할 수도 있지만, 인프라를 설정하고 관리하는 데 더 많은 노력이 필요하고 다른 사람이 애플리케이션을 복제하기가 더 어려워집니다.
우리는 다음과 같은 사실을 배웠습니다. 얼굴 공간 안아주기 필요에 따라 GPU를 추가할 수 있는 호스팅 서비스를 제공합니다. 또한 다른 사람이 애플리케이션을 매우 쉽게 복사할 수 있는 원클릭 '이 공간 복제' 버튼을 제공합니다.
다음을 발견했습니다. answer.ai 를 생성합니다. 재사용 가능한 라이브러리를 사용하여 허깅 페이스 스페이스에 FastHTML 애플리케이션을 배포할 수 있습니다. 그러나 추가 조사 결과, 이 접근 방식은 Docker SDK를 사용하여 스페이스를 조작하며 실제로 더 간단한 방법이 있다는 것을 발견했습니다.
다음을 사용하여 사용자 정의 파이썬 스페이스.
ground 허깅페이스 허브 문서::
공식 워크플로는 아니지만, Gradio를 SDK로 선택하고 포트 7860에서 프런트엔드 인터페이스를 제공하면 스페이스에서 자체 Python + 인터페이스 스택을 실행할 수 있습니다.
일화 2: 문서에 서비스가 제공되는 포트가 다음과 같다는 오타가 있습니다. 7680
. 다행히도 올바른 포트가 다음과 같아야 한다는 것을 알아내는 데 오래 걸리지 않았습니다. 7860
를 제출하고 PR의 CTO인 줄리앙 쇼몽이 버그를 수정했습니다. 체크리스트 작업이 완료되었습니다!
시각 언어 모델
Visual RAG의 '생성' 부분에서는 Vespa에서 얻은 상위 k등급 문서를 기반으로 응답을 생성하기 위해 시각적 언어 모델(VLM)이 필요합니다.
베스파 네이티브 지원 LLM(대규모 언어 모델)을 외부 또는 내부적으로 통합할 수 있지만, VLM(시각 언어 모델)은 아직 베스파에서 기본적으로 지원되지 않습니다.
작년에 OpenAI, Anthropic, Google이 모두 우수한 시각 언어 모델(VLM)을 출시하면서 이 분야는 빠르게 성장하고 있습니다. 성능상의 이유로 Google은 더 작은 모델을 선택하고자 했습니다. 쌍둥이자리 API는 최근 개발자 경험을 개선하기 위해 다음과 같이 사용하기로 결정했습니다. gemini-1.5-flash-8b
.
물론 프로덕션 환경에서 모델을 선택하기 전에 다양한 모델을 정량적으로 평가하는 것이 좋지만, 이는 이 프로젝트의 범위를 벗어납니다.
빌드
기술 스택이 준비되면 애플리케이션 구축을 시작할 수 있습니다. 애플리케이션의 높은 수준의 아키텍처는 다음과 같습니다:

베스파 애플리케이션
Vespa 애플리케이션의 주요 구성 요소는 다음과 같습니다:
- 필드 및 유형이 포함된 문서 스키마 정의.
- 순위 프로필 정의.
- an
services.xml
구성 파일입니다.
모두 다요. 가능 파이브파를 사용하여 파이썬에서 정의하지만, 생성된 구성 파일을 확인하는 것도 권장합니다. app.package.to_files()
를 구현해야 합니다. 자세한 내용은 다음을 참조하세요. 파이브파 문서.
랭킹 구성
베스파의 가장 과소평가된 기능 중 하나는 단계별 순위 함수를 사용합니다. 콘텐츠 노드(1단계 및 2단계) 또는 컨테이너 노드에서 실행할 수 있는 서로 다른(또는 상속된) 순위 단계를 포함할 수 있는 여러 순위 프로필을 정의할 수 있습니다(글로벌 무대).
이를 통해 다양한 사용 사례를 개별적으로 처리하고 각 상황에 맞는 지연 시간, 비용, 품질 간의 이상적인 균형을 찾을 수 있습니다.
컴퓨팅을 데이터 측면으로 이동하는 아키텍처의 반전에 대해 CEO인 Jon Bratseth가 말하는 내용을 읽어보세요. 이 블로그 게시물.
이 애플리케이션의 경우 3가지 다른 순위 구성을 정의했습니다:
다음 사항에 유의하십시오. 검색(데이터)이 단계는 쿼리를 다음 단계로 전달하는 것입니다. yql 지정하고순위 전략는 순위 구성 파일(배포 시 제공되는 애플리케이션 패키지의 일부)에 지정됩니다.
1. 퓨어 콜팔리
애플리케이션에서 이 랭킹 모드에 사용되는 yql은 다음과 같습니다:
select title, text from pdf_page where targetHits:{100}nearestNeighbor(embedding,rq{i}) OR targetHits:{100}nearestNeighbor(embedding,rq{i+1}) .. targetHits:{100}nearestNeighbor(embedding,rq{n}) OR userQuery();
또한 다음을 수행합니다. hnsw.exploreAdditionalHits
검색 단계에서 관련 검색어가 누락되지 않도록 매개변수를 300으로 조정합니다. 이 경우 성능 비용이 발생한다는 점에 유의하세요.
여기에는 다음이 포함됩니다. rq{i}
는 쿼리의 i 번째입니다. 토큰 (HTTP 요청에 파라미터로 제공해야 함)를 입력해야 합니다.n
은 검색할 쿼리 토큰의 최대 개수입니다(이 애플리케이션에서는 64개를 사용합니다).
이 순위 구성은 max_sim_binary
베스파의 최적화된 해밍 거리 계산 기능을 활용하는 랭킹 표현식(자세한 내용은 다음을 참조하세요. 수십억 규모로 ColPali 확장. 이것은 랭킹의 첫 번째 단계에서 사용되며 상위 100개의 경기는 ColPali 임베딩의 전체 부동소수점 표현을 사용하여 다시 랭킹이 매겨집니다.
2. 순수 텍스트 기반 순위(BM25)
이 경우, 저희는 오직 weakAnd
문서를 검색합니다.
select title, text from pdf_page where userQuery();
랭킹 단계에서는 다음을 사용합니다. bm25 1단계 랭킹을 실시합니다(2단계 없음).
최적의 성능을 위해 텍스트 기반과 시각 기반 랭킹 기능을 함께 사용하는 것이 좋습니다(예를 들어 상호 순위 통합), 하지만 이 데모에서는 최적의 조합을 찾기보다는 두 조합의 차이점을 보여드리고자 합니다.
3. BM25 + ColPali 혼합
검색 단계에서는 순수한 ColPali 순위 구성과 동일한 yql을 사용합니다.
일부 쿼리, 특히 짧은 쿼리의 경우 순수 콜팔리는 텍스트가 없는 페이지(이미지만)를 많이 일치시킨 반면, 우리가 찾고 있던 답변의 대부분은 실제로 텍스트가 있는 페이지에 표시되는 것을 발견했습니다.
이 문제를 해결하기 위해 BM25 점수와 ColPali 점수를 결합하는 2단계 순위 표현식을 추가하여 두 점수의 선형 조합을 사용했습니다(max_sim + 2 * (bm25(title) + bm25(text))
).
이 방법은 간단한 휴리스틱을 기반으로 하지만 순위 실험을 수행하여 다양한 기능에 대한 최적의 가중치를 찾는 것이 더 유리할 수 있습니다.
베스파의 조각 생성
검색 프런트엔드에서는 소스 텍스트에서 특정 단어가 포함된 발췌문을 포함시키는 것이 일반적입니다. 굵게(서체) (강조 표시) 표시.

문맥에서 일치하는 쿼리 용어의 스니펫을 표시하면 사용자는 검색 결과가 자신의 정보 요구를 충족시킬 가능성이 있는지 빠르게 판단할 수 있습니다.
베스파에서는 이 기능을 '동적 스니펫'이라고 하며, 주변 문맥을 얼마나 포함할지, 일치하는 단어를 강조 표시하는 데 사용되는 레이블 등 다양한 매개변수를 조정할 수 있습니다.
이 데모에서는 비교를 위해 페이지의 스니펫과 추출된 전체 텍스트를 모두 보여드립니다.
결과의 시각적 노이즈를 줄이기 위해 사용자 쿼리에서 중단어(and, in, the 등)를 제거하여 강조 표시되지 않도록 했습니다.
Vespa의 쿼리 권장 사항
검색에서 흔히 볼 수 있는 기능은 사용자가 입력할 때 표시되는 '검색 제안'입니다.
실제 사용자 쿼리는 종종 미리 계산된 결과를 제공하는 데 사용되지만 여기서는 분석할 사용자 트래픽이 없습니다.

이 예에서는 PDF 페이지에서 생성된 관련 질문에 사용자가 입력한 접두사를 일치시키는 간단한 하위 문자열 검색을 사용하여 제안을 제공합니다.
이러한 제안을 얻기 위해 사용하는 yql 쿼리는 다음과 같습니다:
select questions from pdf_page where questions matches (".*{query}.*")
이 접근 방식의 한 가지 장점은 권장 사항에 표시되는 모든 질문에 대해 사용 가능한 데이터에서 답변을 확인할 수 있다는 것입니다!
정렬 구성에서 사용자 쿼리와 문서 생성 질문 간의 유사성 메트릭을 추가하여 제안된 질문을 생성하는 페이지가 항상 상위 3개의 응답에 표시되도록 할 수도 있었지만, 이는 ColPali 모델의 기능을 보여주는 관점에서 볼 때 약간의 '치트'가 될 수 있었습니다.
사용자 경험
저희는 운이 좋게도 조 버검 그는 우리에게서 훌륭한 UX 피드백을 받았습니다. 그는 우리에게 "빠르고 유동적인" UX를 만들라고 독려했습니다. 사람들은 Google에 익숙하기 때문에 검색(및 RAG)의 사용자 경험에서 속도가 중요하다는 것은 의심의 여지가 없습니다. 많은 사람들이 응답을 기다리는 데 5~10초만 기다려도 만족하는 것처럼 보이는 AI 커뮤니티에서는 여전히 속도가 다소 과소평가되고 있는 부분입니다. 그리고 저희는 밀리초 단위의 응답 시간을 달성하고자 합니다.
그의 피드백에 따라, 결과를 표시하기 전에 베스파에서 전체 이미지와 유사도 매핑 텐서가 반환될 때까지 기다리지 않도록 단계별 요청 프로세스를 설정해야 합니다.
해결책은 먼저 결과에서 가장 중요한 데이터만 추출하는 것입니다. 저희의 경우, 이는 title
및url
및text
및page_no
와 초기 검색 결과 표시를 위한 축소(흐리게 처리된) 버전의 이미지(32x32픽셀)를 선택할 수 있습니다. 이렇게 하면 결과를 즉시 표시하고 백그라운드에서 전체 이미지와 유사도 매핑을 계속 로드할 수 있습니다.
전체 UX 프로세스는 아래와 같습니다:
지연의 주요 원인은 다음과 같습니다:
- ColPali 임베딩 생성을 위한 추론 시간(쿼리의 토큰 수에 따라 GPU에서 수행됨)
- 그래서 저희는
@lru_cache
데코레이터를 사용하여 동일한 쿼리에 대해 임베딩을 여러 번 다시 계산하지 않도록 합니다.
- 그래서 저희는
- 페이스 스페이스와 베스파 간의 네트워크 지연 시간 허깅(TCP 핸드셰이크 포함)
- 전체 이미지를 전송하는 데 걸리는 시간도 상당합니다(이미지당 약 0.5MB).
- 유사도 매핑 텐서의 크기가 더 큽니다(
n_query_tokens
xn_images
(x 1030 패치 x 128).
- 유사도 매핑 하이브리드 이미지를 만드는 것은 CPU를 많이 사용하는 작업이지만, 이 작업은
fastcore
(명목식 형태로 사용됨)@threaded
데코레이터는 각 이미지가 해당 엔드포인트를 폴링하여 유사성 매핑이 준비되었는지 확인하는 멀티스레드 백그라운드 작업에서 수행됩니다.
스트레스 테스트
트래픽이 급증하는 동안 애플리케이션의 성능이 걱정되어 간단한 스트레스 테스트 실험을 진행했습니다. 실험은 브라우저 개발 도구를 사용하여 요청을 전송하는 방식으로 진행되었습니다. /fetch_results
cURL 명령이 복사되어(캐싱이 활성화되지 않은 상태에서) 10개의 병렬 터미널에서 반복적으로 실행되었습니다. (이 시점에서는 @lru_cache
데코레이터)
결국
매우 기본적인 테스트였지만, 첫 번째 테스트에서 검색 처리량의 병목 현상은 Huggingface 공간의 GPU에서 ColPali 임베딩을 계산하는 것이었지만, Vespa 백엔드는 매우 낮은 리소스 사용량으로 초당 20개 이상의 쿼리를 쉽게 처리할 수 있었습니다. 저희는 이 정도면 데모용으로 충분하다고 생각합니다. 만약 확장이 필요하다면, 첫 번째 단계는 Huggingface 공간에 더 큰 GPU 인스턴스를 활성화하는 것입니다.
다음 차트에서 볼 수 있듯이 Vespa 애플리케이션은 부하가 걸린 상태에서도 잘 작동합니다.


FastHTML 사용에 대한 고찰
FastHTML을 사용하면 프론트엔드 개발과 백엔드 개발 사이의 장벽이 허물어진다는 점이 가장 큰 장점입니다. 코드가 긴밀하게 통합되어 있어 우리 모두가 애플리케이션의 모든 부분을 이해하고 기여할 수 있습니다. 이 점을 과소평가해서는 안 됩니다.
브라우저의 개발 도구를 사용하여 프런트엔드 코드를 검사하고 실제로 대부분의 코드를 보고 이해할 수 있어서 정말 즐거웠습니다.
독립형 프런트엔드 프레임워크를 사용할 때보다 개발 및 배포 프로세스가 크게 간소화됩니다.
이를 통해 다음을 사용할 수 있습니다. uv 관리 소유권 종속성을 추가하여 파이썬에서 종속성을 처리하는 방식을 크게 변경했습니다.
토마스의 견해:
데이터 과학 및 AI 배경을 가진 개발자로서 Python을 선호하지만 여러 JS 프레임워크로 작업해 본 경험은 매우 긍정적이었습니다. 프로젝트에 너무 많은 복잡성을 추가하지 않고도 프런트엔드 관련 작업에 더 잘 참여할 수 있었습니다. 애플리케이션의 모든 부분을 이해할 수 있어서 정말 즐거웠습니다.
안드레아스의 모습:
저는 오랫동안 Vespa에서 일해왔지만 Python이나 프론트엔드 개발은 많이 해본 적이 없습니다. 처음 하루나 이틀은 조금 부담스러웠지만, 풀 스택에서 작업하고 거의 실시간으로 변경 효과를 확인할 수 있다는 사실이 정말 신기했습니다! 빅 언어 모델의 도움으로 낯선 환경에 쉽게 진입할 수 있었어요. Vespa 내에서 텐서 표현식(벡터가 이미 메모리에 저장되어 있음)을 통해 이미지 패치의 유사도를 계산하고 검색 결과와 함께 반환함으로써 훨씬 낮은 지연 시간과 리소스 소비로 유사도 매핑을 생성할 수 있다는 점이 정말 마음에 들었습니다.
레안드로의 견해:
리액트, 자바스크립트, 타입스크립트, HTML, CSS를 사용하는 웹 개발의 탄탄한 기초를 갖춘 개발자로서 FastHTML로 전환하는 것은 비교적 간단했습니다. 프레임워크의 직접 HTML 요소 매핑은 제가 기존에 알고 있던 지식과 매우 일치했기 때문에 학습 곡선을 줄일 수 있었습니다. 가장 큰 어려움은 표준 HTML/JS 구조와 다른 FastHTML의 Python 기반 구문에 적응하는 것이었습니다.
비주얼 기술이 필요한 전부인가요?
저희는 비전 언어 모델(VLM)의 토큰 수준 후기 상호작용 임베딩을 활용하는 것이 특정 유형의 쿼리에 매우 강력하다는 것을 확인했지만, 이를 만능 솔루션이라기보다는 툴박스에서 매우 유용한 도구에 가깝다고 보고 있습니다.
콜팔리 외에도 지난 한 해 동안 시각적 검색 분야에서 다른 혁신이 있었습니다. 특히 흥미로운 두 가지 접근 방식이 있습니다:
- 문서 스크린샷 임베딩(DSE)5 - 문서 스크린샷을 위한 고밀도 임베딩을 생성하고 이러한 임베딩을 검색에 사용하기 위한 이중 인코더 모델입니다.
- IBM 도클링 - 여러 유형의 문서(예: PDF, PPT, DOCX 등)를 마크다운으로 구문 분석하기 위한 라이브러리로, OCR을 사용하지 않고 대신 컴퓨터 비전 모델을 사용합니다.
베스파는 이러한 접근 방식의 조합을 지원하며 개발자가 특정 사용 사례에 대해 지연 시간, 비용 및 품질 간에 가장 매력적인 균형을 찾을 수 있도록 합니다.
Docling 또는 이와 유사한 도구를 사용한 고품질 텍스트 추출, 문서 스크린샷 임베딩을 사용한 집중 검색, 텍스트 기능 및 콜팔리와 유사한 모델링을 통한 집중 검색을 결합한 애플리케이션을 상상해 볼 수 있습니다. MaxSim
점수가 정렬됩니다. 정말 성능을 개선하고 싶다면 이러한 모든 기능을 다음과 같은 기능과 결합할 수도 있습니다. XGBoost 어쩌면 LightGBM GBDT 모델의 조합은
따라서 ColPali는 텍스트에서 추출하기 어려운 정보를 검색 가능하게 만드는 강력한 도구이지만 만병통치약은 아니며 최적의 성능을 얻으려면 다른 접근 방식과 함께 사용해야 합니다.
누락된 링크
모델링은 일시적인 반면 평가는 영구적입니다.
자동화된 평가를 추가하는 것은 이 데모의 범위를 벗어나지만, 자체 사용 사례에 맞는 평가 데이터 세트를 만드는 것이 좋습니다. LLM-as-a-judge를 사용하여 부트스트랩할 수 있습니다(이 문서 참조). 블로그 게시물제공하는 방법에 대해 자세히 알아보기 search.vespa.ai (이 사실을 깨달았습니다).
베스파는 조정 가능한 다양한 파라미터를 제공하며, 다양한 실험에 대한 정량적 피드백을 제공함으로써 특정 사용 사례에 가장 적합한 절충점을 찾을 수 있습니다.
평결에 도달하기
콜팔리 임베딩을 사용하여 Vespa에서 PDF의 시각적 RAG 검색을 수행하는 방법을 보여주는 라이브 데모 애플리케이션을 구축했습니다.
여기까지 읽으셨다면 코드에 관심이 있으실 것입니다. 코드는 여기(문학) 앱 코드를 찾습니다.
이제 나만의 비주얼 RAG 앱을 만들어 보세요!
시각적 검색, 콜팔리 또는 베스파에 대해 더 자세히 알고 싶으신 분들은 언제든지 참여하세요! 베스파의 슬랙 커뮤니티 질문하거나 커뮤니티에 도움을 요청하거나 베스파의 최신 개발에 대해 알아보세요.
일반적인 문제
ColPali를 사용하려면 추론에 GPU를 사용해야 하나요?
현재 합리적인 시간 내에 쿼리를 추론하기 위해서는 GPU를 사용해야 합니다.
향후에는 ColPali-류 모델의 품질과 효율성(예: 더 작은 임베딩)이 향상될 것이며, answer.ai의 answerai-colbert-small-v1콜버트 모델은 최초로 개발된 모델로, 기존 콜버트 모델의 3분의 1도 안 되는 크기임에도 불구하고 성능은 오리지널 콜버트 모델보다 뛰어납니다.
참고 항목 베스파 블로그 베스파의 사용 방법에 대해 자세히 알아보기 answerai-colbert-small-v1
.
콜팔리를 베스파의 쿼리 필터와 함께 사용할 수 있나요?
Can. 이 애플리케이션에서는 이 페이지를 published_year
필드를 사용할 수 있지만 필터 옵션으로서의 기능은 아직 프런트엔드에서 구현되지 않았습니다.
베스파는 언제부터 콜팔리 임베드를 지원하나요?
참고 항목 이 GitHub 이슈.
수십억 개의 문서로 확장할 수 있나요?
예. Vespa는 수평적 확장을 지원하며 특정 사용 사례에 맞게 지연 시간, 비용, 품질 간의 균형을 조정할 수 있습니다.
이 데모를 ColQwen2를 지원하도록 조정할 수 있나요?
가능하지만 유사도 맵 계산에 약간의 차이가 있습니다.
참고 항목 이 노트북 시작점으로.
내 데이터로 이 데모를 실행할 수 있나요?
물론입니다! 제공된 노트북 데이터를 가리키며 시각적 RAG를 위한 나만의 베스파 애플리케이션을 설정할 수 있습니다. 제공된 웹 애플리케이션을 자체 프런트엔드의 시작점으로 사용할 수도 있습니다.
참고 문헌
© 저작권 정책
기사 저작권 AI 공유 서클 모두 무단 복제하지 마세요.
관련 문서
댓글 없음...