AI 뉴스

Cerebras가 사내 지식 베이스를 구축한 방법 — Postgres 임베딩으로 엮는 Slack·코드·문서 통합

노동1호 2026. 7. 28. 04:02

Cerebras Systems는 사내 지식 베이스를 처음부터 새로 만들지 않고, 이미 운영 중인 도구들이 있는 자리에서 직접 수집하는 방식으로 3개월 만에 하루 15,000건의 질문 트래픽을 처리하는 시스템을 만들었다고 공개했습니다. 이 글은 긱뉴스에 공유된 사내 사례를 바탕으로, 분산된 엔터프라이즈 자산을 한 곳으로 가져오지 않고도 통합 검색을 구현하는 접근을 정리합니다.

왜 "이동하지 않고 수집"인가

대부분의 사내 검색 시스템 구축은 데이터 마이그레이션에서 시작합니다. Slack 채널, Git 저장소, Notion 페이지, 사내 데이터베이스를 한 군데로 옮긴 뒤 색인화하는 방식이죠. Cerebras의 Knowledge 팀은 이 단계에서 가장 큰 비용이 발생한다는 점을 문제로 보았습니다. 데이터가 움직이면 권한 모델이 깨지고, 동기화 지연이 생기고, 원본과의 단절감이 사용자 불만으로 이어집니다.

그래서 그들은 모든 데이터를 한 도구로 옮기는 대신, 각 시스템에 이미 존재하는 보존 모델과 메타데이터를 그대로 둔 채 공통 스키마의 Postgres 임베딩 테이블에만 색인을 만드는 쪽을 선택했습니다. 색인은 어디로 가지 않고, 검색만 한 곳으로 옵니다.

Postgres 임베딩 테이블 구조

핵심 테이블은 두 가지입니다. 원본을 가리키는 source 행과 그 안의 청크 단위 임베딩을 저장하는 chunk 행입니다. 권한과 출처 추적은 원본 시스템이 그대로 책임을 지고, 임베딩 테이블은 검색과 랭킹만 담당합니다.

CREATE TABLE source (
    id           BIGSERIAL PRIMARY KEY,
    system       TEXT NOT NULL,            -- slack / github / notion / postgres
    external_id  TEXT NOT NULL,            -- 원본 시스템의 메시지/문서 ID
    url          TEXT,
    updated_at   TIMESTAMPTZ NOT NULL,
    UNIQUE (system, external_id)
);

CREATE TABLE chunk (
    id           BIGSERIAL PRIMARY KEY,
    source_id    BIGINT REFERENCES source(id) ON DELETE CASCADE,
    position     INT NOT NULL,
    content      TEXT NOT NULL,
    embedding    VECTOR(1024) NOT NULL,    -- pgvector / vchord
    tsv          TSVECTOR,
    updated_at   TIMESTAMPTZ NOT NULL
);

CREATE INDEX chunk_embedding_idx ON chunk USING hnsw (embedding vector_cosine_ops);
CREATE INDEX chunk_tsv_idx ON chunk USING GIN (tsv);

수집 파이프라인 — 원본 자리에 그대로 두기

수집기는 각 시스템의 변경 이벤트에만 반응합니다. Slack은 Events API의 message_changed, GitHub는 webhook의 push/issues, Notion은 pages.update를 받아 청크로 잘라 임베딩을 계산하고 Postgres에 upsert합니다. 원본 문서가 삭제되면 ON DELETE CASCADE로 색인도 함께 사라집니다.

def ingest(event):
    src = upsert_source(event.system, event.external_id, event.url, event.updated_at)
    chunks = chunker.split(event.body)
    for pos, text in enumerate(chunks):
        emb = embedder.embed(text)
        db.execute("""
            INSERT INTO chunk (source_id, position, content, embedding, tsv, updated_at)
            VALUES (%s, %s, %s, %s, to_tsvector('simple', %s), now())
            ON CONFLICT (source_id, position) DO UPDATE
            SET content = EXCLUDED.content,
                embedding = EXCLUDED.embedding,
                tsv = EXCLUDED.tsv,
                updated_at = EXCLUDED.updated_at
        """, (src.id, pos, text, emb, text))

권한은 원본 시스템이 결정

검색 결과는 임베딩 유사도 순으로 랭킹되지만, 실제로 사용자에게 노출할지는 원본 시스템의 ACL로 다시 검증합니다. Slack 채널은 멤버십, GitHub는 팀 레포 접근 가능 여부, Notion은 페이지 공유 범위를 그대로 따릅니다. Postgres 안에 권한을 복제하지 않으므로 권한 표면이 늘어나지 않습니다.

def search(query, user):
    emb = embedder.embed(query)
    rows = db.execute("""
        SELECT c.id, s.system, s.url, c.content, 1 - (c.embedding <=> %s) AS score
        FROM chunk c JOIN source s ON s.id = c.source_id
        ORDER BY c.embedding <=> %s LIMIT 50
    """, (emb, emb)).fetchall()
    # 원본 시스템 ACL로 후필터링
    allowed = [r for r in rows if acl.allows(user, r.system, r.url)]
    return rerank(query, allowed)[:10]

3개월 만에 15,000 Q/일 — 무엇이 효과를 만들었나

Cerebras는 출시 3개월 만에 하루 15,000건의 질문을 처리했다고 합니다. 그중 상당수가 자동화 파이프라인과 에이전트에서 발생했다는 점이 인상적입니다. 사람만이 검색하는 게 아니라, 코드가 생성한 작업 로그를 다른 코드가 다시 찾는 패턴이 사내에서 빠르게 자리잡았기 때문입니다.

인덱스를 단일 시스템에 두고 권한은 원본에 남기는 이 패턴은, AI 에이전트가 사내 자산을 직접 활용해야 하는 조직일수록 설득력을 가집니다. 모든 것을 한 플랫폼으로 통합하려 시도하기보다, 검색만 한 곳에 모으는 발상의 전환이 비용과 운영 부담을 동시에 줄여줍니다.

도입 시 실전 팁

  • 처음에는 가장 자주 묻는 두세 가지 시스템(보통 Slack과 코드 저장소)만 연결하세요. 임베딩 비용과 운영 부담이 선형이 아닌 로그적으로 증가합니다.
  • 청크 크기는 시스템 특성에 맞춰 다르게 — Slack 메시지는 200~400 토큰, 코드/PR은 함수 또는 파일 단위, 문서는 헤딩 단위가 대체로 잘 동작합니다.
  • 재색인 주기는 updated_at 차분 비교로 결정합니다. 15분 사이의 동일 청크는 스킵해 임베딩 API 비용을 절약할 수 있습니다.
  • 검색 로그를 보존하면 "질문은 많은데 답이 없는 영역"이 자연스럽게 드러납니다. 그 영역이 곧 다음 임베딩 대상입니다.

정리

Cerebras의 사례는 "데이터를 가져온다"가 아니라 "검색만 모은다"는 선택이 사내 지식 베이스를 빠르게 만들 수 있다는 점을 잘 보여줍니다. Postgres 임베딩, 시스템별 이벤트 기반 수집, 원본 ACL 위임 — 이 세 가지 조합이면 데이터 양이 늘어도 권한 표면과 동기화 부담이 늘지 않습니다. AI 에이전트가 사내 자산을 더 많이 읽고 쓸수록, 이런 구조의 가치가 더 커질 것입니다.


원문 출처: 긱뉴스 — Cerebras가 사내 지식 베이스를 구축한 방법


📰 원본 출처 · https://news.hada.io/topic?id=31850 (#N=31850)

이 글은 GeekNews(긱뉴스)에 게제된 글을 기반으로 작성되었습니다. 원본의 라이선스와 저작권은 원작자에게 있습니다.