brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Jul 22. 2024

AI 5탄-4. 음성인식 AI 비서 만들기

생성형 AI 활용 앱 만들어줘-4/5

<15> STT 서비스 소개 (실습)

<16> TTS서비스 소개 (실습)

<17> 챗GPT 문서 요약 프롬프트 제작 (실습)

<18> 랭체인을 활용한 문서 요약 서비스 (실습)

<19> 그라디오로 챗봇 제작 (실습)



음성 인식 서비스 + 그라디오 UI를 통해 원하는 서비스를 만들어보자.

위스퍼 음성 인식봇

문서 요약 봇

프롬프트를 활용해 일정 관리봇을 만들자.






<15> STT 서비스 소개 (실습)


1

클로바 노트

https://clovanote.naver.com/w/GLVmFuTPp9bptqogdpEw/home



2

다글로

https://daglo.ai/



3

구글 받아쓰기




<16> TTS서비스 소개 (실습)


1

클로바 보이스

https://api.ncloud-docs.com/docs/ai-naver-clovavoice




2

STT - 위스퍼



1)

오픈AI (OpenAI)의 음성 인식 시스템 위스퍼(Whisper)


2) 소스



코드

https://github.com/heypythonai/heypythonai/blob/main/Part3%20-%20%E1%84%8F%E1%85%A9%E1%84%83%E1%85%B3/%ED%97%A4%EC%9D%B4%ED%8C%8C%EC%9D%B4%EC%8D%AC%203-1%20STT.ipynb



hey_audio_1.mp3  코랩에 업로드 




!pip install -qq --upgrade openai



from openai import OpenAI

OPENAI_API_KEY = "sk-proj-TAX4WzzKdniGg8TrjE6P5s7h5I71QaxeYn9Tg_UA"

client = OpenAI(api_key=OPENAI_API_KEY)

speech_output_path = "./hey_audio_1.mp3" # 임의로 녹음한 음성 파일

audio_file= open(speech_output_path, "rb")

transcript = client.audio.transcriptions.create(

model="whisper-1",

file=audio_file

)

print(transcript.text)




3

TTS




<17> 챗GPT 문서 요약 프롬프트 제작 (실습)



1

https://github.com/heypythonai/heypythonai/blob/main/Part3%20-%20%E1%84%8F%E1%85%A9%E1%84%83%E1%85%B3/%ED%97%A4%EC%9D%B4%ED%8C%8C%EC%9D%B4%EC%8D%AC%204%20%EC%B1%97GPT%20%EB%AC%B8%EC%84%9C%EC%9A%94%EC%95%BD.ipynb




2

# 랭체인과 pypdf 라이브러레 설치


pip install pypdf



from openai import OpenAI

from google.colab import userdata

import os

os.environ["OPENAI_API_KEY"] = userdata.get('OPENAI_API_KEY')

client = OpenAI()



from langchain.document_loaders import PyPDFLoader

def pdf_loader(pdf_path):

    loader = PyPDFLoader(pdf_path)

    pdf_doc = loader.load()

    return pdf_doc

pdf_path = "hey_pdf_2.pdf"

pages_content = pdf_loader(pdf_path)[0].page_content # 첫 번째 페이지

# 영어로 해야 속도가 빠릅니다.

system_ai_en = """You are an artificial intelligence assistant, and you

should be able to respond to various topics such as reading PDFs,

summarizing documents, managing schedules, providing weather information,

searching for the shortest route, and conducting web searches. Please respond

briefly in Korean."""

prompt = """다음은 문서 중 일부 내용입니다.

{pages_content}

이 문서의 주요 내용을 요약해 주세요.

답변:"""

completion = client.chat.completions.create(

    model="gpt-3.5-turbo-1106",

    messages=[

        {"role": "system", "content": system_ai_en},

        {"role": "user", "content": prompt.format(pages_content=pages_content)},

    ]

)

print(completion.choices[0].message.content)



응답

요약

헤이마트는 고객에게 고품질의 제품과 다양성을 자랑하며 최상의 서비스를 제공하기 위해 노력하고 있습니다. 신선한 과일부터 다양한 상품까지 제공하며 지역 농산물과 수제제품을 통해 특별한 맛을 선사하고 있습니다.





<18> 랭체인을 활용한 문서 요약 서비스 (실습)



1

랭체인을 활용한 문서 요약 서비스를 진행


큰문서를 작은 문서로 나누어 각각의 요약을 진행한후 최종적으로 합쳐서 요약한다.

장점은 큰 문서라도 요약 가능

단점은 많은 API를 호출한다.



2

맵리듀스 방식을 이용한 PDF 문서 요약.


순서?

문서 내용 로드

문서 내용 분할

분할 내용 각각 요약 실행

각 문서의 요약본 통합 실행

최종 결과 통합 체인 생성



3

https://github.com/heypythonai/heypythonai/blob/main/Part3%20-%20%E1%84%8F%E1%85%A9%E1%84%83%E1%85%B3/%ED%97%A4%EC%9D%B4%ED%8C%8C%EC%9D%B4%EC%8D%AC%205%20%EB%9E%AD%EC%B2%B4%EC%9D%B8%EC%9D%84%20%ED%99%9C%EC%9A%A9%ED%95%9C%20%EB%AC%B8%EC%84%9C%20%EC%9A%94%EC%95%BD.ipynb





4

# 코랩


hey_pdf.pdf 업로드



5

from langchain.document_loaders import PyPDFLoader

def pdf_loader(pdf_path):

    loader = PyPDFLoader(pdf_path)

    pdf_doc = loader.load()

    return pdf_doc



6

pdf_path = "hey_pdf.pdf"

pages_content = pdf_loader(pdf_path)

print(pages_content[0].page_content[:200])


안녕하세요! 헤이마트는 신선한 과일과 다양한 물건을 판매하는 동네 마트입니다. 우리 마트는 고 품질의 제품과 넓은 다양성을 자랑합니다.    우리 마트에서는 신선한 과일을 특별히 추천합니다. 매일 새로운 과일이 신선하게 도착하며, 다양 한 종류와 풍부한 맛으로 고객님께 건강과 기쁨을 전해드립니다. 사과, 바나나, 포도, 딸기 등 다 양한 과일을 저렴한 가격



7

from langchain.text_splitter import RecursiveCharacterTextSplitter

# 스플리터 설정

text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(

    chunk_size=3000,

    chunk_overlap=0,

)

# pages_content 내용 분할

split_docs = text_splitter.split_documents(pages_content)

# 분할된 문서의 수 확인

print("분할된 문서의 개수는: ", len(split_docs))



분할된 문서의 개수는:  1




8

# 각각의 문서에 대한 요약 실행

from langchain.prompts import PromptTemplate

from langchain.chat_models import ChatOpenAI

from langchain.chains import LLMChain

from openai import OpenAI

from google.colab import userdata

import os

os.environ["OPENAI_API_KEY"] = userdata.get('OPENAI_API_KEY')

# map template 설정, {pages_content} 분할된 내용이 입력

map_template = """다음은 문서 중 일부 내용입니다

{pages_content}

이 문서의 주요 내용을 요약해 주세요.

"""

# map 기본 프롬프트

map_prompt = PromptTemplate.from_template(map_template)

# 문서내용이 길 수 있기 때문에 model을 gpt-3.5-turbo-16k 설정

llm = ChatOpenAI(temperature=0,

                 model_name='gpt-3.5-turbo-16k')

map_chain = LLMChain(llm=llm, prompt=map_prompt)

# reduce 단계에서 처리할 프롬프트 정의

reduce_template = """다음은 문서 요약의 집합입니다:

{summaries}

이 내용을 바탕으로 통합된 문서 요약을 작성해 주세요.

"""

# Reduce 프롬프트

reduce_prompt = PromptTemplate.from_template(reduce_template)

# Reduce에서 수행할 LLMChain 정의

reduce_chain = LLMChain(llm = llm, prompt = reduce_prompt)




9


!pip install -qq openai langchain pypdf tiktoken

from langchain.chains.combine_documents.stuff import StuffDocumentsChain

from langchain.chains import ReduceDocumentsChain

# 문서 목록 통합 체인 설정

combine_doc_chain = StuffDocumentsChain(

    llm_chain=reduce_chain,

    document_variable_name="summaries" # reduce 프롬프트에 대입되는 변수

)

# 분할된 문서를 순차적으로 reduce 처리

reduce_doc_chain = ReduceDocumentsChain(

    combine_documents_chain=combine_doc_chain,

    collapse_documents_chain=combine_doc_chain,

    token_max=4000,

)



10

from langchain.chains import MapReduceDocumentsChain

# 최종 체인 연결

final_chain = MapReduceDocumentsChain(

    llm_chain=map_chain, # 각 문서 맵핑

    reduce_documents_chain=reduce_doc_chain,

    document_variable_name="pages_content",

    return_intermediate_steps=False,

)

# 최종 결과 실행

result_summary = final_chain.run(split_docs)

# 요약 결과 출력

print(result_summary)


결과

헤이마트는 신선한 과일과 다양한 물건을 판매하는 동네 마트로, 고품질의 제품과 다양성을 자랑합니다. 특히 신선한 과일을 매일 새로운 종류로 추천하며, 다양한 종류와 맛의 과일을 저렴한 가격에 판매합니다. 또한 생활용품, 식료품, 주방용품, 세제류, 건강식품 등 다양한 물건도 판매하며, 친절하고 경험이 풍부한 직원들이 항상 고객을 위해 최선을 다하며, 상담과 도움을 제공합니다. 또한 마트는 지역 사회와의 교류를 소중히 여기고, 지역 재료와 협력하여 신선하고 지역적인 맛을 즐길 수 있는 제품을 제공합니다.






<19> 그라디오로 챗봇 제작 (실습)


1

위스퍼 음성 인식봇

문서 요약 봇

프롬프트를 활용해 일정 관리봇 작성해보자.



2

코드

https://github.com/heypythonai/heypythonai/blob/main/Part3%20-%20%E1%84%8F%E1%85%A9%E1%84%83%E1%85%B3/%ED%97%A4%EC%9D%B4%ED%8C%8C%EC%9D%B4%EC%8D%AC%207%20%EC%99%84%EC%84%B1%EB%90%9C%20%EB%B4%87%20%EC%A0%84%EC%B2%B4%EC%BD%94%EB%93%9C.ipynb



3




4



다음

https://brunch.co.kr/@topasvga/3931


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari