[32일차] - LangChain

btga·2024년 2월 1일

SKT FLY AI 4기

목록 보기
30/31

1. Streamlit

1) chatgpt-00.py

import openai
import streamlit as st

OPENAI_API_KEY = ''
OPENAI_AZURE_ENDPOINT = ''
OPENAI_API_TYPE = 'azure'
OPENAI_API_VERSION = '2023-05-15'

openai.api_key = OPENAI_API_KEY
openai.azure_endpoint = OPENAI_AZURE_ENDPOINT
openai.api_type = OPENAI_API_TYPE
openai.api_version = OPENAI_API_VERSION

query = st.text_input('Query?: ')

button_result = st.button('RUN')

if button_result:
    result = openai.chat.completions.create(
        model = 'dev-gpt-35-turbo',
        messages=[
            {'role':'system', 'content':'You are a helpful assistant.'},
            {'role':'user', 'content':query}
            ]
)

st.write(result.choices[0].message.content)
  • 실행 결과

2) chatgpt-01.py

  • ver1.
import openai
import streamlit as st

OPENAI_API_KEY = ''
OPENAI_AZURE_ENDPOINT = ''
OPENAI_API_TYPE = 'azure'
OPENAI_API_VERSION = '2023-05-15'

openai.api_key = OPENAI_API_KEY
openai.azure_endpoint = OPENAI_AZURE_ENDPOINT
openai.api_type = OPENAI_API_TYPE
openai.api_version = OPENAI_API_VERSION

st.header('인공지능 시인 서비스', divider='rainbow')

name = st.text_input('이름을 입력하세요.')

if name:
    st.write(name + '님 반갑습니다!')

subject = st.text_input('주제를 입력하세요')
content = st.text_area('시의 내용을 입력하세요')

button_result = st.button('RUN')

if button_result:
    result = openai.chat.completions.create(
        model = 'dev-gpt-35-turbo',
        messages=[
            {'role':'system', 'content':'You are a helpful assistant.'},
            {'role':'user', 'content':'작가의 이름은 ' + name},
            {'role':'user', 'content':'시의 주제는 ' + subject},
            {'role':'user', 'content':'시의 내용은 ' + content},
            {'role':'user', 'content':'이 내용으로 시를 지어줘'}
            ]
)
    st.write(result.choices[0].message.content)
  • 실행 결과: streamlit run chatgpt-01.py로 실행

  • ver2. spinner 추가 + 자유도 높게

import openai
import time
import streamlit as st

OPENAI_API_KEY = ''
OPENAI_AZURE_ENDPOINT = ''
OPENAI_API_TYPE = 'azure'
OPENAI_API_VERSION = '2023-05-15'

openai.api_key = OPENAI_API_KEY
openai.azure_endpoint = OPENAI_AZURE_ENDPOINT
openai.api_type = OPENAI_API_TYPE
openai.api_version = OPENAI_API_VERSION

st.header('인공지능 시인 서비스', divider='rainbow')

name = st.text_input('이름을 입력하세요.')

if name:
    st.write(name + '님 반갑습니다!')

subject = st.text_input('주제를 입력하세요')
content = st.text_area('시의 내용을 입력하세요')

button_result = st.button('RUN')

if button_result:
    with st.spinner('please wait.....'):
        result = openai.chat.completions.create(
            model = 'dev-gpt-35-turbo',
            temperature=1, # 1일수록 자유도 높아짐(F..?)
            messages=[
                {'role':'system', 'content':'You are a helpful assistant.'},
                {'role':'user', 'content':'작가의 이름은 ' + name},
                {'role':'user', 'content':'시의 주제는 ' + subject},
                {'role':'user', 'content':'시의 내용은 ' + content},
                {'role':'user', 'content':'이 내용으로 시를 지어줘'}
                ]
    )
        st.write(result.choices[0].message.content)
        st.success('done') # spinner 멈춤
  • 실행 결과

3) github

  • repo 만들기: aipoem

  • cmd 창에서 새로운 폴더 만든 후, 그 디렉토리로 이동 후 git clone

  • chatgpt-01.py 파일 복사해오기

  • git status

  • git add *

  • git commit -m "Add chatgpt-01.py"

  • git push

  • Streamlit에서 deploy

  • aipoem 폴더에 requirements.txt 만들기

  • git push

2. LangChain

GPT와 같은 대형 언어 모델을 기반으로 한 애플리케이션 개발을 위한 오픈 소스 프레임워크

1) LC-00-LLM.ipynb(코랩 사용)

!pip install openai
!pip install langchain
import os

os.environ['OPENAI_API_KEY'] = ' '
os.environ['AZURE_OPENAI_ENDPOINT'] = ' '
os.environ['OPENAI_API_TYPE'] = 'azure'
os.environ['OPENAI_API_VERSION'] = '2023-05-15'

from langchain.llms import AzureOpenAI

llm = AzureOpenAI(
                  deployment_name='dev-gpt-35-turbo-instruct'
      )

llm.invoke('why python is the most popular language?')
# 위의 코드와 동일한 결과 나옴
from langchain.chat_models import AzureChatOpenAI

chatgpt = AzureChatOpenAI(deployment_name='dev-gpt-35-turbo')
answer = chatgpt.invoke('Why Python is the most popular language?')

print(answer)
  • answer the Korean 추가 시, 한국어로 답변 출력됨
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler

chatgpt = AzureChatOpenAI(
              deployment_name='dev-gpt-35-turbo',
              temperature=1,
              streaming=True,
              callbacks=[StreamingStdOutCallbackHandler()]

)

answer = chatgpt.invoke('Why Python is the most popular language? answer the Korean')
  • 번역기
from langchain.schema import SystemMessage, AIMessage, HumanMessage

chatgpt = AzureChatOpenAI(deployment_name='dev-gpt-35-turbo', temperature=0)

messages=[
    SystemMessage(content='You are a helpful assistant that translates English to Korean'),
    HumanMessage(content='I love langchain')
]

answer = chatgpt(messages)
print(answer.content)

2) LC-01-LC-01-LLM.ipynbLLM.ipynb

  • 완성형 언어 모델의 프롬프트
from langchain.prompts import PromptTemplate, ChatPromptTemplate

string_prompt = PromptTemplate.from_template('Tell me a joke about {subject}')
string_prompt_value = string_prompt.format_prompt(subject='soccer')

string_prompt_value.text
  • 대화형 언어 모델의 프롴프트
chat_prompt = ChatPromptTemplate.from_template('Tell me a joke about {subject}')
chat_prompt_value = chat_prompt.format_prompt(subject='soccer')

chat_prompt_value.messages[0].content

  • 대화형 언어 모델의 템플릿 활용
from langchain.prompts import(
          ChatPromptTemplate,
          PromptTemplate,
          SystemMessagePromptTemplate,
          AIMessagePromptTemplate,
          HumanMessagePromptTemplate
)

from langchain.schema import(
          SystemMessage,
          AIMessage,
          HumanMessage
)
#  대화형 탬플릿의 완성

# System Template
system_template_prompt = SystemMessagePromptTemplate.from_template(template)

# Human Template
human_template = '{재료}'
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)

# Chat Template
chat_prompt = ChatPromptTemplate.from_messages([system_template_prompt,
                                                human_message_prompt])

prompt = chat_prompt.format_prompt(재료='양파,계란,사과,빵').to_messages()
prompt
  • Few-show learning template
from langchain.prompts.few_shot import FewShotPromptTemplate
from langchain.prompts import PromptTemplate

examples =[
    {
        'question':'아이유로 삼행시를 지어줘',
        'answer': '''
          아 아이유는
          이 이상하고
          유 유난히 좋다.
        '''
    },
    {
        'question':'이순신으로 삼행시를 지어줘',
        'answer':'''
          이 이순신 장군은
          순 순순히 내어줄 것 같았던 조선의 바다를
          신 신의와 충의의 마음으로 지켜냈다.
        '''
    }
]

3) LC-02-Document_Loader.ipynb

  • !pip install langchain
  • 기사 크롤링
from langchain.document_loaders import WebBaseLoader

loader = WebBaseLoader('https://www.yonhapnewstv.co.kr/news/MYH20240201006900641')
data = loader.load()

print(data[0].page_content)
  • pypdf: pdf 파일 읽어들일 수 있는 라이브러리
# PDF 파일 읽어오기
from langchain.document_loaders import PyPDFLoader


loader = PyPDFLoader('/content/[정책브리프 2021-04] 탄소중립 대응을 위한 정부 정책과 동향 (1).pdf')
pages = loader.load_and_split() # PDF load & split

  • docx2txt: word에서 텍스트 추출해주는 라이브러리
# Word 문서를 읽어 온다.

from langchain.document_loaders import Docx2txtLoader
loader = Docx2txtLoader('/content/LLM이 만들어 내는 혁명과 교통산업.docx')

data = loader.load()
  • csv 파일 읽기
from langchain.document_loaders import CSVLoader
loader = CSVLoader(
    file_path='/content/titanic3.csv', csv_args={
        'delimiter':',', # 구분자
        'quotechar':'"',
        'fieldnames':['pclass','survived','name','sex','age','sibsp','parch','ticket','fare','cabin','embarked','boat','body','home.dest'] 
    }
)
data = loader.load()
  • !pip install langchain_experimental
from langchain_experimental.agents.agent_toolkits.pandas.base import create_pandas_dataframe_agent 

from langchain.agents import AgentType
from langchain.llms import AzureOpenAI
from langchain.llms import AzureOpenAI

completion_llm = AzureOpenAI(deployment_name='dev-gpt-35-turbo-instruct',
                        temperature=0)

agent = create_pandas_dataframe_agent(completion_llm,
                                      df=df,
                                      agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
                                      verbose=True)

0개의 댓글