허세임
허세임
⚔️ 베테랑 파트너
📹 SNS 찐친

[7기 랭체인] Click 한번으로 영어학습자료 만들기

안녕하세요. 7기 랭체인 스터디에서 활동중인 허세임입니다. 오늘은 제가 올렸던 지난번 유튜브로 영어공부하는 법을 streamlit과 랭체인을 이용해 웹서비스로 구현해보려합니다.

Youtube 영상 하나로 영어공부 자료 만들기 | GPTers 그룹



구현 시작


유튜브 링크를 통해 제가 원하는 영어 자료를 얻기 위해서는 총 3단계를 거쳐야 합니다.

  1. 유튜브 script 받아오기

  2. 문장 10개 추출하기

  3. 추출한 문장들에 대해 예문을 포함한 사전만들기



유튜브 scrpit 받아오기

랭체인은 기본적으로 여러 소스에서 통합해서 데이터를 가져올 수 있는 편리한 도구입니다. document에서 youtube에 관련된 부분을 참고할 수 있습니다.

YouTube transcripts | 🦜️🔗 Langchain

해당 코드를 참조하여 원하는 유튜브의 transcript를 받아오는 코드를 작성했습니다.

from langchain.document_loaders import YoutubeLoader
import ssl

ssl._create_default_https_context = ssl._create_unverified_context
# ssl 코드 부분을 추가해주어야 에러가 나지 않습니다 


loader = YoutubeLoader.from_youtube_url(ytURL)
yt = loader.load()
transcript = yt[0].page_content



체인 설계하기

총 세단계중에서 2와 3단계는 직접 랭체인을 이용하는 부분입니다. 체인을 2개 생성하고, 체인1에서 받아온 대답을 활용해서 체인2를 돌려야합니다. 따라서 랭체인 도큐먼트에서 멀티플체인에 대한 부분을 참조합니다.

Multiple chains | 🦜️🔗 Langchain

프롬포트 탬플릿을 사용해서 체인을 작성하고있습니다. 첫번째 사례발표때 했던 AI예언가 에서는 그냥 스트링으로 때려넣었는데, 템플릿을 사용하니 잇풋 아웃풋을 넘겨주기 용이합니다. 멀티플체인은 체인2에 체인1을 포함시켜서 작성하는 부분을 확인하고, 이를 참조해서, 제가 원하는 코드를 만들어봅니다.


from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema import StrOutputParser

model = ChatOpenAI(
    model="gpt-4",
    temperature=0.7,
    max_tokens=7000,
)

def generate_sentence_and_dict(transcript):
    prompt1 = ChatPromptTemplate.from_template(
        "당신은 IELTS나 TOEFL 시험을 준비하는 한국인을 위한 탁월한 영어 교사입니다. 이제 다음 스크립트 중에서 영어 스피킹 공부에 유용한 영어문장 10개를 뽑아 리스트를 만들어주세요. \\n\\n {transcript}"
    )
    prompt2 = ChatPromptTemplate.from_template(
        "주어진 각 10문장에서 구동사나 숙어에 관한 사전을 만들어주세요. 사전은 표제어(구동사나 숙어), 한글 뜻, 원래 영어 문장, 그리고 프렌즈 시트콤에서의 영어 예문을 포함한 사전 리스트를 제작해주세요. 원래 영어 문장과 프렌즈 영어 예문에서 표제어에 해당하는 부분은 볼드 처리해주세요.  ```1. **[표제어]**\\n   - 뜻: [표제어의 한글 뜻]\\n    - 원래 문장 예시: [원래 영어 문장]\\n   - 프렌즈 예문: [프렌즈 시트콤에서의 영어 예문]```\\n\\n {sentence_list}  "
    )

    chain1 = prompt1 | model | StrOutputParser()

    chain2 = {"sentence_list": chain1} | prompt2 | model | StrOutputParser()

    response = chain2.invoke({"transcript": transcript})

    return response

복사 붙여넣기 만큼 편한게 없습니다. 구조는 동일하고 프롬프트의 내용만 변경하였습니다.

  • 첫번째 체인: transcript → sentence list

  • 두번째 체인: sentence list → dictionary



Trouble Shooting


모델 토큰 제한

유튜브 transcript의 길이 때문인지 gpt-4 모델은 사용할 수 없나봅니다. chatgpt에서는 같은영상으로 한번에 가능했는데, 이게 멀티플 체인이어서 그런지 각각 따로 보내면 괜찮은건지 알고싶습니다.

어쩔수 없이 gpt-3.5-turbo-16k-0613모델로 진행합니다.


다소 멍청한 결과

3.5로 돌리자마자 바보같이 한글 표현으로 사전을 만들었습니다. 조금은 멍청한 3.5를 위해 프롬프트를 조금더 구체적으로 작성해주었습니다. 영어 표제어를 적고 영어 문장을 적고 한글 뜻을 적어라

prompt2 = ChatPromptTemplate.from_template(
        "주어진 각 10문장에서 구동사나 숙어에 관한 사전을 만들어주세요. 사전은 표제어(구동사나 숙어), 한글 뜻, 원래 영어 문장, 그리고 프렌즈 시트콤에서의 영어 예문을 포함한 사전 리스트를 제작해주세요. 원래 영어 문장과 프렌즈 영어 예문에서 표제어에 해당하는 부분은 볼드 처리해주세요.  ```1. **[표제어]**\\n   - 뜻: [표제어의 한글 뜻]\\n    - 원래 문장 예시: [원래 영어 문장]\\n   - 프렌즈 예문: [프렌즈 시트콤에서의 영어 예문]```\\n\\n {sentence_list}  "
    )


완성 결과




결과는 원하는대로 예쁘게 나왔네요. 클릭 한번에 유튜브 링크가 이렇게 영어사전으로 바뀌는게 신기할 따름입니다. 다만 구동사나 숙어에 대해 알고싶었는데, 표제어가 다소 간단한 감이 있습니다. 그리고 프렌즈 예문을 통해 조금 더 다양한 상황에서의 적용을 알고 싶었는데 3.5모델이어서 그런지 원래 문장과 크게 다르지 않아 아쉽습니다. 4를 이용할 땐 거의 작가수준이었는데 말이죠..

gpt-4 결과와 비교


헤헤 그래도 완성해서 뿌듯합니당 😎



느낀점

  1. 랭체인에서 유튜브같이 다른 소스를 함께 활용할 수 있다는 점이 매력적이다.

  2. 여러 체인을 쓸때 각 체인에 따라 토큰을 어떻게 계산하는지 알아볼필요가 있다.

  3. 나.. 어쩌면 랭체인 스터디 계속해도 될지도..?




7
3개의 답글

👉 이 게시글도 읽어보세요