DiscourseAI용 임베딩 셀프 호스팅

The Discourse AI plugin has many features that require embeddings to work, such as Related Topics, AI Search, AI Helper Category and Tag suggestion, etc. While you can use a third-party API, like Configure API Keys for OpenAI, Configure API Keys for Cloudflare Workers AI or Configure API Keys for Google Gemini, we built Discourse AI from the first day to not be locked into those.

Running with HuggingFace TEI

HuggingFace provides an awesome container image that can get you running quickly.

For example:

mkdir -p /opt/tei-cache
docker run --rm --gpus all --shm-size 1g -p 8081:80 \
  -v /opt/tei-cache:/data \
  ghcr.io/huggingface/text-embeddings-inference:latest \
  --model-id BAAI/bge-large-en-v1.5

This should get you up and running with a local instance of BAAI/bge-large-en-v1.5, a very good performing open-source model.

You can check if it’s working with

curl -X POST \
  'http://localhost:8081/embed' \
  -H 'Content-Type: application/json' \
  -d '{ "inputs": "Testing string for embeddings" }'

Which should return an array of floats under normal operation.

Making it available for your Discourse instance

Most of the time, you will be running this on a dedicated server because of the GPU speed-up. When doing so, I recommend running a reverse proxy, doing TLS termination, and securing the endpoint so it can only be connected by your Discourse instance.

Configuring DiscourseAI

Discourse AI now uses a fully configurable embedding definition system, similar to how LLMs are configured. To set up your self-hosted endpoint:

  1. Navigate to Admin → Plugins → Discourse AI → Embeddings.
  2. Click New to create a new embedding definition.
  3. Select a preset that matches your model (e.g. bge-large-en, bge-m3, or multilingual-e5-large), or choose Configure manually for any other model.
  4. Set the URL to point to your self-hosted TEI server (e.g. https://your-tei-server:8081).
  5. Use the Test button to verify connectivity before saving.
  6. After saving, set ai_embeddings_selected_model to your new embedding definition.

Once configured, Discourse will automatically backfill embeddings for existing topics via a scheduled background job. If you have a large backlog, you can increase the hidden setting ai_embeddings_backfill_batch_size (default: 250) to process topics faster.

11개의 좋아요

모델 bge-m3은 다국어(또는 영어가 아닌) 웹사이트에서 작동해야 하나요?

네, GitHub에서 조용히 공유된 주에 직접 사용해 봤고, 잘 작동합니다. 다만 MTEB 리더보드에서 어떻게 평가될지는 아직 지켜보고 있습니다. 마지막으로 확인했을 때 리더보드에 올라와 있지 않았거든요.

그럼에도 불구하고, 해당 플러그인에 포함된 다국어 모델인 e5를 사용하는 대규모 호스팅된 Discourse 인스턴스들이 있으며, 성능이 매우 뛰어납니다.

1개의 좋아요

감사합니다. 임베드를 위한 오픈소스 커스텀 엔드포인트를 활성화할 계획이 있으셨나요? Hugging Face에서 이 모델을 사용하려고 하고 있습니다.

죄송하지만 말씀하신 내용을 잘 이해하지 못하겠습니다. 이 토픽은 디스코urs AI 임베드를 위해 오픈소스 모델을 실행하는 방법에 대한 가이드입니다.

아, 죄송합니다. 저는 HuggingFace의 오픈소스 모델을 커스텀 엔드포인트로 사용하려고 하는데, 이것이 가능한지 아니면 가까운 미래에 지원될 계획인지 궁금합니다 :slight_smile:

동작 여부를 확인하려면, 다음 명령어가 저에게는 잘 작동합니다(BAAI/bge-m3 모델 사용 시):

curl -X 'POST' \
  'http://localhost:8081/embed'\
  -H 'Content-Type: application/json' \
  -d '{ "inputs": "Testing string for embeddings"}'

참고로, http://localhost:8081/docs/의 Swagger 웹 인터페이스를 사용할 수도 있습니다.

2개의 좋아요

이것도 좋은 임베딩 서버입니다:

1개의 좋아요

용량을 줄이기 위해 양자화 임베딩을 사용할 수 있을까요? 바이너리 양자화 임베딩을 사용해 저장 공간을 크게 줄이고 싶습니다. 몇 가지 테스트를 해본 결과, 저장 공간이 32분의 1로 줄어든 채로 성능의 90% 이상을 유지할 수 있었습니다!

1개의 좋아요

몇 주 전부터 기본적으로 임베딩을 반정밀도(half precision)로 저장하고(저장 공간 절반), 인덱스에 바이너리 양자화(크기 32분의 1)를 사용하고 있습니다. 따라서 사이트를 최신 버전으로 업데이트하기만 해도 디스크 사용량이 크게 줄어드실 것입니다.

3개의 좋아요

다음도 추가해 주실 수 있을까요?

지원되는 임베딩 모델에 이 모델을 추가해 주세요.

LLM과 동일한 방식으로 임베딩을 구성 가능하도록 만들 계획이며, 이를 통해 곧 모든 모델이 호환되게 될 것입니다.

4개의 좋아요

로컬 네트워크의 엔드포인트(예: 192.168.x.x)에서 문제를 겪고 계신 분이 더 있다면 참고하세요. 이 주소들은 보안상의 이유로 Discourse에서 차단되는 것 같습니다. 따라서 이 차단을 우회해야 합니다. 이 문제를 파악하는 데 몇 시간이나 걸렸네요!

1개의 좋아요

@Falco 정말 좋겠습니다. 그 사이, 새로운 임베딩 모델을 추가해 보고 싶다면 다음 파일만 추가하면 되나요?

 lib/embeddings/vector_representations/mxbai-embed-xsmall-v1.rb
 lib/tokenizer/mxbai-embed-xsmall-v1.rb
 tokenizers/mxbai-embed-xsmall-v1.json

그리고 lib/embeddings/vector_representations/base.rb를 수정하여 새 모델을 포함시키면 되는 건가요, 아니면 다른 부분도 변경해야 하나요?

@Falco 모델 추가에 도전해 보았고 풀 리퀘스트를 보냈습니다. 소프트웨어 개발자가 아니라서 잘못한 부분이 있을 수 있으니 양해 부탁드립니다. 검토해 주셔서 포함해도 되는지 확인해 주시면 감사하겠습니다.

불행히도 TEI와 함께 작동시키지 못했습니다. all-mpnet은 TEI와 함께 작동했지만, mxbai를 작동시키기 위해 제가 한 작업에 뭔가 문제가 있는 것 같습니다.

참고로, https://github.com/michaelfeil/infinity를 임베딩 서버로 지원할 가능성이 있을까요?

수정: 데이터베이스의 HNSW 인덱스가 하드코딩되어 있어 순서를 깨뜨리지 않도록 새 모델은 끝에 추가해야 하고, 각 새 모델은 자신의 인덱스를 추가해야 하므로 이 문제가 복잡해질 것 같습니다.

구성 가능한 임베딩 지원이 출시될 때까지 몇 주 정도 기다리는 것을 진짜 추천합니다.

구성 가능한 임베딩을 출시하면 잘 작동할 것입니다. 하지만 궁금한 점이 있어 질문합니다. GitHub - huggingface/text-embeddings-inference: A blazing fast inference solution for text embeddings models · GitHub 보다 어떤 점이 더 나은가요?

TEI를 꾸준히 따라가지는 않아서 최근 테스트하지 않은 장점은 언급하지 않겠지만, 최근 확인한 내용 중 몇 가지:

  • 하드웨어 지원: infinity는 TEI보다 GPU 지원이 더 좋습니다.
  • infinity 서버는 단일 서버에서 여러 임베딩 모델을 호스팅할 수 있습니다(TEI에서 이 기능을 놓쳤다면 몰라도).

정말 좋습니다. 아직 시도해 보지 않았다면 꼭 한번 살펴보세요!

1개의 좋아요

친구가 이 스레드를 DM으로 보내줬어요.

장점/단점:

  • infinity는 멀티모달 임베딩(즉, 이미지/오디오 전송)을 지원합니다.
  • AMD GPU 지원
  • 동일한 컨테이너에서 여러 모델을 지원하며(model 파라미터로 모델을 제어 가능).
  • 더 다양한 dtype 지원. 예: 가중치의 int8 양자화(대부분 이는 관련이 없으며, 활성화 메모리가 더 큼)
  • 새로운 모델은 종종 huggingface 저장소에 포함된 "커스텀 모델링 코드"로 출시됩니다. Infinity는 필요할 경우 이 pytorch 코드를 읽습니다. 이를 통해 "xyz 모델을 지원할 수 있나요?"라는 요청을 지속적으로 피할 수 있습니다.
  • 더 많은 모델 지원(예: mixedbread용 debertav2)

단점:

  • TEI의 콜드 스타트 시간이 더 좋습니다.
3개의 좋아요

마이클, 안녕하세요 :wave:

@roman 이 현재 임베딩 설정을 재구성하고 있습니다:

이 작업이 끝나면 infinity 지원 추가는 매우 간단해질 것입니다. 곧 완료될 예정입니다.

여전히 멀티 모델 임베딩에 대해 많이 고민하고 있습니다. PDF에 대해 RAG를 수행할 때 OCR이나 LLM 기반의 고비용 이미지-텍스트 변환이 필요 없이, 콘텐츠를 이미지로 처리하고 각 이미지를 임베딩하는 방법으로 활용할 수 있어 유용한 단축 경로가 되기 때문입니다.

해당 PR이 완료되면 임베딩 설정에 infinity 지원(그리고 멀티 모델 지원)을 추가하는 데 기꺼이 협력하겠습니다.

방문해 주셔서 감사합니다 :hugs:

4개의 좋아요

litellm 지원 기능을 구축하면 litellm을 통해 지원되는 모든 모델의 이점을 누릴 수 있으므로, 이것이 지름길이 될 수 있을지 궁금합니다. 다른 프로젝트들도 이 기능을 내장하는 경향이 있습니다.