diff --git a/src/main/java/com/going/server/domain/rag/service/CypherQueryGenerator.java b/src/main/java/com/going/server/domain/rag/service/CypherQueryGenerator.java index 7a9be04..472c42f 100644 --- a/src/main/java/com/going/server/domain/rag/service/CypherQueryGenerator.java +++ b/src/main/java/com/going/server/domain/rag/service/CypherQueryGenerator.java @@ -14,32 +14,38 @@ public class CypherQueryGenerator { public String generate(String userQuestion) { String prompt = """ - 당신은 Neo4j 그래프 데이터베이스에서 정보를 추출하기 위한 Cypher 쿼리를 생성하는 AI입니다. - - - 주어진 질문에서 핵심 개념과 연관된 개념들을 찾아야 합니다. - - 질문에 포함된 키워드와 의미적으로 밀접한 노드 쌍 간의 관계(triple)를 추출해야 합니다. - - 반드시 관계 중심 구조 (시작 노드, 관계 라벨, 도착 노드)를 반환하는 Cypher 쿼리를 작성하세요. - - 관계나 노드에 포함된 설명 문장 중 하나를 함께 반환하세요. (r.sentence → 없으면 a.includeSentence → 없으면 b.includeSentence 순으로) - - 반환 항목은 다음과 같아야 합니다: - sourceLabel, relationLabel, targetLabel, sentence, nodeLabel - - 코드는 반드시 Cypher 쿼리 한 줄만 출력하며, 코드블록이나 설명은 포함하지 마세요. + 당신은 Neo4j 그래프 데이터베이스에서 정보를 추출하는 Cypher 쿼리를 생성하는 AI입니다. + + - 사용자 질문에 포함된 복합 명사(예: "지구형 행성")는 의미 단위로 분리해서, + 해당 단어 각각이 포함된 노드도 함께 탐색할 수 있도록 쿼리를 작성하세요. + - 예를 들어 "지구형 행성과 관련된 개념"이라면, + "지구형", "행성", "지구형 행성" 모두를 쿼리 조건에 포함해야 합니다. + - 관계(triple)는 (시작 노드)-[관계]->(도착 노드) 형식으로 추출하세요. + - 설명 문장도 함께 조회하세요. (r.sentence → a.includeSentence → b.includeSentence) + - 반환 항목: + sourceLabel, relationLabel, targetLabel, sentence, nodeLabel + - 코드는 Cypher 한 줄만 출력하며, 설명이나 코드블록 없이 작성하세요. + - LIMIT은 5로 설정하세요. + + 예시 질문: 지구형 행성과 관련된 개념들을 알려줘 + → + MATCH (a:GraphNode)-[r:RELATED]-(b:GraphNode) + WHERE + toLower(a.label) =~ '.*지구형.*' OR toLower(b.label) =~ '.*지구형.*' OR + toLower(a.label) =~ '.*행성.*' OR toLower(b.label) =~ '.*행성.*' OR + toLower(a.label) =~ '.*지구형 행성.*' OR toLower(b.label) =~ '.*지구형 행성.*' + RETURN + a.label AS sourceLabel, + r.label AS relationLabel, + b.label AS targetLabel, + COALESCE(r.sentence, a.includeSentence, b.includeSentence, "") AS sentence, + a.label AS nodeLabel + LIMIT 5 + + 질문: "%s" + → + """.formatted(userQuestion); - 예시: - 질문: "고래와 관련된 개념들을 알려줘" - → - MATCH (a:GraphNode)-[r:RELATED]-(b:GraphNode) - WHERE toLower(a.label) CONTAINS toLower('고래') OR toLower(b.label) CONTAINS toLower('고래') - RETURN - a.label AS sourceLabel, - r.label AS relationLabel, - b.label AS targetLabel, - COALESCE(r.sentence, a.includeSentence, b.includeSentence, "") AS sentence, - a.label AS nodeLabel - LIMIT 15 - - 질문: "%s" - → - """.formatted(userQuestion); return openAIService.getCompletionResponse( List.of(new ChatMessage("user", prompt)),