Cube x LangChain: Building AI experiences with LLMs and the semantic layer
Quick Summary
Cube와 LangChain의 통합은 시맨틱 계층의 메타데이터 검색을 자연어 기반 SQL 생성에 연결해 정확성과 예측 가능성을 높이는 접근을 제시한다.
🖼️ 인포그래픽

🖼️ 4컷 인포그래픽

💡 한 줄 요약
Cube와 LangChain의 통합은 시맨틱 계층의 메타데이터 검색을 자연어 기반 SQL 생성에 연결해 정확성과 예측 가능성을 높이는 접근을 제시한다.
📌 핵심 요약
- Cube의 시맨틱 계층은 지표 계산을 중앙화하며, 글은 이를 자연어 기반 SQL 애플리케이션의 정확성과 예측 가능성을 높이고 AI 환각을 줄이는 구성 요소로 소개한다.
- LangChain용 CubeSemanticLoader는 시맨틱 계층의 데이터 모델을 문서로 불러오며, 이를 임베딩해 벡터 데이터베이스에 저장하면 자연어 입력과 관련된 뷰 및 구성 요소를 검색할 수 있다.
- 데모는 데이터 모델의 외부 접점인 뷰만 불러와 FAISS 벡터 저장소에 저장하고, 이후 재사용할 수 있도록 직렬화한다.
- Streamlit으로 받은 질문을 유사도 검색한 뒤 첫 번째 문서의 테이블을 선택하고, 해당 테이블로 검색 범위를 제한해 최대 15개의 열 관련 문서를 가져온다.
- 데모는 temperature=0으로 설정한 OpenAI 모델에 질문·테이블·열 정보와 top_k=1000 등을 포함한 프롬프트를 전달하고, 응답에서 Cube SQL API용 SQL과 관련 필터를 추출한다.
🧩 주요 포인트
- 지표 계산 중앙화와 메타데이터 연결 → 자연어 기반 SQL 생성이 시맨틱 계층에 정의된 데이터 의미를 참고하는 구조다.
- 뷰만 적재하고 첫 번째 검색 결과의 테이블을 선택 → SQL 생성에 제공되는 정보 범위가 뷰 구성과 초기 검색 결과에 따라 정해진다.
- 테이블별 열 검색과 프롬프트 구성 → 최대 15개의 열 관련 문서에서 얻은 정보가 OpenAI 모델의 SQL 생성 맥락을 구성한다.
🧠 상세 정리
1. 시맨틱 계층을 연결하는 목적
2023년 8월 23일 게시된 이 글은 Cube 팀과의 협업을 통해 자연어를 SQL로 바꾸는 대규모 언어 모델 애플리케이션에서 시맨틱 계층이 맡는 역할을 설명한다. 글은 데이터에 효율적으로 접근하고 통찰을 얻는 일이 중요해진 상황에서 LangChain을 AI 경험 개발의 주요 도구로 소개한다. Cube는 지표 계산을 중앙화하는 동시에 AI 환각에 대응하는 구성 요소로 제시되며, 편집자 주는 특히 정확성과 예측 가능성을 강조한다. 이러한 배경에서 통합의 핵심은 사용자의 자연어 질문을 시맨틱 계층에 정의된 데이터 모델과 연결해 SQL 생성에 필요한 맥락을 제공하는 데 있다.
2. 문서 로더와 자연어 검색의 연결
Cube와 LangChain의 통합은 시맨틱 계층의 데이터 모델을 불러오는 문서 로더 형태로 제공된다. 로더가 반환한 문서는 임베딩으로 변환되어 벡터 데이터베이스를 채우는 데 사용되며, 이후 검색을 통해 입력과 가장 잘 맞는 시맨틱 계층의 항목을 찾을 수 있다. 글은 이 과정을 자연어 질문처럼 자유로운 형식의 입력을 데이터 모델의 뷰 및 그 구성 요소와 연결하는 용도로 설명한다. 또한 Cube SQL API용 쿼리를 구성하는 OpenAI 프롬프트 예제와 채팅 기반 데모의 소스 코드를 제공하며, 이를 Delphi와 유사한 시맨틱 계층용 대화 인터페이스를 만드는 출발점으로 제시한다.
3. 뷰 메타데이터 적재와 저장소 준비
데모의 메타데이터 적재는 ingest.py 파일의 ingest_cube_meta 함수에서 시작하며, CubeSemanticLoader에 API 주소와 토큰을 전달해 데이터 모델을 불러온다. 이때 적재 대상은 뷰로 제한되는데, 원문은 뷰를 데이터 모델이 외부에 드러나는 접점으로 보기 때문이라고 설명한다. 불러온 문서는 임베딩 처리 후 FAISS 벡터 저장소에 저장되므로, 뒤이은 자연어 검색은 이렇게 준비한 뷰 메타데이터를 바탕으로 수행된다. 코드 예시는 생성한 저장소를 pickle로 직렬화해 vectorstore.pkl 파일에 기록하며, 이 파일은 이후 데모에서 벡터 저장소를 다시 사용할 수 있도록 보관하는 역할을 한다.
4. 모델 설정과 질문 입력
데모는 문서 로더와 벡터 데이터베이스에 OpenAI의 언어 모델을 연결하고, 사용자 인터페이스에는 Streamlit을 사용한다. main.py에서는 필요한 의존성을 불러오고 환경 변수를 읽은 다음, OPENAI_API_KEY에 저장된 API 키를 사용해 모델을 초기화하며 temperature는 0으로 설정한다. 사용자 질문은 Streamlit의 텍스트 입력란으로 받고, 제출 버튼을 누르면 질문을 검사하는 check_input 함수를 호출한 뒤 벡터 저장소를 초기화한다. 이 단계는 앞서 저장한 메타데이터를 실제 질문 처리 흐름에 연결하는 준비 과정이며, 이어지는 유사도 검색과 SQL 프롬프트 구성에 질문과 저장소를 제공한다.
5. 유사도 검색으로 테이블과 열 선택
질문을 받은 뒤에는 벡터 저장소의 유사도 검색을 실행하고, 반환된 첫 번째 문서의 메타데이터에서 테이블 이름을 가져온다. 코드 주석은 이 첫 결과를 가장 적절한 추정으로 취급한다고 설명하며, 선택한 테이블은 후속 열 검색의 범위를 정하는 데 사용된다. 다음 검색에서는 사용 가능한 모든 열을 요청하는 문구와 함께 해당 테이블 이름을 필터로 지정하고, k=15를 설정해 최대 15개의 관련 문서를 가져온다. 따라서 이 데모의 프롬프트에 제공되는 테이블과 열 정보는 전체 모델을 한 번에 전달한 결과가 아니라, 질문에 대한 초기 검색과 선택한 테이블 내부의 추가 검색을 거쳐 정해진다.
6. 프롬프트 구성과 통합의 의미
SQL 생성 단계에서는 CUBE_SQL_API_PROMPT에 사용자 질문, 선택한 테이블, 열 정보, top_k=1000, 답변할 수 없을 때 사용할 문구를 채워 넣는다. 이어서 프롬프트 뒤에 PROMPT_POSTFIX를 붙여 OpenAI 모델을 호출하고, 응답을 파싱해 SQL 쿼리와 관련 필터를 추출한다고 설명한다. 여기서 top_k=1000은 프롬프트 구성에 전달하는 값이며, 앞서 열 관련 문서 검색에 사용한 k=15와는 별개의 설정으로 나타난다. 글은 이러한 통합이 SQL의 복잡성을 추상화해 자연어 데이터 접근을 제공한다고 정리하며, 기업 내부 지식을 언어 모델의 추론에 올바르게 연결하는 통합의 중요성을 강조한다.
🧾 핵심 주장 / 시사점
- 이 접근에서 시맨틱 계층은 지표 정의를 관리하는 동시에, 언어 모델에 전달할 데이터 맥락을 검색하는 기반으로 쓰인다.
- 첫 번째 검색 결과로 테이블을 정하므로, 초기 테이블 선택은 뒤이어 검색할 열 정보의 범위에도 영향을 준다.
- 데모는 메타데이터 적재, 관련 정보 검색, SQL 생성을 단계별로 연결하지만, 원문에는 정확성 개선을 정량적으로 검증한 결과가 제시되지 않는다.
✅ 액션 아이템
- Cube의 지표 계산 중앙화와 메타데이터 연결을 자연어 기반 SQL 생성에 활용하는 방식 검토.
- 뷰만 적재하는 제약과 첫 번째 검색 결과의 테이블 선택이 제공 정보 범위에 미치는 영향 확인.
- 최대 15개의 열 관련 문서와 top_k=1000이 OpenAI 모델의 프롬프트 구성에서 맡는 역할 구분.
❓ 열린 질문
- Cube의 지표 계산 중앙화와 메타데이터 연결은 자연어 기반 SQL 생성의 정확성과 예측 가능성에 어떻게 기여하는가?
- 첫 번째 검색 결과에서 선택한 테이블이 질문과 맞지 않으면 후속 열 검색과 SQL 생성에 어떤 영향을 미치는가?
- 최대 15개의 열 관련 문서로 질문에 필요한 열 정보를 충분히 제공할 수 있는가?