1차 과제 응용 (투자에 랭체인 적용해보기)

들어가며

안녕하세요. 저는 11기 랭체인 캠프에 참여하는 류재혁이라고 합니다.

저는 경제학을 전공하고, 공기업에서 행정 업무를 처리하는 문송한 직장인으로 개발자는 아니지만, 랭체인 이라는 개념이 너무 중요해 보이고 궁금해서 캠프에 참여하게 되었습니다. 제가 미국에서 체류 중이라, 수업 참여나, 다른 활동이 어렵지만 저 나름대로 열심히 공부해 보도록 하겠습니다.

1차 과제를 천천히 해보다 조금 샛길로 빠져서, 저의 관심 분야인 투자와 연결시킬 방법을 생각해 보았습니다.

1. 투자주제를 입력하면 주식을 추천해주는 챗봇

갑자기 어떤 주제나 분야, 인물에 관련된 주식 종목이 궁금할 때가 있습니다. 이럴 때 그 주제를 입력하면(예시: 워렌버핏)을 입력하면, 워렌버핏과 관련된 종목 5개와 그 이유를 설명하는 챗봇을 만들어 보았습니다.

구현

STEP 1. 프롬프트를 세팅합니다.
투자 전문가라고 생각하고, 입력받은 토픽에 대해 투자할만한 상위 5개 주식과 그 이유를 추천해 달라고 합니다.

STEP 2. 모델을 세팅합니다.
비용이 우려되어 3.5로 세팅합니다

STEP 3. 파서를 세팅합니다.
결과물 파싱을 위해 파서를 지정합니다.

STEP 4. Chain을 연결합니다.
프롬프트템플릿 | 모델 | 파서 형식으로 작성합니다.

기타사항: 향후 주식목록을 통한 주가분석 백테스팅을 대비하여 json으로 담아놓습니다.

import os
import json
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

def create_chain():
    model = ChatOpenAI(model="gpt-3.5-turbo")
    output_parser = StrOutputParser() /
    prompt = ChatPromptTemplate.from_template("당신은 투자 전문가입니다. '{topic}'에 대해 투자할만한 상위 5개의 주식을 추천하고 그 이유를 설명해 주세요.")
    chain = prompt | model | output_parser
    return chain

def get_user_input(prompt_message):
    return input(prompt_message)

def invoke_chain(chain, topic):
    try:
        result = chain.invoke({"topic": topic})
        return result
    except Exception as e:
        print(f"오류가 발생했습니다: {e}")
        return None

def log_result(topic, result):
    with open("investment_recommendations.json", "a") as log_file:
        log_data = {
            "topic": topic,
            "result": result
        }
        json.dump(log_data, log_file, ensure_ascii=False, indent=4)
        log_file.write("\n")

def main():
    chain = create_chain()
    
    while True:
        topic = get_user_input("투자 주제 (종료하려면 'exit' 입력): ")
        if topic.lower() == 'exit':
            break
        
        result = invoke_chain(chain, topic)
        
        if result:
            print("추천된 주식:")
            print(result)
            print("JSON 형식으로 출력:")
            json_output = {
                "investment_recommendations": result
            }
            print(json.dumps(json_output, ensure_ascii=False, indent=4))
            log_result(topic, json_output)
        else:
            print("주식 추천을 생성하지 못했습니다. 다시 시도해주세요.")

if __name__ == "__main__":
    main()

결과

결과 해석

워렌 버핏을 검색했을때, 생각보다 꽤나 괜찮은 주식을 추천해 주었습니다. 또한 추천의 이유(보유주식 또는 관련 주식)가 설득력있게 다가왔습니다. 아울러 json형식으로 저장하여, 향후에 주가와 연계한 분석 등을 시도해 보려고 합니다.


2. 기업을 입력하여, 특징과 경쟁기업, 나만의 투자기준 부합여부를 알려주는 챗봇

최근 핫한 기업을 입력하고, 그 기업의 특징과 경쟁하는 기업, 나만의 투자기준(예: 유명 컨설팅 기관인 가트너 전략트랜드 포함여부) 등을 한글 또는 선택언어 두가지로 알려주는 챗봇을 구현해 보았습니다.

투자를 하다보면 핫한 기업의 주가가 너무 많이 올라 그기업에는 손이 잘 나가지를 않고 그와 관련된 기업을 종종 찾게 됩니다. 그러한 기업을 찾고, 그 기업이 나의 투자기준(여기서는 가트너 전략트렌드)에 부합하는지를 확인하는 필터링을 거쳐, 투자에 대한 고민을 더욱 구체화할 수 있습니다.

구현

STEP 1. 프롬프트를 세팅합니다.
회사를 입력받고, 그 회사의 기술과 제품, 경쟁기업, 가트너 트렌드 목록, 선택언어 세팅, 메가트렌드 목록에 해당여부 등의 프롬프트를 세팅합니다

STEP 2. 모델을 세팅합니다.
비용이 우려되어 3.5로 세팅합니다

STEP 3. 파서를 세팅합니다.
결과물 파싱을 위해 파서를 지정합니다.

STEP 4. Chain을 연결합니다.
프롬프트템플릿 | 모델 | 파서 형식으로 작성합니다.

import os
import json
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

def create_chain():
    model = ChatOpenAI(model="gpt-3.5-turbo")
    output_parser = StrOutputParser() /
    prompt = ChatPromptTemplate.from_template("당신은 투자 전문가입니다. '{topic}'에 대해 투자할만한 상위 5개의 주식을 추천하고 그 이유를 설명해 주세요.")
    chain = prompt | model | output_parser
    return chain

def get_user_input(prompt_message):
    return input(prompt_message)

def invoke_chain(chain, topic):
    try:
        result = chain.invoke({"topic": topic})
        return result
    except Exception as e:
        print(f"오류가 발생했습니다: {e}")
        return None

def log_result(topic, result):
    with open("investment_recommendations.json", "a") as log_file:
        log_data = {
            "topic": topic,
            "result": result
        }
        json.dump(log_data, log_file, ensure_ascii=False, indent=4)
        log_file.write("\n")

def main():
    chain = create_chain()
    
    while True:
        topic = get_user_input("투자 주제 (종료하려면 'exit' 입력): ")
        if topic.lower() == 'exit':
            break
        
        result = invoke_chain(chain, topic)
        
        if result:
            print("추천된 주식:")
            print(result)
            print("JSON 형식으로 출력:")
            json_output = {
                "investment_recommendations": result
            }
            print(json.dumps(json_output, ensure_ascii=False, indent=4))
            log_result(topic, json_output)
        else:
            print("주식 추천을 생성하지 못했습니다. 다시 시도해주세요.")

if __name__ == "__main__":
    main()

결과

결과 해석

데이터 브릭스라는 데이터기업을 입력하여, 그들과 관련된 정보를 알려줍니다. 다만 데이터분석 이라는 분야는 가트너 전략기술이 매년 선정이 되고 있는데, “databricks의 기술/제품은 가트너 메가트렌드에 속하지 않습니다.” 라고 결과를 표시하는 것은 문제가 있어 보입니다. 해당 부분에 대한 프롬프트 수정 및 추가가공을 통해 개선이 필요합니다. 아울러 경쟁기업에 대해 알려주고 있는데, 기업이 아닌 경쟁 서비스가 섞여있어 이 또한 추가 가공이 필요합니다.

3. 랭체인 과제를 하면서 느낀점

이번 과제를 하면서 느낀 점은 랭체인은 어떠한 문제를 해결하는데 있어서, 언어적인 문제로 노가다로 진행해 왔던 부분을, llm이라는 모델을 통해 매끄럽게 자동화로 연결하는 혁명적인 라이브러리 라는 생각이 들었습니다. 데이터와 데이터를 이어주는 가교와 비정형분석 등을 자유자재로 연결하여, 제가 해결하고자 하는 다양한 문제를 보다 쉽고 효율적으로 해결할 수 있을 것이라는 생각이 들었습니다.

위에서의 보완점을 토대로, 문제해결 과정의 연결성과 정확성을 높여서 두번째 과제에서는 투자와 관련한 유의미한 프로젝트를 진행해보도록 하겠습니다.

5
1개의 답글

👉 이 게시글도 읽어보세요