feat(helper): 입력창 textarea(줄바꿈) + 회사 생활도 답하도록 확장
All checks were successful
CI / backend-test (push) Successful in 2m9s
CI / frontend-build (push) Successful in 45s
CI / backend-dep-scan (push) Successful in 29s

- 입력이 <input> 한 줄뿐이라 줄바꿈이 안 됐다 → <textarea>로. Enter 전송,
  Shift+Enter 줄바꿈. 답변은 이미 pre-wrap이라 줄바꿈 반영됨.
- LlmAssistant 프롬프트에 회사 생활·직장 예절·업무 소통(보고·이메일·질문법·
  온보딩)을 신입 눈높이로 답하도록 추가. mirim 온보딩 교육과 결이 맞음.
This commit is contained in:
AWESOMEDEV 2026-07-23 14:26:55 +09:00
parent 4b64d0ac9c
commit b18a9af195
3 changed files with 26 additions and 7 deletions

View File

@ -33,10 +33,14 @@ public class LlmAssistant {
private static final Logger log = LoggerFactory.getLogger(LlmAssistant.class); private static final Logger log = LoggerFactory.getLogger(LlmAssistant.class);
private static final String SYSTEM = """ private static final String SYSTEM = """
너는 어썸데브 학습 플랫폼의 AI 학습 도우미다. 프로그래밍을 배우는 수습생의 질문에 너는 어썸데브 학습 플랫폼의 AI 학습 도우미다. 수습생(신입) 질문에 친절하고
친절하고 정확하게 한국어로 답한다. 개념 설명은 충실히 하되, 지금 풀고 있는 코딩 문제의 정확하게 한국어로 답한다. 종류의 질문을 모두 돕는다.
완성된 정답 코드를 통째로 주지는 마라 학생이 스스로 풀도록 방향과 힌트를 준다. - 프로그래밍·개념: 충실히 설명하되, 지금 풀고 있는 코딩 문제의 완성된 정답 코드는
답은 간결하게, 필요하면 짧은 예시 코드만 곁들인다."""; 통째로 주지 말고 스스로 풀도록 방향과 힌트를 준다.
- 회사 생활·직장 예절·업무 소통: 보고하는 (사실판단다음 행동), 이메일·메신저
예절, 질문 잘하는 , 출근·온보딩 기본기 등을 신입 눈높이에서 구체적이고
실용적으로 알려준다.
답은 간결하게, 필요하면 짧은 예시만 곁들인다.""";
private final String baseUrl; private final String baseUrl;
private final String model; private final String model;

View File

@ -62,11 +62,21 @@ export default function HelperWidget() {
{loading && <div className="helper-msg helper-ai helper-thinking">생각 </div>} {loading && <div className="helper-msg helper-ai helper-thinking">생각 </div>}
</div> </div>
<form className="helper-input" onSubmit={send}> <form className="helper-input" onSubmit={send}>
<input {/* textarea . Enter , Shift+Enter .
학습 포인트: input은 줄뿐이라 Enter=전송만 가능했다 질문엔 textarea가 맞다. */}
<textarea
className="helper-ta"
value={input} value={input}
onChange={(e) => setInput(e.target.value)} onChange={(e) => setInput(e.target.value)}
placeholder="질문을 입력하세요" onKeyDown={(e) => {
if (e.key === 'Enter' && !e.shiftKey) {
e.preventDefault();
send(e);
}
}}
placeholder="질문을 입력하세요 (Shift+Enter 줄바꿈)"
aria-label="질문 입력" aria-label="질문 입력"
rows={1}
/> />
<button type="submit" className="helper-send" disabled={loading} aria-label="보내기"> <button type="submit" className="helper-send" disabled={loading} aria-label="보내기">
<Send size={18} strokeWidth={1.5} /> <Send size={18} strokeWidth={1.5} />

View File

@ -1575,7 +1575,7 @@ inline-code, .icode {
padding: 12px; padding: 12px;
border-top: 1px solid var(--line); border-top: 1px solid var(--line);
} }
.helper-input input { .helper-ta {
flex: 1; flex: 1;
min-width: 0; min-width: 0;
padding: 9px 12px; padding: 9px 12px;
@ -1584,7 +1584,12 @@ inline-code, .icode {
background: var(--bg); background: var(--bg);
color: var(--ink); color: var(--ink);
font: inherit; font: inherit;
line-height: 1.5;
resize: none; /* 손잡이로 늘리는 건 막고 */
max-height: 120px; /* 여러 줄이어도 입력창이 패널을 다 먹지 않게 */
overflow-y: auto;
} }
.helper-input { align-items: flex-end; } /* textarea가 여러 줄이어도 보내기 버튼이 바닥에 정렬 */
.helper-send { .helper-send {
border: none; border: none;
background: var(--primary); background: var(--primary);