다양한 작업을 수행하는 예시들을 통해서 좀 더 핵심 개념을 살펴보도록하겠습니다. 이번 글에서 이 글을 읽으시는 개발자님들의 관심이 될만한 주제이니 끝까지 읽어주시면 감사하겠습니다.
요즘 인스타 혹은 유튜브 보면 생성형 ai에 대한 홍보성 글과 유용한 정보들이 올라오고있습니다. 가령 유투브 비디오를 글로 요약해주거나
논문을 요약해주거나 이력서를 대신 써주는 사이트들이 있습니다. 이러한 서비스들이 어떤 식으로 프롬프트에서 작동되는지 예시로써 보겠습니다.
1. 문장요약
문장요약은 자연어 생성의 대표적인 작업 중 하나 입니다. 문장 요약은 여러 주제와 도메인을 포함합니다. 사실, 언어 모델의 가장 유망한 어플리케이션 중 하나는 기사와 개념을 빠르고 읽기 쉽게 요약할 수 있는 능력입니다. 프롬프트를 사용하여 간단한 요약 작업을 시도해 봅시다.
Prompt :
항생제애 대해 설명해 줘
A:
Output :
항생제는 세균 감염을 치료하기 위해 사용되는 약물의 일종입니다. 세균을 죽이거나 번식을 방지하여
신체의 면역 체계가 감염에 대항할 수 있도록 합니다. 항생제는 보통 알약, 캡슐, 액체의 형태로 경구 복용하거나
때때로 정맥 주사로 투여되기도 합니다. 항생제는 바이러스 감염에는 효과적이지 않고,
남용할 경우 항생제 내성이 생길 수 있습니다.
답변은 질의응답에 사용되는 명시적 프롬프트 형식을 띄고 있습니다. 이 예시가 유용한가는 다른 예시를 통해 말씀드리겠습니다.
만약 위에 답변 보다 더 많은 양의 정보라서 추가적인 요약이 필요하다고 가정을 해봅시다. 실제로 모델에게 다음과같이 한 문장으로 요약을 할수 있습니다.
Prompt :
항생제는 세균 감염을 치료하기 위해 사용되는 약물의 일종입니다. 세균을 죽이거나 번식을 방지하여
신체의 면역 체계가 감염에 대항할 수 있도록 합니다. 항생제는 보통 알약, 캡슐, 액체의 형태로 경구 복용하거나
때때로 정맥 주사로 투여되기도 합니다. 항생제는 바이러스 감염에는 효과적이지 않고,
남용할 경우 항생제 내성이 생길 수 있습니다.
위 내용을 한 문장으로 요약해 줘 :
Output :
항생제는 박테리아를 죽이거나 번식을 막음으로써 감염을 치료하는 데 사용되는 약이지만,
바이러스에 효과적이지 않고 과도한 사용은 항생제 내성을 초래할 수 있습니다.
이쁘지 않나요?? 이러한 것들을 Techiques에서 다시 다룰 예정이지만 이런식으로 나온 답변을 다시 요약할수도 있습니다.
2. 정보추출
언어 모델은 자연어 생성과 관련된 작업을 수행하도록 훈련되었지만 분류나 다양한 자연어 처리(NLP) 작업을 수행할 수도 있습니다.
주어진 단락에서 정보를 추출하는 프롬프트의 예시를 살펴보자
Prompt :
연구 논문의 저자 기여도 진술서과 사사는 저자들이 원고 작성과 분석에 ChatGPT
등 AI 기술을 사용했는지 여부와 범위를 명확하고 구체적으로 명시해야 합니다.
또한 어떤 LLM이 사용되었는지 표기해야 합니다. 이를 통해 편집자와 심사자가 잠재적 편향,
부정확성 및 부적절한 출처 등의 문제를 고려해 원고를 보다 신중하게 검토하도록 유도할 수 있습니다.
마찬가지로, 과학 저널은 투고된 원고 선정 시 LLM 사용 여부를 투명하게 공개해야 합니다.
위 단락에서 언급한 대규모언어모델 기반 제품을 알려줘.
Output :
위 단락에서 언급한 대규모언어모델 기반 제품은 ChatGPT입니다.
결과의 개선 방안은 여러가지가 있겠지만, 이미 그 자체로도 꽤 유용합니다.
여기까지 단순히 무엇을 할지 지시하는 것으로 모델이 다양한 작업을 수행할 수 있다는 사실을 깨달으셨을겁니다.
3. 질의응답
모델로부터 원하는 답변을 끌어내는 가장 좋은 방법 중 하나는 프롬프트 형식을 개선하는 것입니다. 앞서 살펴본 바와 같이 프로픔트는 지시, 문맥, 입력 데이터와 출력 지시자를 조합하여 더 나은 결과를 얻을 수 있스빈다. 이러한 요소는 필수적인 것은 아니지만, 지시가 구체적일수록 더 좋은 결과를 얻을 수 있습니다. 다음은 보다 구조화된 프롬프트를 실행해보도록하겠습니다.
Prompt :
아래 문맥을 고려해서 질문에 답변해 줘. 답변은 짧고 간결하게 해 줘. 답변이 정확하지 않다면,
「확실치 않은 대답」이라고 응답해 줘.
문맥: Teplizumab은 Ortho Pharmaceutical이라는 뉴저지의 제약 회사에서 유래했다.
그곳에서, 과학자들은 OKT3라는 항체의 초기 버전을 만들어 냈다. 원래 쥐에서 유래된 이 분자는 T 세포의 표면에 결합하여 세포를 죽이는 잠재력을 제한할 수 있다. 1986년, 신장 이식 후 장기 거부 반응 예방을 위해 승인되어 인간이 사용할 수 있는 최초의 치료용 항체가 되었다.
질문: OKT3는 어디서 유래했는가?
답변:
Output :
쥐.
4. 텍스트 분류
지금까지 우리는 간단한 지시를 사용하여 작업을 수행했습니다. 프롬프트 엔지니어로서 점점 더 나은 지시를 내리는것이 기본입니다.
하지만 더 나은 지시를 내리는것만 전부는 아닙니다. 더 까다로운 작업을 수행하기 위해서는 지시만으로는 충분하지 않다는 것을 깨닫게 될것이빈다.
문맥과 여러 요소들을 고려하여 적절한 프롬프트를 사용할 필요가 있습니다.
요소 : 입력 데이터 / 예시
텍스트 분류를 예시로 이를 설명해보자!
Prompt :
문장을 neutral, 부정 혹은 긍정으로 분류해 줘.
문구: 그 음식은 그럭저럭이었어.
감정:
Output :
Neutral
모델에게 텍스트 분류를 지시하자 모델은 'Neutral'이라는 올바른 답변을 반환했습니다. 오답은 아니다 하지만 우리가 원하는 특별한 라벨로 반환을 원한다고 가정을 해보겠습니다 Neutral 이 아닌 neutral 로 반환을 유도해보겠습니다.
일단 그러기 위해서는 어떤식으로 접근을 해야될까요?? 방법은 여러가지가 있습니다. 지금 이 예시에서는 정확성에 초점을 맞추고 있고,
프롬프트에 더 많은 정보를 제공 할수록 더 나은 결과를 얻을 수 있습니다. 원하는 결과를 얻기 위해 예시들을 추가하여 다시 시도해 보자.
Prompt :
문장을 neutral, 부정 혹은 긍정으로 분류해 줘.
문구: 이번 휴가는 그럭저럭이었어.
감정: neutral
문구: 그 음식은 그럭저럭이었어.
감정:
Output :
neutral
Jesus !! 의도한 대로 모델은 소문자로 시작하는 neutral을 반환했습니다. 프롬프트에 예시를 제공함으로써 모델로부터 원하는 답변을 끌어낼수 있었습니다.
다음 구체적인 예시를 보도록하자.
Prompt :
문장을 nutral, 부정 혹은 긍정으로 분류해 줘.
문구: 이번 휴가는 그럭저럭이었어.
감정:
Output :
Neutral
어떤 점이 문제 일까요? 프롬프트에 입력된 nutral 라벨은 모델에게 완전히 무시 됐습니다. 대신, 모델은 Neutral을 출력 했으며 이는 해당 라벨에 대한 편향이 있기 때문입니다. 그러나 우리가 실제로 원하는 것은 nutral 이라고 가정을 해보자.
이 문제를 해결 하려면 어떻게 해야될까요? 라벨에 설명을 추가하거나 프롬프트에 더 많은 예제를 추가해 보는 것은 어떻까요?
다음 절에서 몇 가지 생각을 논의해보도록 해보자.
5. 대화
프롬프트 엔지니어링을 통해 접할 수 있는 흥미로운 점들 중 하나는 LLM 시스템의 행동과 의도 그리고 정체성을 고려하여 지시를 내리는 것일 겁니다. 이러한 특성은 고객 서비스 챗봇과 같은 대화형 시스템을 구축할 때 특히 유용합니다.
Prompt :
다음은 AI 연구 보조원과의 대화입니다. 이 보조원의 어조는 기술적이고 과학적입니다.
인간: 안녕, 너는 누구니?
AI: 반갑습니다! 저는 AI 연구 보조원입니다. 오늘은 무엇을 도와드릴까요?
인간: 블랙홀 생성에 대해 설명해 줄래?
AI:
Output :
물론입니다! 블랙홀은 중력이 너무 강해서 심지어 빛조차도 벗어날 수 없는 시공간의 영역입니다.
아주 거대한 별이 죽고 그 중심핵이 스스로 붕괴하여 무한한 밀도의 특이점을 형성할 때 생성됩니다.
특이점의 강한 중력은 그 주변의 모든 물질과 방사선을 끌어당겨 블랙홀을 만듭니다.
우리 AI 연구 보조원의 대답은 너무 기술적인 것 같습니다. 이 행동을 변경하여 시스템에 보다 접근하기 쉬운 답변을 지시해 보도록하겠습니다.
Prompt :
다음은 AI 연구 보조원과의 대화입니다. 보조원은 초등학생도 이해할 수 있는 수준으로 답변해야 합니다.
인간: 안녕, 너는 누구니?
AI: 반갑습니다! 저는 AI 연구 보조원입니다. 오늘은 무엇을 도와드릴까요?
인간: 블랙홀 생성에 대해 설명해줄래?
AI:
Output :
물론이죠! 블랙홀은 아주 거대한 별이 연료를 다 써 버려서 스스로 붕괴함으로써 만들어집니다.
별의 중력이 매우 강하기 때문에 빛조차도 벗어날 수 없습니다.
이렇게 강력한 중력을 가진 시공간의 한 점이 블랙홀입니다.
결과의 개선이 보이십니까?? 여기서 더 개선할 수도 있습니다. 더 많은 예시를 추가한다면 더 나은 결과를 얻을 수도 있습니다.
6. 코드 생성
LLM은 매우 효과적인 코드 생성 애플리케이션 중 하나입니다. 코파일러(Copilot)이 대표적인 예시이빈다.
프롬프트를 영리하게 사용해서 코드를 생성하는 다양한 작업들이 있습니다.
먼저 유저에게 인사를 건네는 단순한 프로그램을 생성해보자
Prompt :
/*
유저의 이름을 입력받고 "안녕"이라고 해 줘
*/
Output :
let name = prompt("이름이 뭐예요?");
console.log(`안녕하세요, ${이름}!`);
어느 프로그램을 사용하는지 저장할 필요 없습니다.
좀더 수준을 올려서 어떻게 프롬프트를 디자인 하냐에 따라 LLM이 얼마나 더 강력해질 수 있는지 살펴보도록하자.
Prompt :
"""
DB테이블 departments, columns = [DepartmentId, DepartmentName]
DB테이블 students, columns = [DepartmentId, StudentId, StudentName]
컴퓨터과학부에 속한 모든 학생에 대한 MySQL 쿼리를 작성해 줘
"""
Output :
SELECT StudentId, StudentName
FROM students
WHERE DepartmentId IN (SELECT DepartmentId FROM departments WHERE DepartmentName
= 'Computer Science');
꽤 인상적인 답변입니다. 우리는 데이터베이스 스키마에 대한 정보를 제공하고 정상 작동하는 MySQL 쿼리를 작성하도록 요청했습니다.
마지막으로 추론입니다.
7. 추론
어떤 형태로든 추론이 필요한 작업은 아마도 오늘날 LLM으로 하기 가장 어려운 작업에 속합니다. 추론은 LLM에서 나타낼 수 있는 복잡한 애플리케이션의 유형 중에서 가장 흥미로운 분야 중 하나입니다.
수학적인 능력을 필요로 하는 작업에서는 눈에 띄는 개선을 보여주었지만, 현재의 LLM은 추론 작업을 수행하는데 어려움을 겪기 때문에 훨씬 더 향상된 프롬프트 엔지니어링 기술을 필요로 합니다.
고급 기술은 나중에 보시고, 산술 능력을 증명할 몇 가지 기본적인 예시를 다뤄봅시다.
Prompt :
9,000 * 9,000는 뭐야?
Output :
81,000,000
좀 더 어려운 문제를 시도해 보자.
Prompt :
주어진 수 중에서 홀수를 모두 더해서 짝수를 만들어 줘: 15, 32, 5, 13, 82, 7, 1.
A:
Output :
아니요, 주어진 수 중 홀수를 모두 더한 값은 홀수입니다: 119.
이번에는 답변이 틀렸습니다. 좀 더 프롬프트를 개선해서 정확도를 향상 시켜보겠습니다.
Prompt :
주어진 수 중에서 홀수를 모두 더해서 짝수를 만들어 줘: 15, 32, 5, 13, 82, 7, 1.
문제를 단계별로 해결해 봐. 먼저 주어진 수 중 홀수를 찾아낸 뒤, 그것들을 합해서,
결과가 홀수인지 짝수인지 판별해 줘.
Output :
홀수: 15, 5, 13, 7, 1
총합: 41
41은 홀수입니다.
정답이 나왔습니다. 더 나은 지시와 예시를 결합하는것으로 보다 정확한 결과를 얻을 수 있습니다.
'LangChain' 카테고리의 다른 글
Prompt Leaking(프롬프트 공격) (0) | 2024.05.28 |
---|---|
Langchain 과 SerpApi 로 챗봇의 웹 기능 강화 (0) | 2024.05.16 |
고급 RAG 에 대해서 (Advanced RAG : Multi-Query Retriever Approach) (0) | 2024.05.15 |
일반적인 프롬프트 설계 (0) | 2024.04.05 |
프롬프트의 기초 (0) | 2024.04.05 |