Skip to content

Commit 1d98979

Browse files
committed
⚡️ [Perf] GraphRAG 검색 쿼리 생성 시 복합 개념 분리 검색 유도
1 parent 4d590d7 commit 1d98979

File tree

1 file changed

+31
-25
lines changed

1 file changed

+31
-25
lines changed

src/main/java/com/going/server/domain/rag/service/CypherQueryGenerator.java

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,32 +14,38 @@ public class CypherQueryGenerator {
1414

1515
public String generate(String userQuestion) {
1616
String prompt = """
17-
당신은 Neo4j 그래프 데이터베이스에서 정보를 추출하기 위한 Cypher 쿼리를 생성하는 AI입니다.
18-
19-
- 주어진 질문에서 핵심 개념과 연관된 개념들을 찾아야 합니다.
20-
- 질문에 포함된 키워드와 의미적으로 밀접한 노드 쌍 간의 관계(triple)를 추출해야 합니다.
21-
- 반드시 관계 중심 구조 (시작 노드, 관계 라벨, 도착 노드)를 반환하는 Cypher 쿼리를 작성하세요.
22-
- 관계나 노드에 포함된 설명 문장 중 하나를 함께 반환하세요. (r.sentence → 없으면 a.includeSentence → 없으면 b.includeSentence 순으로)
23-
- 반환 항목은 다음과 같아야 합니다:
24-
sourceLabel, relationLabel, targetLabel, sentence, nodeLabel
25-
- 코드는 반드시 Cypher 쿼리 한 줄만 출력하며, 코드블록이나 설명은 포함하지 마세요.
17+
당신은 Neo4j 그래프 데이터베이스에서 정보를 추출하는 Cypher 쿼리를 생성하는 AI입니다.
18+
19+
- 사용자 질문에 포함된 복합 명사(예: "지구형 행성")는 의미 단위로 분리해서,
20+
해당 단어 각각이 포함된 노드도 함께 탐색할 수 있도록 쿼리를 작성하세요.
21+
- 예를 들어 "지구형 행성과 관련된 개념"이라면,
22+
"지구형", "행성", "지구형 행성" 모두를 쿼리 조건에 포함해야 합니다.
23+
- 관계(triple)는 (시작 노드)-[관계]->(도착 노드) 형식으로 추출하세요.
24+
- 설명 문장도 함께 조회하세요. (r.sentence → a.includeSentence → b.includeSentence)
25+
- 반환 항목:
26+
sourceLabel, relationLabel, targetLabel, sentence, nodeLabel
27+
- 코드는 Cypher 한 줄만 출력하며, 설명이나 코드블록 없이 작성하세요.
28+
- LIMIT은 5로 설정하세요.
29+
30+
예시 질문: 지구형 행성과 관련된 개념들을 알려줘
31+
32+
MATCH (a:GraphNode)-[r:RELATED]-(b:GraphNode)
33+
WHERE
34+
toLower(a.label) =~ '.*지구형.*' OR toLower(b.label) =~ '.*지구형.*' OR
35+
toLower(a.label) =~ '.*행성.*' OR toLower(b.label) =~ '.*행성.*' OR
36+
toLower(a.label) =~ '.*지구형 행성.*' OR toLower(b.label) =~ '.*지구형 행성.*'
37+
RETURN
38+
a.label AS sourceLabel,
39+
r.label AS relationLabel,
40+
b.label AS targetLabel,
41+
COALESCE(r.sentence, a.includeSentence, b.includeSentence, "") AS sentence,
42+
a.label AS nodeLabel
43+
LIMIT 5
44+
45+
질문: "%s"
46+
47+
""".formatted(userQuestion);
2648

27-
예시:
28-
질문: "고래와 관련된 개념들을 알려줘"
29-
30-
MATCH (a:GraphNode)-[r:RELATED]-(b:GraphNode)
31-
WHERE toLower(a.label) CONTAINS toLower('고래') OR toLower(b.label) CONTAINS toLower('고래')
32-
RETURN
33-
a.label AS sourceLabel,
34-
r.label AS relationLabel,
35-
b.label AS targetLabel,
36-
COALESCE(r.sentence, a.includeSentence, b.includeSentence, "") AS sentence,
37-
a.label AS nodeLabel
38-
LIMIT 15
39-
40-
질문: "%s"
41-
42-
""".formatted(userQuestion);
4349

4450
return openAIService.getCompletionResponse(
4551
List.of(new ChatMessage("user", prompt)),

0 commit comments

Comments
 (0)