요즘 전 세계적으로 대단한 화제를 몰아가고 있는 ChatGPT를 사용해 보았다.
직업이 소프트웨어 엔지니어인지라 코드 생성에 관한 소문이 사실인지 확인하기 위해 몇 가지 질문을 던져보았다.

첫 번째 질문은 간단한 2개의 숫자를 다하는 함수를 만들어달라는 것이었다.
Implement a function that adds two input integer parameter and returns in Java
응답은 빨랐는데,
Certainly! Here's a simple Java function that adds two integer parameters and returns the result:
아래는 생성된 코드다.
public class AddTwoIntegers {
public static int add(int a, int b) {
return a + b;
}
public static void main(String[] args) {
int num1 = 5;
int num2 = 7;
int sum = add(num1, num2);
System.out.println("The sum of " + num1 + " and " + num2 + " is: " + sum);
}
}
실행가능하도록 코드가 생성된다는 점이 특징인 것 같은데 편리하긴 한데 사실 위의 add란 함수는 닥치고 Ctrl-C / Ctrl-V 해서 쓸 수 없는 코드다. 왜냐하면 입력을 Check 하지 않기 때문이다.
얼핏 보기엔 문제없어 보이는데 동적 테스트를 통과하기 힘들다.
보통 인간이 (?) 프로그램을 만든다면 이런 식으로 한다.
public static int add(int a, int b)
{
if(a >= Integer.MAX_VALUE || a <= Integer.MIN_VALUE) return POSSIBLE_OVERFLOW;
if(b >= Integer.MAX_VALUE || b <= Integer.MIN_VALUE) return POSSIBLE_OVERFLOW;
return a + b;
}
두 번째 질문은 간단한 알고리즘에 대한 것이었는데 BFS(Breadth First Search) 알고리즘을 구현해 달라는 것이었다.
질문은 (Prompt라고 한다)
Can you implement BFS in Java?
Implement BFS in Java
How to develop BFS in Java
위와 같이 3개 던졌는데 모두 같은 결과가 나왔다. 이런 질문하는 행위는 Prompt Engineering이라고 불리는 모양인데 쉽게 말해 ChatGPT와 같은 거대 언어 모델로부터 높은 품질의 응답을 얻어낼 수 있는 프롬프트 입력값들의 조합을 찾는 작업을 의미한다고 한다.
즉, 질문을 잘 하라는 말이다. 질문에 따라 답이 틀려진다는 의미인데 맞는 말이다. 현실에서도 마찬가지다.
질문 내용과 수준을 보면 질문자의 수준이 보인다.
내가 던진 위의 질문이 너무 비슷해서 변별력이 없어서 그런지 모르겠는데 결과는 모두 같았다.
import java.util.LinkedList;
import java.util.Queue;
class Graph {
private int vertices;
private LinkedList<Integer>[] adjacencyList;
public Graph(int vertices) {
this.vertices = vertices;
this.adjacencyList = new LinkedList[vertices];
for (int i = 0; i < vertices; i++) {
this.adjacencyList[i] = new LinkedList<>();
}
}
public void addEdge(int source, int destination) {
adjacencyList[source].add(destination);
}
public void BFS(int startNode) {
boolean[] visited = new boolean[vertices];
Queue<Integer> queue = new LinkedList<>();
visited[startNode] = true;
queue.add(startNode);
while (!queue.isEmpty()) {
int currentNode = queue.poll();
System.out.print(currentNode + " ");
for (int neighbor : adjacencyList[currentNode]) {
if (!visited[neighbor]) {
visited[neighbor] = true;
queue.add(neighbor);
}
}
}
}
}
public class BFSExample {
public static void main(String[] args) {
Graph graph = new Graph(6);
// Adding edges to the graph
graph.addEdge(0, 1);
graph.addEdge(0, 2);
graph.addEdge(1, 3);
graph.addEdge(2, 4);
graph.addEdge(2, 5);
System.out.println("BFS starting from node 0:");
graph.BFS(0);
}
}
눈으로 보기에 맞는것 같은데 문제는 질문에 상관없이 결과가 같다는 것이다. 질문이 워낙 간단해서 어떻게 질문을 던져야 차이가 나는 코드를 얻을 수 있을지는 모르겠으나 코드 생성의 측면에서만 보면 이걸 생성형 AI라고 보기엔 힘들지 않을까 생각한다.
오히려 오버 피팅된 AI 가 아닌가 하는 생각이 들기도 한다. 사실 BFS와 같은 간단한 알고리즘이 위의 코드 이상의 다양한 방식이 있을 수는 없을 것으로 생각하는데 최소한 변수명이라도 다르기를 기대했었다.
혹자는 프로그래머의 시대는 끝나가고 있다고 말하기도 하고 그 점에서는 어느정도는 동의하지만 만약 이런 식의 생성형 AI에 의해 어떤 프로젝트가 나온다고 한다면 설계 방식이 조금은 달라져야 하지 않을까 하는 생각도 든다. 고도로 신뢰할 수는 없지만 어느 정도의 신뢰성은 보장할 수 있는 코드를 만들어 낸다고 한다면 시스템의 아키텍처도 이런 중간 정도의 신뢰성을 이용할 수 있는 구조로 변화되어야하지 않을까 생각한다.
한편으로 생성된 소스를 보고있자니 소스 코드의 구조와 변수명 규칙, Indent 등과 같은 요소를 중요시하는 엔지니어에게는 이 생성형 AI가 그다지 크게 와닿지 않을 것 같기도 하다. 하지만 한 가지 확실한 것은 인간을 상대하는 것보다는 마음이 편하다는 것이다.
어쩌면 톰 드마르코(Tom DeMarco)와 티모시 리스터 (Timothy Lister) 두 양반은 Peopleware를 다시 써야 할지도 모르겠다.
'일상' 카테고리의 다른 글
마지막 프로젝트를 끝내며.. (1) | 2024.03.26 |
---|---|
코로나 바이러스 - 프로그래밍? (0) | 2024.01.09 |
늙은 개발자 (4) | 2024.01.03 |
아이폰과 갤럭시 (0) | 2023.12.14 |
왕모, 안녕 나의 소녀 시절이여 (2) | 2023.12.08 |