Skip to content

Commit bd112be

Browse files
authored
Merge pull request #27 from ghost242/post/ai/rag
Post/ai/rag
2 parents 7810e92 + 8c35f7e commit bd112be

4 files changed

Lines changed: 182 additions & 0 deletions

File tree

docs/ai/index.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
layout: default
3+
title: AI
4+
has_children: true
5+
has_toc: true
6+
nav_order: 1
7+
---
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
---
2+
layout: post
3+
title: Prolog으로 살펴보는 지식 베이스의 구조
4+
subtitle: 관계를 중심으로 지식을 표현하는 방법
5+
parent: RAG
6+
grand_parent: AI
7+
comments: true
8+
categories: ["Programming", "RAG", "Knowledge Base"]
9+
tag: ["Knowledge Base", "Logic programming", "Prolog"]
10+
---
11+
12+
## 지식 베이스란 무엇인가
13+
14+
데이터베이스는 보통 “값(value)”을 저장하고 관리하기 위한 구조다. 하지만 현실의 많은 문제는 단순히 데이터를 개별적으로 다루는 것 보다, 데이터의 대상 간의 관계와 의미를 표현하는 것이 더 중요하다.
15+
16+
예를 들어 “CPU는 메인보드의 일부이다”, “메인보드는 컴퓨터의 일부이다”라는 정보는 데이터라기보다 지식(knowledge) — 즉, 관계로 이루어진 사실이다.
17+
18+
이렇게 사실(facts)과 관계(rules)를 체계적으로 표현해두고, 시스템이 그 관계를 기반으로 새로운 결론을 추론(inference) 할 수 있도록 만든 구조가 바로 `지식 베이스(Knowledge Base)`이다.
19+
20+
## Prolog의 기본 문법 요약
21+
22+
`Prolog`는 이런 지식 구조를 기술하기에 적합한 Logic programming 패러다임을 기반으로 하는 언어이다. 절차를 명령하는 대신, 무엇이 참인가를 선언하는 방식으로 동작한다. 이 글에서는 지식 구조를 표현하기위해 `Prolog`를 활용하고, 최대한 간단하게 문법 구조를 설명한다.
23+
24+
`Prolog`의 핵심 구성 요소는 세 가지다:
25+
26+
1. `사실(Fact)`: “A는 B의 일부이다.” 같은 참인 문장
27+
28+
2. `규칙(Rule)`: “A가 B의 일부이거나, B가 C의 일부이면 A는 C의 일부이다.” 같은 논리적 정의
29+
30+
3. `질의(Query)`: “CPU는 컴퓨터의 일부인가?” 같은 질문
31+
32+
예를 들어 문법은 다음처럼 간단하다.
33+
34+
```prolog
35+
fact. % 사실
36+
rule :- condition. % 규칙
37+
?- query. % 질의
38+
```
39+
40+
이 구조를 통해 `Prolog`는 데이터가 아닌 논리적 관계를 저장하고 추론한다.
41+
42+
## 예제: 컴퓨터 부품을 이용한 지식 베이스
43+
44+
이재 지식 베이스를 이해하기 위해 예제로 컴퓨터의 구성 관계를 Prolog 문법을 활용해서 표현해보려고 한다.
45+
46+
### 사실 정의
47+
48+
먼저 각 부품이 어떤 구성 요소에 속하는지를 사실로 정의한다.
49+
50+
```prolog
51+
% 상위 구조
52+
part_of(motherboard, computer).
53+
part_of(power_supply, computer).
54+
part_of(storage, computer).
55+
part_of(case, computer).
56+
part_of(peripheral, computer).
57+
58+
% 메인보드 구성
59+
part_of(cpu, motherboard).
60+
part_of(memory, motherboard).
61+
part_of(gpu, motherboard).
62+
part_of(chipset, motherboard).
63+
64+
% CPU 내부 구성
65+
part_of(core, cpu).
66+
part_of(cache, cpu).
67+
part_of(alu, cpu).
68+
part_of(control_unit, cpu).
69+
70+
% 저장 장치 구성
71+
part_of(hard_disk, storage).
72+
part_of(ssd, storage).
73+
74+
% 주변 장치 구성
75+
part_of(keyboard, peripheral).
76+
part_of(mouse, peripheral).
77+
part_of(monitor, peripheral).
78+
part_of(speaker, peripheral).
79+
```
80+
81+
이것은 “CPU는 메인보드의 일부이다”, “메인보드는 컴퓨터의 일부이다”와 같은 기초 지식*이다.
82+
83+
### 규칙 정의
84+
85+
이제 이 관계를 바탕으로 더 넓은 의미의 포함 관계를 추론하는 규칙을 정의할 수 있다.
86+
87+
```prolog
88+
is_part_of(X, Y) :- part_of(X, Y).
89+
is_part_of(X, Y) :- part_of(X, Z), is_part_of(Z, Y).
90+
```
91+
92+
이 규칙은
93+
94+
* X가 Y의 직접적인 부품이면 참이다.
95+
* X가 Z의 부품이고, Z가 Y의 일부라면, X도 Y의 일부로 본다.
96+
97+
즉, 계층적인 관계를 재귀적으로 추론하도록 만든 것이다.
98+
99+
### 질의 수행
100+
101+
이제 시스템에 질문을 던져보자.
102+
103+
```prolog
104+
?- is_part_of(cpu, computer).
105+
```
106+
107+
Prolog는 다음과 같은 과정을 통해 결과를 찾아낸다.
108+
109+
```plaintext
110+
alu → cpu → motherboard → computer
111+
```
112+
113+
결과: `true.`
114+
115+
또는 컴퓨터에 포함된 모든 부품을 물을 수도 있다.
116+
117+
```prolog
118+
?- is_part_of(X, computer).
119+
```
120+
121+
출력:
122+
123+
```plaintext
124+
X = motherboard ;
125+
X = cpu ;
126+
X = memory ;
127+
X = gpu ;
128+
X = chipset ;
129+
X = core ;
130+
X = cache ;
131+
X = alu ;
132+
X = control_unit ;
133+
X = power_supply ;
134+
X = storage ;
135+
X = hard_disk ;
136+
X = ssd ;
137+
X = case ;
138+
X = peripheral ;
139+
X = keyboard ;
140+
X = mouse ;
141+
X = monitor ;
142+
X = speaker.
143+
```
144+
145+
이 결과는 지식 베이스가 단순한 데이터 저장소가 아니라, 관계 정의만으로 논리적 전체 구조를 스스로 탐색하는 시스템임을 보여준다.
146+
147+
## 결론
148+
149+
이 간단한 예제는 지식 베이스의 핵심 구조를 이해하기 위해 작성했따. 지식 베이스는 데이터를 나열하는 것이 아니라, 데이터로 표현되는 사물 간의 관계를 정의하고 그 관계를 통해 새로운 사실(fact)을 추론하는 시스템이다.
150+
151+
Prolog는 이러한 구조를 가장 단순하고 명확한 형태로 표현할 수 있게 해준다. 즉, “무엇을 할 것인가”가 아니라 “무엇이 참인가”를 선언하고, 그로부터 시스템이 스스로 답을 찾아내는 방식을 실험할 수 있는 언어다. 이 언어의 문법을 이용해 사실을 나열하고 규칙을 정의한 뒤 질의를 통해 지식을 인출하는 방식을 표현했다.
152+
153+
이것이 지식 베이스의 본질이며, 오늘날의 인공지능이 다루는 지식 표현(knowledge representation)의 출발점이다.

docs/ai/rag/index.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
layout: default
3+
title: RAG
4+
parent: AI
5+
has_children: true
6+
has_toc: true
7+
nav_order: 1
8+
---

docs/graph_rag.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
Graph와 Knowledge base에 대해서
2+
3+
개요
4+
5+
나는 지식을 머릿속에 막연히 나열하는것 보다는 대표 키워드를 중심으로 구조화 하고 키워드간의 관계를 구축하는 것이 기억에도 유리하고, 관련 지식을 다양하게 꺼내는데도 도움이 된다는 것을 감각적으로 느끼고 있었다. 하지만 LLM은 어떻게 하고있고, Graph로 구조화된 지식을 어떻게 다루게 하는지에 대해서는 최근에 알게 되었다. 이 문서는 그렇게 최근에 알게된, Knowledge base를 Graph로 구조화 하는것과 LLM과의 통합에 대해 간략하게 정리하는 것을 목표로 한다.
6+
7+
Knowledge base
8+
9+
대표 키워드로 정의되는 지식과, 지식들 간의 관계를 정의해야 한다는 것이 어떤 의미인지는 최근까지 이해하지 못하고 있었다. 알았다면 <프로그래밍 언어> 강의를 들을 때 `Prolog` 언어를 이해하는데 도움이 되었을 것이다. 당장 떠오르는 사례가 Prolog 이기 때문에, 간단하게 Prolog 문법으로 표현된 database를 이용해서 정리해보려고 한다.
10+
11+
Prolog
12+
13+
Logical Programming 이라는 언어 패러다임을 갖고있는 Prolog는 Procedure Language를 패러다임으로 갖고있는 언어들과는 구조가 너무 달라서 이해하기 어려웠으나, 코드가 순차실행되지 않는다는 사실만 받아들이면 된다. 이 특징은 현대에 연구되고있는 Functional language 패러다임 언어에서도 나타나는 특징이기 때문에 지금은 비교적 쉽게 샘플 코드를 얻을 수 있다.
14+

0 commit comments

Comments
 (0)