문제 해결 과정
1.
DB로부터 어떠한 상황인지를 LLM에게 브리핑해서 맞춤형으로 대화를 생성하려면?
단순 대화 모델에 상황을 인지시켜서 맞춤형 대화모델 테스트
실제 user DB를 만들어서 연동시키기
2.
현재 시간, 날짜, 날씨 등과 같이 실제 정보와 동기화시켜야 하는 정보는 어떻게 해결할 수 있을까?
결과
결과
최종 코드는 아래와 같습니다.
1.
결과 파일
import json
import requests
import pandas as pd
import mysql.connector
import time
Python
복사
실시간으로 데이터를 받아 최종 응답을 하나의 문자열로 반환
class CompletionExecutor:
def __init__(self, host, api_key, api_key_primary_val, request_id):
self._host = host
self._api_key = api_key
self._api_key_primary_val = api_key_primary_val
self._request_id = request_id
# completion_request : {"role" : "user","content" : f"{question}"}
# POST 요청을 보내고, 실시간으로 응답을 처리하여 대화 내용을 생성함
def execute(self, completion_request):
headers = {
'X-NCP-CLOVASTUDIO-API-KEY': self._api_key,
'X-NCP-APIGW-API-KEY': self._api_key_primary_val,
'X-NCP-CLOVASTUDIO-REQUEST-ID': self._request_id,
'Content-Type': 'application/json; charset=utf-8',
'Accept': 'text/event-stream'
}
content = ""
with requests.post(self._host + '/testapp/v1/tasks/4ce94y7k/chat-completions', headers=headers, json=completion_request, stream=True) as r:
for line in r.iter_lines():
if line:
decoded_line = line.decode("utf-8")
if decoded_line.startswith("data:"):
json_data = decoded_line[5:] # 'data:' 이후의 JSON 데이터 추출
try:
parsed_data = json.loads(json_data)
if 'message' in parsed_data and 'content' in parsed_data['message']:
if content == parsed_data['message']['content']:
pass
else:
content += parsed_data['message']['content']
except json.JSONDecodeError:
# JSON 형식이 맞지 않을 경우 무시
continue
return content
Python
복사
user_id를 입력하면, MySQL 데이터베이스에서 해당 정보를 딕셔너리로 반환하는 함수
def get_user_info(user_id):
connection = mysql.connector.connect(
host = 'localhost',
user = 'hanshin',
password = 'hanshin2024',
database = 'user_data')
cur = connection.cursor()
cur.execute("SELECT name, disability_type, preferences FROM users WHERE user_id = %s",(user_id,))
user_info = cur.fetchone()
connection.close()
if user_info:
return {
'name' : user_info[0],
'disability_type' : user_info[1],
'preferences' : user_info[2]
}
else:
return None
Python
복사
CSV 파일에서 질문 목록을 불러와 각 질문에 대한 AI 챗봇의 답변을 생성 후, 결과를 CSV 파일에 저장
if __name__ == '__main__':
completion_executor = CompletionExecutor(
host='https://clovastudio.stream.ntruss.com',
api_key='NTA0MjU2MWZlZTcxNDJiY5OgY4I/+eAv267dQbt+9aDUE0J6DJ/sL2uIey9+AkMG',
api_key_primary_val='dn7QeKh9ZQNxR782O4jPEUU02ae6esNz3DhLUsF2',
request_id='fc9998a2-5db4-4661-bbfe-887a78a6be7a'
)
path = r"C:\Users\sook3\OneDrive\바탕 화면\something\학습\DEL 과제\국립재활연구원_2408\chatbot 만들기\datasets.csv"
df = pd.read_csv(path)
questions_lst = df['Text']
# preset_text = [{"role":"system","content":"당신은 인지에 장애가 있는 장애인들이 일상생활에서 겪는 어려움을 해결해주는 챗봇입니다\n 당신은 인지에 장애가 있는 장애인들이 일상생활에서 겪는 어려움을 해결해주는 챗봇입니다. \n ### 답변 생성 방법 ### \n - 대화체로 생성한다.\n - 답변은 인지 장애인들이 겪는 어려움과 관련 있게 생성한다.\n - 욕설, 차별적 요소, 부적절한 언어들은 제외한다.\n - 해당 다변은 반드시 리스트나 배열에 사용할 수 있도록 다음과 같은 형식으로 출력한다.\n"}]
for idx,question in enumerate(questions_lst):
user_info = get_user_info(user_id = 3)
if not user_info:
print("User info not found for user_id ")
continue
preset_text = [{"role":"system", "content" : f"""당신은 {user_info['name']}님을 도와주는 챗봇입니다. {user_info['name']}님은 {user_info['disability_type']}을 가지고 있습니다. 다음 대화에서는 이 정보를 바탕으로 대화하세요.\n
- 선호도: {user_info['preferences']} \n
### 답변 생성 방법 ### \n
- 대화체로 생성한다.\n
- 답변은 사용자의 disability_type과 관련된 어려움에 관련 있게 생성한다.\n
- 욕설, 차별적 요소, 부적절한 언어들은 제외한다.\n
- 해당 답변은 반드시 리스트나 배열에 사용할 수 있도록 출력한다.\n
- 답변에 사용자의 이름을 불러주는 역할을 추가한다.\n
- 답변에 사용자의 선호도를 반영하여 적절한 답변을 생성한다."""}
]
preset_text.append({"role" : "user","content" : f"{question}"})
print(preset_text)
request_data = {
'messages': preset_text,
'topP': 0.8,
'topK': 0,
'maxTokens': 256,
'temperature': 0.5,
'repeatPenalty': 5.0,
'stopBefore': [],
'includeAiFilters': True,
'seed': 0
}
content = completion_executor.execute(request_data)
print(f"답변 생성 결과: {content}")
print("----------------------------------")
df.loc[idx,'Completion'] = content
time.sleep(1)
del preset_text[-1]
#print(df)
df.to_csv(path, index =False, encoding="utf-8-sig")
Python
복사
MySQL에서 데이터베이스 생성한 Query
-- 데이터베이스 생성
CREATE DATABASE IF NOT EXISTS user_data;
-- 데이터베이스 사용
USE user_data;
-- 테이블 생성
CREATE TABLE IF NOT EXISTS users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
disability_type VARCHAR(100) NOT NULL,
preferences TEXT
);
-- 샘플 데이터 삽입
INSERT INTO users (name, disability_type, preferences) VALUES
('홍길동', '인지 장애', '시각적 자료 선호'),
('김영희', '청각 장애', '간단한 문장 선호'),
('이철수', '신체 장애', '음성 지원 선호');
|
각 사용자에 따라 다른 결과
결론 : 같은 질문이어도 사용자의 정보에 따라 다른 답변이 출력이 되는 것은 확인이 되었으나, 그래도 서비스로 제공하기에는 많이 부족함.
해결되지 않은 점
•
현재 날짜, 시간과 같이 답변하는 시점에서 동기화해야 하는 정보에 대한 해결책을 모색해야 함










