From f5fabec23de468232f492a3e11072800aaa895d3 Mon Sep 17 00:00:00 2001
From: s0zzang
Date: Mon, 18 Nov 2024 20:32:06 +0900
Subject: [PATCH 1/3] =?UTF-8?q?Feat:=20=EC=8B=AC=EB=A6=AC=EC=83=81?=
=?UTF-8?q?=EB=8B=B4=20=ED=94=84=EB=A1=AC=ED=94=84=ED=8A=B8=EC=97=90=20?=
=?UTF-8?q?=EC=B5=9C=EA=B7=BC=20=EB=82=9C=EC=9E=84=EC=B2=99=EB=8F=84=20?=
=?UTF-8?q?=EC=A0=90=EC=88=98=20=EB=B0=98=EC=98=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/pages/counseling/Counseling.tsx | 33 +++++++++++++++++++++++------
1 file changed, 27 insertions(+), 6 deletions(-)
diff --git a/src/pages/counseling/Counseling.tsx b/src/pages/counseling/Counseling.tsx
index a20b7cc..476b4f3 100644
--- a/src/pages/counseling/Counseling.tsx
+++ b/src/pages/counseling/Counseling.tsx
@@ -25,10 +25,11 @@ interface CounselData {
const Counseling = () => {
const member_id = Number(localStorage.getItem('MemberId'));
+ const [scaleData, setScaleData] = useState({ total: 0, belifs: '' });
const userData = {
name: localStorage.getItem('userName'),
- total: '180점',
- faith: '나는 살아갈 가치가 없는 사람이다, 결혼한 부부는 아이가 꼭 있어야 한다.',
+ total: `${scaleData.total}/230`,
+ belifs: scaleData.belifs,
};
const scrollBoxRef = useRef(null);
const [messages, setMessages] = useState([]);
@@ -46,7 +47,7 @@ const Counseling = () => {
1. 사용자 특성:
- 이름: ${userData.name}
- 난임 스트레스 척도 점수: 230점 만점의 ${userData.total}
- - 난임 스트레스 척도로 평가된 핵심 신념: ${userData.faith}
+ - 난임 스트레스 척도로 평가된 핵심 신념: ${userData.belifs}
2. 상담 목표: 인지적 왜곡 및 부정적 자동적 사고를 탐색하여 핵심 신념 반박
3. 대화 횟수: ${dataForPrompt.count}
4. 사례개념화: ${dataForPrompt.caseFoumulation}
@@ -87,7 +88,7 @@ const Counseling = () => {
setMessages((prev) => [...prev, { sender, message }]);
};
- const handleSubmit = async (e: FormEvent) => {
+ const handleChat = async (e: FormEvent) => {
e.preventDefault();
// 사용자 입력란이 공백일 경우 함수 실행 X
@@ -128,6 +129,23 @@ const Counseling = () => {
const now = new Date();
const toDay = formatDate(now);
+ const fetchScaleData = async () => {
+ try {
+ const { data } = await axios.get('/infertility/tests/', {
+ params: { memberId: member_id },
+ headers: {
+ 'content-type': 'application/json',
+ accept: 'application/json',
+ },
+ });
+ setScaleData({ total: data.result.totalTests[0].total, belifs: data.result.totalTests[0].belifs });
+ return data.result.totalTests[0];
+ } catch (err) {
+ console.error('Failed to POST scaleList: ', err);
+ return null;
+ }
+ };
+
const fetchCounselResult = async (body: CounselData) => {
try {
const response = await axios.post('/counsels/records/', body, {
@@ -153,7 +171,6 @@ const Counseling = () => {
const response = await fetchGPT(prompt, dataForPrompt.summary);
const { summary, tags } = JSON.parse(response.choices[0].message.content);
const fetchRes = await fetchCounselResult({ member_id, summary, tags, count: 1 });
- console.log(fetchRes);
if (fetchRes && fetchRes.status === 201) setModal(true);
};
@@ -187,6 +204,10 @@ const Counseling = () => {
moveScrollDown();
}, [messages]);
+ useEffect(() => {
+ fetchScaleData();
+ }, []);
+
return (
<>
{guideVisible && }
@@ -234,7 +255,7 @@ const Counseling = () => {
-
-
From 4b74bb7371b35c3852604223e32da1cb2e6a150d Mon Sep 17 00:00:00 2001
From: s0zzang
Date: Tue, 19 Nov 2024 13:49:07 +0900
Subject: [PATCH 3/3] =?UTF-8?q?Feat:=20=EC=9D=B4=EC=A0=84=20=EC=83=81?=
=?UTF-8?q?=EB=8B=B4=20=EB=82=B4=EC=97=AD=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?=
=?UTF-8?q?GET?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/pages/counseling/Counseling.tsx | 64 ++++++++++++++++++++++-------
1 file changed, 50 insertions(+), 14 deletions(-)
diff --git a/src/pages/counseling/Counseling.tsx b/src/pages/counseling/Counseling.tsx
index 82b3557..abb533f 100644
--- a/src/pages/counseling/Counseling.tsx
+++ b/src/pages/counseling/Counseling.tsx
@@ -24,12 +24,24 @@ interface CounselData {
}
const Counseling = () => {
+ // 이전 대화가 있다면 필요한거
+ /*
+ "summary": "우울해함",
+ "tags": "#배고파#나도#치킨먹자",
+ "count": 1,
+
+ 0. 10번 상세 fetch
+ 1. 프롬프팅에 요약 내용 전달하기 -> dataForPrompt.summary
+ 2. count +=1
+ 3. tag를 유지할까 말까
+ */
const params = useParams();
const navigate = useNavigate();
const member_id = Number(localStorage.getItem('MemberId'));
const scrollBoxRef = useRef(null);
const [scaleData, setScaleData] = useState({ total: 0, belifs: '' });
+ const [previousCounsel, setPreviousCounsel] = useState({ summary: '', tags: '', count: 1 });
const [messages, setMessages] = useState([]);
const [userInput, setUserInput] = useState('');
const [lastMsg, setLastMsg] = useState({ user: '', gpt: '' });
@@ -45,7 +57,7 @@ const Counseling = () => {
const prompt = `
아래 내용을 참고하여 난임스트레스를 낮출 수 있는 심리 상담을 해줘.
- 1. 사용자 특성:
+ 1. user 특성:
- 이름: ${userData.name}
- 난임 스트레스 척도 점수: 230점 만점의 ${userData.total}
- 난임 스트레스 척도로 평가된 핵심 신념: ${userData.belifs}
@@ -56,24 +68,24 @@ const Counseling = () => {
6. 바로 직전 대화: ${lastMsg}
7. 답변 형식: {"answer": "~합니다. 등의 존댓말", "summary": "~함. 등의 요약", "caseFoumulation": "내용"}
1) answer:
- - '4. 사례개념화', '5. 대화 요약'과 '6. 바로 직전 대화'를 참고하여 다음 중 한 가지로 따뜻한 상담사 어조로 상담을 해줘.
- 1) 사용자에게서 인지적 왜곡이나 부정적인 사고가 관찰된다면, 다양한 관점을 깨달을 수 있도록 소크라테스식 질문을 해줘.
- 2) 사용자가 다른 관점을 생각하지 못한다면, '대화 요약'을 참고해서 다른 관점을 제시해줘.
- 3) 사용자가 부적절한 방식으로 반응을 한다면, 상황에 따라 적절한 반응을 깨달을 수 있는 질문을 해줘.
- 4) 대화 횟수가 10회 이상이고, 사용자의 핵심 신념이 비합리적이라면 직면할 수 있는 질문을 해줘.
+ - '5. 대화 요약', '6. 바로 직전 대화'를 참고하여 다음 중 한 가지로 따뜻한 상담사 어조로 상담을 해줘.
+ 1) user에게서 인지적 왜곡이나 부정적인 사고가 관찰된다면, 다양한 관점을 깨달을 수 있도록 소크라테스식 질문을 해줘.
+ 2) user가 다른 관점을 생각하지 못한다면, '대화 요약'을 참고해서 다른 관점을 제시해줘.
+ 3) user가 부적절한 방식으로 반응을 한다면, 상황에 따라 적절한 반응을 깨달을 수 있는 질문을 해줘.
+ 4) 대화 횟수가 10회 이상이고, user의 핵심 신념이 비합리적이라면 직면할 수 있는 질문을 해줘.
- user의 메시지는 '대화 요약'을 참고하고, '바로 직전 대화'와 이어지는 내용이니까 꼭! 참고해서 답변해줘.
- 종종 말 줄임표를 사용하고, 이미 파악된 내용은 다시 물어보지 말아줘.
- 130자 이내로 존댓말을 사용해 줘.
- - 만약 사용자가 자살과 관련 얘기를 한다면 자살예방상담전화(109) 정보를 제공해줘.
+ - 만약 user가 자살과 관련 얘기를 한다면 자살예방상담전화(109) 정보를 제공해줘.
2) summary:
- - 사용자의 답변과 system의 답변을 높임체 없이 '~함' 등 간략한 말투로 요약해줘.
+ - user의 답변과 system의 답변을 높임체 없이 '~함' 등 간략한 말투로 요약해줘.
- 이후에 summary를 보면 system이 대화 내용을 유추하고 이어서 대화할 수 있도록 구체적인 내용을 포함해줘.
- system의 답변은 질문의 내용까지 구체적으로 포함해줘.
3) caseFoumulation: {
"상황": "'4. 사례개념화', '5. 대화 요약'을 참고한 스트레스 유발 상황. 형식: '~하는 상황'",
"감정": "스트레스 상황에 대한 감정",
"자동적사고": "상황을 접하여 떠올린 자기, 미래, 세상에 대한 자동적인 생각. 형식: '~한다.'",
- "핵심신념": "'1. 사용자 특성' 중 '핵심 신념'을 참고하여 부정적인 자동적 사고를 활성화시키는 기저 신념. 형식: '~한다.'",
+ "핵심신념": "'1. user 특성' 중 '핵심 신념'을 참고하여 부정적인 자동적 사고를 활성화시키는 기저 신념. 형식: '~한다.'",
"행동": "스트레스를 받은 후 행동"
}
`;
@@ -91,11 +103,10 @@ const Counseling = () => {
const handleChat = async (e: FormEvent) => {
e.preventDefault();
-
// 사용자 입력란이 공백일 경우 함수 실행 X
if (!userInput.trim()) {
setUserInput('');
- return null;
+ return;
}
addMessage('user', userInput);
@@ -108,13 +119,15 @@ const Counseling = () => {
addMessage('gpt', answer);
setLastMsg({ user: userMsg, gpt: answer });
setDataForPrompt({
- summary: dataForPrompt.summary ? `${dataForPrompt.summary}, ${summary}` : summary,
+ summary: dataForPrompt.summary
+ ? `${dataForPrompt.summary}, ${summary}`
+ : `${previousCounsel.summary}, ${summary}`,
count: dataForPrompt.count + 1,
caseFoumulation,
});
setIsLoading(false);
- console.log(dataForPrompt.summary);
+ console.log(dataForPrompt.summary, lastMsg);
};
//상담 시작 날짜 가져오는 함수
@@ -130,6 +143,22 @@ const Counseling = () => {
const now = new Date();
const toDay = formatDate(now);
+ const fetchPreviousCounsel = async (id: string) => {
+ try {
+ const { data } = await axios.get(`/counsels/records/${id}`, {
+ headers: {
+ 'content-type': 'application/json',
+ accept: 'application/json',
+ },
+ });
+ setPreviousCounsel({ summary: data.result.summary, tags: data.result.tags, count: data.result.count + 1 });
+ return data.result;
+ } catch (err) {
+ console.error('Failed to POST scaleList: ', err);
+ return null;
+ }
+ };
+
const fetchScaleData = async () => {
try {
const { data } = await axios.get('/infertility/tests/', {
@@ -171,7 +200,7 @@ const Counseling = () => {
`;
const response = await fetchGPT(prompt, dataForPrompt.summary);
const { summary, tags } = JSON.parse(response.choices[0].message.content);
- const fetchRes = await fetchCounselResult({ member_id, summary, tags, count: 1 });
+ const fetchRes = await fetchCounselResult({ member_id, summary, tags, count: previousCounsel.count || 1 });
if (fetchRes && fetchRes.status === 201) setModal(true);
};
@@ -205,6 +234,7 @@ const Counseling = () => {
}, [messages]);
useEffect(() => {
+ if (params.id) fetchPreviousCounsel(params.id);
fetchScaleData();
}, []);
@@ -236,6 +266,12 @@ const Counseling = () => {
난임으로 인해 힘든 마음을 편하게 나눠주세요. 어려움을 해결할 수 있도록 도와드릴게요. 사회적 관계에서
느끼는 부담, 배우자와의 소통문제, 부부 관계에 대한 고민 모두 가능해요.
+ {previousCounsel.tags && (
+
+ 이전 상담 내용은 다음과 같아요.
+ {previousCounsel.tags.split('#').join(' #')}
+
+ )}