본문 바로가기
카테고리 없음

AI와 대화하기

by 정말반가워요 2023. 11. 1.

 

프롬프트 엔지니어링 관련한 책이 지역 전자도서관에 있는걸 봤다.
그걸 읽어본 다음에 이 글을 쓰면 더 좋았을텐데

귀찮아서 그러질 못했다!

 

그런데 프롬프트 엔지니어링이라는 걸 조금 찾아보면

결국 사람을 상대로 좋은 답변을 얻어내는 방법과 다른 게 별로 없어서

기본적으로는 대화라는 것 자체를 이해하는 것이 중요하다고 생각한다.

그래서 이번에는 내가 원하는 답을 얻기 위해 AI와 대화하는 방법을 공유하고

추가적으로 그 대화들에서 배웠던 지식을 모아보는 시간을 가지도록 하겠다!

1. @Autowired final HttpServletRequest, EntityManager?

HttpServletRequest, EntityManager와 같은 빈도 스프링 컨테이너에서 관리된다.

이 빈들은 사용자 각각의 요청마다(스레드마다) 다르게 관리되어야 하는데,

 

해당 빈이 final일 때도 스레드마다 구분된 객체가 반환되는 것을 보았다.

어떤 원리인지 궁금했다.

그렇다고 한다.

final 필드임에도 스레드마다 다른 객체를 주입할 수 있었던 이유는

컨테이너 의존성 주입 시점에 스프링이

'일단은' CGLIB 라이브러리로 프록시 객체를 주입하고

이후 그 프록시 객체를 통해 스레드마다 별도의 객체를 반환할 수 있도록 했기 때문이다.

 

따로 찾아보니,

사실 한참 전에 들었던 김영한 아저씨 강의에 있던 내용이었다.

 

그럼 싱글톤 빈들은 원본 객체를 주입하겠지? 하는 생각에 확인차 한번 더 질문.

그도 그럴 것이, 싱글톤 빈에 프록시 객체를 넣을 이유는 없겠다.

여기서 뤼튼이 질문을 하나 추천해줬는데,

'프록시를 사용하면서 생기는 성능 저하'에 관한 것이었다.

 

나는 개발을 할 때

I/O 작업이 아닌 이상 성능 문제를 필요 이상으로 고려하는 타입은 아니라서 별 의심은 하지 않았지만

그래도 추천 질문이니 한번 던져보았다.

역시 그렇다고 한다.

 

2. 비동기와 이벤트 루프

자바스크립트 코드를 짤 일이 생겨서 작업을 하다가

예전에 동아리내 프엔 고수에게 들었던 말이 생각났다.

자세히 기억은 안나지만

 

'비동기 함수는... ~~부분의 실행이 다 끝난 다음에 실행되는 것이다. 

비동기 작업이 완료되었다고 해서 다른 부분을 실행하다가

갑자기 콜백 함수를 실행하진 않는다'

 

하는 말이었다.

그때는 부분적으로만 이해했지만, 지금 생각해보면

1. 비동기 작업 실행

2. 현재 스택 프레임 내의 모든 코드를 실행

3. 모든 코드를 실행한 후 비동기 작업이 완료(Promise가 Pending 상태를 벗어나면)될 경우 등록해둔 콜백 함수 실행

 

이런 설명이었겠거니 싶었다.

좀 더 자세히 알아보기 위해 질문했다.

 

예상하던 흐름이 맞았다.

이제 비동기 작업의 흐름 자체는 이해했으나

이벤트 루프, 콜 스택이란 단어는 잘 모르겠다.

 

일단 콜 스택이란 말부터 알아보고 싶었다.

내게 익숙한 용어로는 '메서드 스택 프레임'이 있는데

그 개념과 유사한 것 같다.

한번 질문해봐야겠다.

 

어떤 단어는 모르지만 그와 관련이 있을 것으로 추정되는 키워드를 알고 있을 때

'X가 무엇인가요? A, B와는 어떤 관련이 있나요?'

하며 물어보면 훨씬 이해하기 쉬운 답변이 올 가능성이 높다.

 

대화형 AI는 내 명령대로 X와 A, B의 연관성을 충실히 설명한다.

A, B는 내가 이미 알고 있는 것이기 때문에 당연히 이해하기가 더 쉽다.

스택 프레임이라는 용어는 '자바 객체지향의 원리와 이해'에서 보고 기억하고 있었는데,

사실 이름만 조금 다르고, 본질적으로는 같은 말이었다.

오케이 잘 이해했어.

 

다음 질문은 이제까지의 내용을 다시 정리하는 식으로 해 보았다.

AI에게 답변을 받았다면

답변받은 내용을 내가 직접 설명해보고, 맞는지 검증을 부탁할 수 있다.

내가 현재 알고있는 바를 확인했다.

이제 '이벤트 루프'가 무엇인지 물어보자.

 

나는 익숙치 않은 개념을 이해할 때

1. 그것이 하는 역할은 무엇이며 왜 존재하는지

2. 내가 아는 어떤 단어들과 혹시 연관이 있을지

3. 비슷하거나 반대되는 개념으로는 무엇이 있는지

를 중심으로 이해하려고 한다.

결국 이벤트 루프는 지금까지 탐구했던 비동기 처리 메커니즘을 일컫는 것이었다.

 

Pending 상태를 벗어난 Promise가 있다면 콜백 함수를 태스크 큐에 추가하고,

콜 스택이 모두 비워졌을 때 태스트 큐의 작업들이 차례로 실행된다는 것!

 

3. JWT에 넣을 사용자 식별 단서는?

예전에 들었던 강의에서는 JWT의 'audience' 속성에 사용자 식별 정보를 넣었고,

그것이 "email" 이었다.

 

지금 하고 있는 프로젝트에서도 사용자의 email을 수집하기 때문에

자연스레 email을 aud 속성에 넣어서 사용자를 식별했으나,

 

'왜 auto increment PK를 쓰지 않고 email을 쓰지?'

 

하는 의문이 들었다.

AI PK를 쓰지 않고 email로 사용자를 식별한다면

 

1. 만약 토큰이 외부에 노출된다고 한들

별다른 의미가 없는 대리 키보다는

email이 노출되었을 때의 피해가 조금 더 클 것.

 

2. 대부분의 경우 payload의 길이가 이메일보다 길어질 것.

 

3. Email에도 인덱스가 걸려 있지만,

Clustered Index가 사용되는 PK로 조회하는 것이 DB 조회성능에 아주 약간의 성능향상을 가져올 것.

 

4. 대리 키는 비즈니스적 요구사항에 변하지 않음.

사용자에게 더이상 이메일을 수집할 일이 없다면 그 때부터는 토큰에 담을 값과

식별값을 파싱하는 로직까지 바꿔야 함.

 

위의 4가지를 고려하여 email보다는 AI PK가 좋겠다는 생각이 들어

AI님께 자문을 구해 보았다.

 

나는 여러 선택지 중에서 무언가를 선택할 때는

1. 나는 어떤 문제를 해결하려 하고 있고, 내게 이러이러한 선택지가 있다.

2. 당신이 추천하는 선택지와 그 근거를 알려달라.

3. 내가내 선택지들보다 더 좋은 아이디어가 있다면 제시해달라.

(XY 문제를 막기 위함)

https://ko.wikipedia.org/wiki/XY_%EB%AC%B8%EC%A0%9C

 

XY 문제 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. XY 문제는 기술 지원, 소프트웨어 공학, 고객 서비스 상황에서 사용자가 시도했던 방안(Y)에 대한 질문이 실제 근본적인 문제(X)와 관계가 없을 때 발생하는 대화

ko.wikipedia.org

 

위의 양식을 갖춰서 질문한다.

뤼튼아저씨의 답을 보자.

PK가 url에 사용될 경우는 
PK를 알아낼 경우, 특정 사용자의 정보를 알아낼 수 있는 문제가 있긴 하지만

이 경우는 어떤 정보의 공개범위(Public/Private)를 명확히 정하고,

비공개 정보의 경우는 권한을 요구하는 식으로 극복할 수 있다고 생각된다.

 


여기까지 AI와의 대화 경험을 공유해 보았다.

사실 AI든 사람이든 좋은 답변을 위한 질문법엔 큰 차이가 없는 것 같다.

 

1. 문제상황 인식의 동기화를 위한 자세한 설명

-> 질문받는 사람은 내 뇌 속을 모른다. 내가 궁금한 부분과 처한 상황을 명확히 설명하기

2. 내가 기존에 알고 있는 유사 개념이 있다면 그것과 연관성이 있는지 질문

-> 새 지식뿐만 아니라 기존에 알고 있는 개념까지 확실히 이해 가능하다.

3. 답변을 듣고 내가 이해한 바를 다시 설명

-> 설명할 수 있다면? 당신은 진정한 배움을 얻은 것이야