신년목표로
1. 면허따기
2. 일본어 자격증 따기
를 잡았다. 공부하다보니 재밌기도 하고...
근데 생각보다 쓰면서 하자니 지하철 타면서 하기에 좀 한계가 있다. 원체 디지털 인간이기도 하고, 겸사겸사 agent 공부도 하고, 기타등등으로 신년 프로젝트 달성
일단 필요한 기능들을 정리해 두고 하나씩 진행할 예정.
아이디어를 듣고 나더니 스픽같다고 하신다. 역시 사람 생각 다 똑같음
from pydantic import BaseModel
class ShortTermMemory(BaseModel):
subject: str
object: str
action: str
class LongTermMemory(BaseModel):
description: str
stm_list: list[ShortTermMemory]코드를 입력하세요
class ConversationAgent:
def __init__(self, model_name='gpt-4o-mini'):
self.chatbot = ChatOpenAI(model=model_name)
self.resources_path = get_resources_path()
self.init_conversations_prompt = ChatPromptTemplate.from_messages(
messages=[('user', get_prompt_txt(self.resources_path.joinpath('init_conversation.txt')))],
template_format='jinja2'
)
self.conversation_prompt = ChatPromptTemplate.from_messages(
messages=[('user', get_prompt_txt(self.resources_path.joinpath('conversation.txt')))],
template_format='jinja2'
)
self.revision_prompt = ChatPromptTemplate.from_messages(
messages=[('user', get_prompt_txt(get_resources_path().joinpath('revision.txt')))],
template_format='jinja2'
)
self.check_end_conversation_prompt = ChatPromptTemplate.from_messages(
messages=[('user', get_prompt_txt(get_resources_path().joinpath('check_end_conversation.txt')))],
template_format='jinja2'
)
self.history: list[tuple] = []
self.memories: list[LongTermMemory] = []
def start(self, topic: str, level: Literal['starter', 'basic', 'intermediate', 'advanced', 'master']):
self.topic = topic
self.level = level
chain = self.init_conversations_prompt | self.chatbot | JsonOutputParser()
conversation_dict = chain.invoke({'topic': self.topic, 'level': self.level})
self.history.append(('ai', conversation_dict['ai']))
return conversation_dict
json을 사랑하기 때문에 모든 템플릿은 jinja2로 했다.
Return only the json output and nothing else.
최고의문장 def predict_conversations(self, user_input: str):
try:
self.check_end_conversation()
self.history.append(('human', user_input))
revision_dict = self.revise(user_input)
conversations = [f'[{role}]: {value}' for role, value in self.history]
chain = self.conversation_prompt | self.chatbot | JsonOutputParser()
conversation_dict = chain.invoke({'topic': self.topic, 'level': self.level, 'history': conversations})
self.history.append(('ai', conversation_dict['ai']))
return conversation_dict, revision_dict
except ConversationEndException:
return {'ai': 'DONE'}, {}
def summarize(self, history: list[tuple]) -> LongTermMemory:
# dummy
return LongTermMemory(description='', stm_list=[])
def memorize(self):
memory = self.summarize(self.history)
self.history = []
self.memories.append(memory)
def check_end_conversation(self):
def sanitize(output: str):
if output not in ['DONE', 'CONTINUE']:
raise ParseException
return output
chain = self.check_end_conversation_prompt | self.chatbot | StrOutputParser() | RunnableLambda(sanitize)
state = chain.invoke({'dialog': self.history})
if state == 'DONE':
self.memorize()
오늘은 일단 여기까지
일본어 입력기가 없다는걸 깨달았다... 그래서 웹검색을 빌린 첫 문장을 제외하면 초보 그자체인 답변모음
아 근데 주말이나 되어야 이어서 할 수 있겠네...