생성형 AI 활용 앱 만들어줘-4/5
음성 인식 서비스 + 그라디오 UI를 통해 원하는 서비스를 만들어보자.
위스퍼 음성 인식봇
문서 요약 봇
프롬프트를 활용해 일정 관리봇을 만들자.
1
클로바 노트
https://clovanote.naver.com/w/GLVmFuTPp9bptqogdpEw/home
2
다글로
3
구글 받아쓰기
1
클로바 보이스
https://api.ncloud-docs.com/docs/ai-naver-clovavoice
2
STT - 위스퍼
1)
오픈AI (OpenAI)의 음성 인식 시스템 위스퍼(Whisper)
2) 소스
코드
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
1
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)
응답
요약
헤이마트는 고객에게 고품질의 제품과 다양성을 자랑하며 최상의 서비스를 제공하기 위해 노력하고 있습니다. 신선한 과일부터 다양한 상품까지 제공하며 지역 농산물과 수제제품을 통해 특별한 맛을 선사하고 있습니다.
1
랭체인을 활용한 문서 요약 서비스를 진행
큰문서를 작은 문서로 나누어 각각의 요약을 진행한후 최종적으로 합쳐서 요약한다.
장점은 큰 문서라도 요약 가능
단점은 많은 API를 호출한다.
2
맵리듀스 방식을 이용한 PDF 문서 요약.
순서?
문서 내용 로드
문서 내용 분할
분할 내용 각각 요약 실행
각 문서의 요약본 통합 실행
최종 결과 통합 체인 생성
3
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)
결과
헤이마트는 신선한 과일과 다양한 물건을 판매하는 동네 마트로, 고품질의 제품과 다양성을 자랑합니다. 특히 신선한 과일을 매일 새로운 종류로 추천하며, 다양한 종류와 맛의 과일을 저렴한 가격에 판매합니다. 또한 생활용품, 식료품, 주방용품, 세제류, 건강식품 등 다양한 물건도 판매하며, 친절하고 경험이 풍부한 직원들이 항상 고객을 위해 최선을 다하며, 상담과 도움을 제공합니다. 또한 마트는 지역 사회와의 교류를 소중히 여기고, 지역 재료와 협력하여 신선하고 지역적인 맛을 즐길 수 있는 제품을 제공합니다.
1
위스퍼 음성 인식봇
문서 요약 봇
프롬프트를 활용해 일정 관리봇 작성해보자.
2
코드
3
4
다음
https://brunch.co.kr/@topasvga/3931