1. Google Cloud Discovery Engine이란?

Google Cloud Discovery Engine은 구글 클라우드 플랫폼에서 제공하는 검색 및 추천 서비스로, 웹사이트나 앱 내에서 사용자가 원하는 정보를 쉽고 빠르게 찾을 수 있도록 도와주는 서비스로 다음과 같은 특징을 가진다.

  • 고급 검색 기능 : 단순 키워드 검색이 아닌, 사용자의 의도에 맞춰 의미를 파악하고 관련 콘텐츠를 제안하는 자연어 처리(NLP) 기반 검색을 지원
  • 개인화된 추천 : 머신러닝 기반 추천엔진을 활용, 취향과 행동 패턴에 맞춘 추천 콘텐츠 제공
  • 확장 가능성 : 다양한 규모와 범위의 콘텐츠에 대해 빠른 검색 및 추천 성능유지

2. 문제상황

Google cloud discovery engine을 활용해 rag를 고도화 시도하던 중, 기존 데이터베이스의 단순 question, answer 필드구조를 csv형태로 업로드하던 방식을 벗어나 metadata, description 필드를 구성하고자 하였다. content필드를 만족하는 데이터 구조를 구성하기 위해 기존 데이터셋을 discovery engine이 요구하는 특정 struct_value, string_value 타입의 jsonl 포맷으로 변환하는 과정에서 여러 에러를 만나게 되었다.

2-1. 기존 question, answer를 유지한 채 content를 변경 (실패)

{"id":"doc1","content":{"question":"어떤 기능에 대한 질문","answer":"기능에 대한 자세한 설명", "metadata":"메타데이터"}}

 

[invalid JSON in google.cloud.discoveryengine.v1 main.Document @ content:...] [near 1:42 (offset 41): no such field: 'question']  

* 그 외 title, text 같은 여러 필드로도 시도해 보았지만, 여전히 제공하지 않는 필드 에러 발생  

2-2. content를 json 객체가 아닌 문자열로 변경 (실패)

{"id":"doc1","content":"내용", "question":"질문", "answer":"답변"}

[invalid JSON in google.cloud.discoveryengine.v1 main.Document, near 1:1 (offset 0): unexpected character: 'j'; expected '{']

3. 정상적인 데이터 포맷

2-1, 2-2 외에도 기존에 사용하던 document db포맷을 생각하며 다양한 시도를 해보았지만 모두 실패하였고, 역시 공식문서를 꼼꼼히 확인했어야 했다.

  • struct_value : json 객체를 저장하는 경우
  • string_value : 단순 문자열로 저장하는 경우

(두 가지 중 한 가지만 사용 가능하다. )

{"id": "1", "struct_data": {"name": "이름입니다.", "description": "설명", "feature1": "특징1", "features2": ["feature2-1", "feature2-2"]}}
{"id": "2", "struct_data": {"name": "이름2입니다.", "description": "설명2.", "feature1": "특징1", "features2": ["feature2-1", "feature2-2"]}}

[다음과 같이 struct_data로 규격화된 데이터를 명시해 주면 정상적으로 업로드가 가능하다.] 

참고