# 파일명 : tools/_get_yf_stock_history.py
importyfinanceasyfdeffunc(ticker:str,period:str):stock=yf.Ticker(ticker)hist=stock.history(period=period)returnstr(hist.to_markdown())tool_def={"type":"function","function":{"name":"get_yf_stock_history","description":"해당 종목의 Yahoo Finance 주가 정보를 반환합니다.","parameters":{"type":"object","properties":{"ticker":{"type":"string","description":"Yahoo Finance 주가 정보를 반환할 종목의 티커를 입력하세요. (예:APPL)",},"period":{"type":"string","description":"주가 정보를 조회할 기간을 입력하세요. (예: 1d, 5d, 1mo, 3mo, 1y, 5y)"}},"required":["ticker","period"]}}}
# 파일명 : tools/gpt_functions.py
fromtoolsimport_get_current_time,_get_yf_stock_info,_get_yf_stock_history,_get_yf_stock_recommendations# 사용 가능한 도구(펑션)들에 대한 설명 정보 리스트
tools=[_get_current_time.tool_def,_get_yf_stock_info.tool_def,_get_yf_stock_history.tool_def,_get_yf_stock_recommendations.tool_def]# 도구(펑션) 이름과 실행할 함수 매팽
deftool_mapping(tool_name:str,arguments:dict|None):iftool_name=="get_current_time":func_result=_get_current_time.func(timezone=arguments["timezone"])eliftool_name=="get_yf_stock_info":func_result=_get_yf_stock_info.func(ticker=arguments["ticker"])eliftool_name=="get_yf_stock_history":func_result=_get_yf_stock_history.func(ticker=arguments["ticker"],period=arguments["period"])eliftool_name=="get_yf_stock_recommendations":func_result=_get_yf_stock_recommendations.func(ticker=arguments["ticker"])returnfunc_result
# main.py
fromopenaiimportOpenAIfromtools.gpt_functionsimporttools,tool_mappingimportjsonAPI_KEY=*************# api key 입력
defget_ai_response(messages:list[dict],model:str="gpt-4o",tools=tools):api_key=API_KEYclient=OpenAI(api_key=api_key)response=client.chat.completions.create(model=model,messages=messages,tools=tools,)returnresponsedefterminal_chat():messages=[]whileTrue:# 사용자 입력
user_input=input("◆ user\t:")ifuser_input=="exit":break# 대화 내역 추가
messages.append({"role":"user","content":user_input})# AI의 1차 답변
response=get_ai_response(messages=messages)# AI 1차 답변 분석 및 처리
ai_message=Noneifhasattr(response,"choices"):# 펑션 콜링 처리
ifresponse.choices[0].message.tool_calls:ai_message_obj=response.choices[0].messagetool_calls=ai_message_obj.tool_calls# messages 에 tool calls 추가
messages.append(ai_message_obj)# 펑션 콜링 처리
fortool_callintool_calls:tool_name=tool_call.function.nametool_call_id=tool_call.idarguments=json.loads(tool_call.function.arguments)func_result=tool_mapping(tool_name=tool_name,arguments=arguments)messages.append({"role":"tool","tool_call_id":tool_call_id,"name":tool_name,"content":str(func_result)})# 펑션콜링 결과를 반영한 AI 2차 답변
response=get_ai_response(messages=messages)# AI 최종 응답
ai_message=response.choices[0].message.contentmessages.append({"role":"assistant","content":ai_message})# 화면 출력
ifai_message:print("◆ AI\t:"+ai_message)defmain():terminal_chat()
1
2
# 실행
uv run main.py
대화 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
◆ user :애플 주식 정보 알려줘
◆ AI :애플(AAPL) 주식에 대한 정보를 다음과 같이 제공할 수 있습니다:
- **회사명**: Apple Inc.
- **산업분야**: 소비자 전자 제품
...
◆ user :서울과 뉴욕의 시간 알려줘
◆ AI :현재 시간은 다음과 같습니다:
- **서울(한국)**: 2026년 2월 2일 오후 7시 30분
- **뉴욕(미국)**: 2026년 2월 2일 오전 5시 30분
추가적인 도움이 필요하시면 언제든지 말씀해 주세요!
◆ user :시간정보는 출처가 어디야
◆ AI :시간 정보는 지정된 시간대에 따라 시스템에서 자동으로 계산된 결과입니다. 일반적으로 세계 표준 시간(UTC) 기준에서 각 시간대의 오프셋을 적용하여 계산합니다. 다른 질문 있으시면 알려주세요!
◆ user :펑션콜링한거야?
◆ AI :네, 저는 시간 정보를 얻기 위해 "get_current_time" 함수를 호출했습니다. 이를 통해 서울과 뉴욕의 현재 시간을 각각 가져올 수 있었습니다. 추가 질문이나 다른 요청이 있으시면 말씀해 주세요!user :안녕?
◆ AI :안녕하세요! 어떤 도움이 필요하신가요? 궁금한 점이나 요청 사항이 있으면 말씀해 주세요!
Comments