개발자가 효과적으로 프롬프트 디자인하는 방법

ChatGPT와 상호작용할 때, 모델이 원하는 바를 명확하고 간결하게 제공하는 것이 중요합니다. 이 장에서는 좋은 프롬프트의 구성을 세분화하고 효과적인 프롬프트를 작성하는 몇 가지 팁을 제공할 것입니다.

프롬프트의 핵심 요소

프롬프트는 여러 가지 요소로 이루어져 있으며, 각각이 언어 모델이 생성하는 결과물을 형성하는 데 중요한 역할을 합니다. 프롬프트의 주요 구성 요소는 다음과 같습니다

1. 페르소나 (Persona)

페르소나는 인격을 뜻하는 라틴어로서, AI는 간단한 정보로 사용자를 파악해야 합니다.
페르소나 요소는 언어 모델이 생성하는 결과물을 특정 맥락이나 정체성을 제공합니다. 페르소나를 정의함으로써 언어 모델을 특정 시나리오나 대상을 고려한 결과물을 생성할 수 있습니다. 페르소나는 사용자의 배경, 전문 지식, 선호도, 또는 기타 특성에 관한 정보를 포함할 수 있습니다.

2. 작업 설명 (Task Description)

작업 설명은 프롬프트의 핵심으로, 언어 모델에 수행해야 할 작업을 명확하게 설명해야 합니다. 작업 설명은 구체적이고 모호하지 않아야 하며, 모든 관련 세부 사항이 포함되어야 합니다. 또한 간결하고 쉽게 이해할 수 있어야 합니다.

3. 컨텍스트 (Context)

컨텍스트는 언어 모델이 더 정확하고 관련성 높은 결과물을 생성하는 데 사용할 수 있는 추가 정보를 제공합니다. 컨텍스트에는 샘플 입력 또는 출력, 관련 작업 또는 개념, 또는 요청하는 것을 더 잘 이해할 수 있도록 도와줄 수 있는 기타 정보가 포함될 수 있습니다.

4. 제약 조건 (Constraints)

제약 조건은 결과물을 생성할 때 고려해야 할 제한 사항이나 요구 사항입니다. 예를 들어, 최대 출력 길이, 결과물의 특정 형식 또는 구조, 또는 만족해야 할 기타 조건을 지정할 수 있습니다.

5. 예시 (Examples)

예시는 언어 모델이 작업을 올바르게 수행하는 방법을 학습하는 데 도움이 되는 샘플 입력과 출력입니다. 원하는 결과물의 동작을 보여주기 위해 하나 이상의 예시를 제공할 수 있습니다.

6. 프롬프트 (Prompts)

프롬프트는 언어 모델을 특정 유형의 결과물로 이끌기 위해 포함될 수 있는 추가 구문이나 문장입니다. 프롬프트는 언어 모델이 더 나은 결과물을 생성할 수 있는 힌트, 제약 사항 또는 제안을 제공할 수 있습니다.

효과적인 프롬프트로의 개선

위 가이드라인을 활용하여 프롬프트를 보다 명확하고 효과적으로 만들어봅시다.

페르소나: 나는 다양한 프로젝트에서 클래스를 생성하는 데 경험이 있는 숙련된 C# 프로그래머입니다.
작업 설명: 이름과 나이를 가진 사람을 나타내는 C# 클래스를 생성하세요. 데이터 유효성 검사와 간단한 오류/예외 처리를 포함해 주세요.
컨텍스트 : 사람에 대한 정보를 저장해야 하는 새로운 프로젝트를 진행 중입니다. 이름과 나이를 가진 사람을 나타내는 C# 클래스를 생성해야 합니다.
제약조건: 클래스 이름은 “Person”이어야 합니다. 이름은 문자열이고, 나이는 정수입니다.
예시: 다음처럼 입력과 출력이 되어야 합니다.
입력: Person p = new Person(“Haro”, 30); 출력: p.Name == “Haro”, p.Age == 30
입력: Person p = new Person(“Studio”, 42); 출력: p.Name == “Studio”, p.Age == 42
프롬프트: 이름과 나이를 인수로 받는 Person 클래스의 생성자를 작성해 보세요.

위 사항을 뭉뚱그려서 다음처럼 ChatGPT에게 요청을 해 보겠습니다.

나는 다양한 프로젝트에서 클래스를 생성하는 데 경험이 있는 숙련된 C# 프로그래머입니다.
이름과 나이를 가진 사람을 나타내는 C# 클래스를 생성하세요. 데이터 유효성 검사와 간단한 오류/예외 처리를 포함해 주세요.
사람에 대한 정보를 저장해야 하는 새로운 프로젝트를 진행 중입니다. 이름과 나이를 가진 사람을 나타내는 C# 클래스를 생성해야 합니다.
클래스 이름은 "Person"이어야 합니다. 이름은 문자열이고, 나이는 정수입니다.
Main 함수에서 다음처럼 입력과 출력이 되어야 합니다.
입력: Person p = new Person("Haro", 30); 출력: p.Name == "Haro", p.Age == 30
입력: Person p = new Person("Studio", 42); 출력: p.Name == "Studio", p.Age == 42
이름과 나이를 인수로 받는 Person 클래스의 생성자를 작성해 보세요.

물론이죠! 이름과 나이를 가진 Person 클래스를 생성해 보겠습니다. 데이터 유효성 검사와 간단한 오류/예외 처리도 함께 추가하도록 하겠습니다.

using System;

class Person
{
    private string _name;
    private int _age;

    public string Name
    {
        get { return _name; }
        set
        {
            if (!string.IsNullOrEmpty(value))
            {
                _name = value;
            }
            else
            {
                throw new ArgumentException("이름은 비어 있을 수 없습니다.");
            }
        }
    }

    public int Age
    {
        get { return _age; }
        set
        {
            if (value >= 0 && value <= 150)
            {
                _age = value;
            }
            else
            {
                throw new ArgumentOutOfRangeException("나이는 0에서 150 사이여야 합니다.");
            }
        }
    }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

위 코드는 이름과 나이를 저장하는 Person 클래스를 정의하고 있습니다. 이제 이 클래스를 사용하는 방법을 보여줄게요. 입력과 출력 예제는 아래와 같습니다.

using System;

class Program
{
    static void Main()
    {
        try
        {
            Person p1 = new Person("Haro", 30);
            Console.WriteLine($"p1.Name == \"{p1.Name}\", p1.Age == {p1.Age}");

            Person p2 = new Person("Studio", 42);
            Console.WriteLine($"p2.Name == \"{p2.Name}\", p2.Age == {p2.Age}");
        }
        catch (ArgumentException e)
        {
            Console.WriteLine($"예외 발생: {e.Message}");
        }
        catch (ArgumentOutOfRangeException e)
        {
            Console.WriteLine($"예외 발생: {e.Message}");
        }
    }
}

위 코드는 입력한 이름과 나이를 가진 Person 객체를 생성하고, 예외가 발생하는 경우 해당 예외를 콘솔에 출력합니다. 사용자가 잘못된 입력을 할 때 프로그램이 예외를 처리할 수 있도록 만들었어요.

다음은 필자가 당장 필요한 프로그램이 있습니다. ChatGPT 에게 요청 해 보겠습니다.

c# 멀티 클라이언트 접속 비동기 서버를 만드는데 각 세션을 관리할 수 있는 클래스가 필요합니다. 받은 데이터는 Type Length Value 헤더가 포함되어 있는 구조입니다. 데이터는 Type 이 반드시 1 이어야만 하는 정합성 체크가 필요하며 데이터를 받았을때 모든 클라이언트들에게 Type 2 로 데이터를 보내는 구조입니다. 헤더 구조체를 포함하여 만들어 주세요

알겠습니다, 멀티 클라이언트 접속 비동기 서버를 위한 세션 관리 클래스를 만들어 보겠습니다. 먼저, Type Length Value (TLV) 헤더를 가진 데이터를 다루기 위한 구조체를 만들어 보겠습니다.

using System;
using System.Collections.Concurrent;
using System.Net.Sockets;
using System.Threading.Tasks;

public struct TLVHeader
{
    public int Type { get; set; }
    public int Length { get; set; }
    // 추가 필요한 다른 필드들
}

public class ClientSession
{
    private readonly TcpClient _client;
    private readonly NetworkStream _stream;

    public ClientSession(TcpClient client)
    {
        _client = client;
        _stream = _client.GetStream();
    }

    public async Task HandleClient()
    {
        try
        {
            while (true)
            {
                // 데이터를 읽기 위한 코드
                TLVHeader header = await ReadHeaderAsync();
                if (header.Type == 1)
                {
                    // Type 1 데이터를 처리하는 로직
                    // 모든 클라이언트들에게 Type 2 데이터를 보내는 로직
                    await BroadcastToClientsAsync(2, new byte[/* 데이터 길이 */]);
                }
                // 다른 타입에 따른 로직 추가
            }
        }
        catch (Exception ex)
        {
            // 오류 처리
        }
    }

    private async Task<TLVHeader> ReadHeaderAsync()
    {
        // TLV 헤더를 읽는 코드
        // 네트워크에서 데이터를 받아서 TLVHeader 구조체로 파싱하는 로직
    }

    private async Task BroadcastToClientsAsync(int type, byte[] data)
    {
        // 모든 클라이언트에게 Type 2 데이터를 보내는 코드
        // 세션 관리 클래스 내에서 모든 클라이언트에게 데이터를 보내는 로직
    }
}

public class Server
{
    private readonly TcpListener _listener;
    private readonly ConcurrentBag<ClientSession> _sessions = new ConcurrentBag<ClientSession>();

    public Server(int port)
    {
        _listener = new TcpListener(System.Net.IPAddress.Any, port);
    }

    public async Task Start()
    {
        _listener.Start();
        while (true)
        {
            TcpClient client = await _listener.AcceptTcpClientAsync();
            ClientSession session = new ClientSession(client);
            _sessions.Add(session);
            _ = session.HandleClient(); // 각 클라이언트 세션을 비동기적으로 처리
        }
    }
}

이 코드는 멀티 클라이언트를 관리하고 TLV 헤더를 처리하여 Type 1 데이터를 받으면 모든 클라이언트에게 Type 2 데이터를 보내는 기본적인 구조를 갖추고 있습니다. 필요한 추가 기능이나 세부적인 구현은 여기에 추가하실 수 있습니다.

정말 깔끔하게 코드를 작성해 주었습니다.

결론

이 수정된 프롬프트는 C# 클래스에 대한 요구사항을 보다 명확하게 하고 클래스에 명확한 이름을 제공합니다. 이 프롬프트로 ChatGPT는 정확한 요구 사항을 충족하는 클래스를 생성할 수 있습니다. 소프트웨어 엔지니어로서 여러분은 이처럼 AI 엔진에게 품질 높은 코드를 생성하도록 안내하는 방법을 알아야 합니다. 이것은 비 프로그래머가 알지 못하는 것이며, AI 도구는 개발자를 대체하는 것이 아니라 좋은 개발자를 양성하는 좋은 수단입니다.

Leave a Comment