Discourse AI - 임베딩

:bookmark: 이 주제는 Discourse AI 플러그인의 임베딩(Embeddings) 모듈 구성에 대해 다룹니다. 임베딩이 무엇인지, 어떻게 사용되는지, 그리고 어떻게 설정하는지 설명합니다.

:person_raising_hand: 필요한 사용자 권한: 관리자

임베딩은 관련 주제 및 AI 검색과 같은 기능을 가능하게 하는 Discourse AI 플러그인의 핵심 구성 요소입니다. 이 가이드에서는 Discourse 인스턴스에서 임베딩을 설정하고 사용하는 방법을 안내합니다.

임베딩이란?

임베딩은 의미론적 의미를 포착하는 텍스트의 수치적 표현입니다. Discourse에서는 다음과 같은 목적으로 사용됩니다:

  1. 주제 페이지 하단에 관련 주제 생성
  2. 의미론적 검색 기능 활성화

임베딩 설정

호스팅 고객 대상

호스팅 고객인 경우, 임베딩은 사전에 구성되어 있습니다. 임베딩에 의존하는 AI 기능을 활성화하기만 하면 됩니다.

자체 호스팅 인스턴스 대상

자체 호스팅을 사용하는 경우, 자세한 설정 지침은 Discourse AI 자체 호스팅 가이드를 참조하세요.

임베딩 정의 구성

임베딩 모델은 이제 관리자 UI에서 **임베딩 정의(Embedding Definitions)**로 구성됩니다. 관리자(Admin) → AI 플러그인 → 임베딩(Embeddings) 탭으로 이동하세요. 새로운 임베딩 정의를 추가할 때, 사전 구성된 프리셋(presets) 중 하나를 선택하거나 수동으로 구성할 수 있습니다.

사용 가능한 프리셋에는 다음이 포함됩니다:

  • text-embedding-3-large (OpenAI)
  • text-embedding-3-small (OpenAI)
  • text-embedding-ada-002 (OpenAI)
  • gemini-embedding-001 (Google)
  • bge-large-en (Hugging Face)
  • bge-m3 (Hugging Face)
  • multilingual-e5-large (Hugging Face)

각 임베딩 정의에는 다음이 포함됩니다: 표시 이름, 제공자, URL, API 키(또는 AI Secret), 토크나이저, 차원, 거리 함수, 최대 시퀀스 길이, 선택 사항인 임베딩/검색 프롬프트.

임베딩 구성

관리자(Admin) → 플러그인(Plugins) → Discourse AI로 이동하여 다음 설정이 활성화되어 있는지 확인하세요.

  1. ai embeddings enabled: 임베딩 모듈 켜기/끄기
  2. ai embeddings selected model: 임베딩 생성에 사용할 임베딩 정의 선택

조절할 수 있는 선택적 설정…

  • AI embeddings generate for pms: 개인 메시지에 대한 임베딩을 생성할지 결정
  • AI embeddings semantic related topics enabled: “관련 주제” 기능 활성화/비활성화
  • AI embeddings semantic related topics: 표시할 관련 주제의 최대 수
  • AI embeddings semantic related include closed topics: 관련 주제 결과에 닫힌 주제 포함
  • AI embeddings semantic related age penalty: 관련 결과의 주제에 지수 함수 기반 경과 시간 페널티 적용 (0.0은 비활성화, 값이 높을수록 오래된 주제에 더 큰 페널티 부과)
  • AI embeddings semantic related age time scale: 경과 시간 페널티 계산에 사용되는 일 단위의 시간 척도 (기본값: 365)
  • AI embeddings semantic search enabled: 전체 페이지 AI 검색 활성화
  • AI embeddings semantic quick search enabled: 검색 메뉴 팝업에서 의미론적 검색 옵션 활성화
  • AI embeddings semantic search use hyde: 의미론적 검색에 HyDE(Hypothetical Document Embedding) 사용 활성화
  • AI embeddings semantic search hyde agent: HyDE가 활성화된 경우 검색어를 확장하는 데 사용되는 AI 에이전트

제공자(Providers)

Discourse AI는 여러 임베딩 제공자를 지원합니다:

  • OpenAI
  • Google
  • Hugging Face (오픈 소스/오픈 웨이트 모델용)
  • Cloudflare Workers AI

호스팅 고객의 경우, Discourse는 바로 사용 가능한 사전 구성(시드된) 임베딩 정의를 제공합니다.

기능

관련 주제

활성화되면 주제 페이지 하단에 의미적으로 유사한 토론으로 연결되는 “관련 주제” 섹션이 나타납니다.

AI 검색

임베딩은 전체 페이지 검색 인터페이스의 의미론적 검색 옵션을 구동합니다.

의미론적 검색은 선택적으로 HyDE(Hypothetical Document Embedding)를 사용할 수 있습니다. ai embeddings semantic search use hyde를 통해 활성화하면, ai embeddings semantic search hyde agent에 구성된 AI 에이전트를 사용하여 검색어가 확장됩니다. 확장된 검색은 벡터로 변환되어 유사한 주제를 찾는 데 사용됩니다. 이 기법은 검색에 일부 지연(latency)을 추가하지만 결과를 개선할 수 있습니다.

HyDE에 사용할 에이전트를 선택할 때는 Gemini Flash, Claude Haiku, GPT-4o Mini 또는 최신 사용 가능한 모델과 같은 빠른 모델을 선택하세요.

임베딩 생성

임베딩은 새 게시물에 대해 자동으로 생성됩니다. 기존 콘텐츠에 대한 임베딩을 생성하려면:

  1. Discourse는 5분마다 실행되는 예약 작업을 통해 오래된 주제에 대한 임베딩을 자동으로 백필(backfill)합니다.
  2. 백필은 최근 활동 순서대로 주제를 처리합니다.

자주 묻는 질문(FAQ)

Q: 관련 주제는 어떻게 결정되나요?
A: 관련 주제는 제목, 카테고리, 태그, 게시물 콘텐츠를 포함하는 임베딩에만 기반합니다.

Q: 특정 주제를 관련 주제에서 제외할 수 있나요?
A: 네, 결과에서 닫힌 주제를 제거하는 사이트 설정이 있습니다.

Q: 임베딩은 과거 게시물에도 작동하나요?
A: 네, 시스템이 모든 콘텐츠에 대한 임베딩을 자동으로 백필합니다.

추가 자료

18개의 좋아요

좋은 작업, 먼저 감사합니다. 하지만 주제 아래에서 유사한 주제를 볼 수 없습니다. 어떻게든 제 설정이 이렇게 되어 있습니다. openai 키를 추가했습니다. 의미론적 검색은 작동하지만, 주제 아래에 유사한 게시물을 표시하는 방법은 무엇인가요?

임베딩에 OpenAI를 사용하려면 ai embeddings model을 text-embedding-ada-002로 설정해야 합니다.

3개의 좋아요

임베딩을 생성하는 작업은 어떻게 예약되나요? 코드에 따르면 임베딩은 페이지가 조회되고 임베딩이 없을 때만 생성되는 것 같습니다. 이 기능을 활성화할 때 사이트 전체에 대한 임베딩을 생성할 수 있는 방법이 있나요?

2개의 좋아요

모든 주제의 임베딩을 즉시 생성하려면 rake ai:embeddings:backfill을 실행할 수도 있습니다.

8개의 좋아요

제안

때때로 대부분의 배경 지식을 알고 있는 주제를 읽다가도, 낯선 언급들이 섞여 있을 수 있습니다. 현재까지의 주제 전체를 요약해 주는 요약 기능이 있지만, 주제 상단에 고정 게시글 형태로 사전(Glossary)을 삽입하고, 사용자가 AI에 포함을 요청하는 단어 또는 구절을 선택할 때마다 이를 업데이트하는 AI 옵션도 유용할 것입니다.


오늘 이 주제를 읽다가 한 가지 익숙하지 않은 참고 문헌을 발견하여 검색 후 해당 참고 문헌에 대한 답변을 남겼습니다. 나머지 참고 문헌들은 알고 있지만, LLM(대형 언어 모델) 등에 익숙하지 않은 사용자들은 많은 참고 문헌을 전혀 모를 것입니다. AI가 이들을 도울 수 있다면 사이트를 훨씬 더 자주 방문하게 될 것입니다.

이 시작 게시글에서 RAG가 무엇을 의미하는지는 알고 있지만, 실제로 이를 아는 사람이 얼마나 될까요?

RAG란 무엇인가요? (삼각형을 클릭하여 확장)

도메인별 챗봇은 어떻게 작동하는가? 검색 증강 생성(RAG) 개요


참고: 이 내용을 어떤 주제에 게시해야 할지 몰랐지만, 작동하려면 임베딩(embeddings)이 필요하므로 여기에 게시했습니다. 다른 곳에 게시하는 것이 더 적절하다고 판단되거나, Discourse AI 플러그인이 변경될 경우 이 게시글을 이동해 주시기 바랍니다.

1개의 좋아요

“관련 주제”를 결정할 때 임베딩이 유일한 변수인가요? 아니면 다른 요소(예: 저자, 주제 점수, 주제 경과 시간, 카테고리 등)도 고려되나요?

3개의 좋아요

임베딩만 해당되지만, 여기에는 제목, 카테고리, 태그 및 게시글이 포함됩니다. 또한 설정에서 닫힌 주제를 결과에서 제외할 수 있습니다.

5개의 좋아요

게시물 7개가 새 주제로 분리되었습니다: Is full page semantic search only in English?

2개의 게시물이 새로운 주제로 분리되었습니다: AI 시맨틱 검색과 키워드 검색 간의 검색 지연 시간 차이

몇 달 전에 이걸 알았으면 좋았을 텐데. 이미 bge-small-en-v1.5를 사용해 임베딩을 생성하고 외부 데이터베이스에 호스팅해 놨거든.

이 ‘표준’ 구성에 어떻게든 끼워 넣을 수 있을지 한번 알아볼게!

최근 버전에서 rake ai:embeddings:backfill 실행 실패로 이어지는 작은 버그를 발견했습니다:

root@nbg-webxj:/var/www/discourse# rake ai:embeddings:backfill
rake aborted!
NameError: uninitialized constant Parallel (NameError)

  Parallel.each(topics.all, in_processes: args[:concurrency].to_i, progress: "Topics") do |t|
  ^^^^^^^^
/var/www/discourse/plugins/discourse-ai/lib/tasks/modules/embeddings/database.rake:27:in `block in <main>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => ai:embeddings:backfill
(See full trace by running task with --trace)

원인은 parallel 게멀이 이 플러그인에도, Discourse 코어에도 설치되어 있지 않기 때문이라고 추정됩니다(단, if ENV["IMPORT"] == "1" 블록 내에서만 gem "parallel", require: false를 발견했습니다).

rake ai:embeddings:backfill를 수행하려면 ruby-progressbar 게멀도 필요하다는 것을 발견했습니다.

Github에서 간단한 PR을 만들었습니다:

2개의 좋아요

다른 분들을 위한 참고: GitHub에서 Falco가 언급했듯이, 이 rake 메서드는 최근 격하되거나 반(半)비추천 상태로 전환된 것으로 보입니다.

PR을 올려주셔서 감사합니다 @fokx. 하지만 해당 rake 작업은 더 이상 권장되지 않아 의도치 않게 제외했습니다. 이 작업은 대역외(out-of-band) 방식으로 쉽게 설치할 수 있는 경험이 풍부한 운영자만 특수한 경우에 사용해야 합니다.

의미론적 검색 옵션이 이제 해당 드롭다운 메뉴에 표시되지 않고, AI 토글을 통해 포함되거나 활성화되는 것인가요?

1개의 좋아요

임베딩이 설치 이후에 작성된 게시물에서만 동작하는지, 아니면 과거 게시물 전체에 대한 시맨틱 검색도 가능한지 확인해 주실 수 있을까요? 후자가 가능했으면 좋겠습니다! 감사합니다.

1개의 좋아요

후자입니다. 모든 콘텐츠의 임베딩을 자동으로 백필하기 때문입니다.

4개의 좋아요

Gemini Flash를 사용하여 AI 임베딩을 설정하려고 하는데, 작동하지 않습니다. 모든 설정 필드에 대한 좋은 설명이나 예제를 찾기가 어려워, 중요한 설정을 하나둘 놓쳤을 수도 있습니다. ‘ai_embeddings_model’ 설정이 필수인지는 모르겠지만, 'gemini’로 설정하면 다음과 같은 오류가 발생합니다…

ai_gemini_api_key 설정을 찾을 수 없습니다. API 키와 함께 Gemini Flash를 LLM으로 설정해 두었으며, 요약 작업 등 다른 곳에서는 정상적으로 작동하고 있습니다. 하지만 이 기능은 다른 곳에 API 키를 입력해야 하는 것 같습니다.

이것은 OpenAI에서도 작동할 것 같지 않나요?

Batch API(50% 할인)를 지원할 수 있다면 정말 좋겠습니다.

네, 하지만 요즘은 백그라운드에서 자동으로 백필링을 수행하므로 필수 사항은 아닙니다.

가격에 민감한 분들을 위해, 자체 하드웨어에서 실행할 수 있는 훌륭한 오픈 웨이트 모델을 지원합니다.

1개의 좋아요

감사합니다. 백필(backfill) 시점에 벡터화가 수행된다는 이해가 맞나요? 모델을 전환할 때 벡터가 재계산되어야 하나요(모델 고유의 벡터인가요)? 그렇다고 추정합니다.

오픈소스 솔루션을 갖춘 GPU 서버에 투자하는 것과 OpenAI API 사용 비용을 비교하는 것이 유용할 것 같습니다. 사용된 토큰 수를 추정할 수 있는 공식이나 방법이 있을까요? 우리는 벡터 거리를 계산하기 위한 것이 아니라 게시물을 벡터화하기 위해만 API를 사용하고 있죠? 그렇다면 사용된 토큰 수는 보유한 콘텐츠의 양에 따라 달라지는 것이 맞나요?

관련 주제와 AI 기반 검색 모두에서 모든 게시물은 한 번만 벡터화되어야 하므로, 게시글 테이블의 총 단어 수를 계산하여 필요한 토큰 수를 도출할 수 있을 것입니다. 동일한 과정이 매일 추가되는 게시물에도 적용될 것입니다. 지금은 검색 문구는 무시하겠습니다.