728x90
반응형
[Langchain] 네이버 뉴스 요약
이번 글에서는 Python과 LangChain, Ollama 모델을 활용해 웹에서 텍스트를 스크래핑하고, 이를 요약 및 구조화하는 방법을 다룹니다. 뉴스 기사를 처리한 사례를 통해 기술적 구현 방법과 활용 가능성을 살펴보겠습니다.
1. 웹 스크래핑 도구: WebBaseLoader
WebBaseLoader는 BeautifulSoup(bs4)를 기반으로 동작하며, 특정 HTML 태그나 속성을 기반으로 데이터를 필터링합니다.
loader = WebBaseLoader(
web_paths=urls,
bs_kwargs=dict(
parse_only=bs4.SoupStrainer("article", attrs={"id": ["dic_area"]}),
),
)
- web_paths: 스크래핑할 URL 리스트를 지정합니다.
- bs_kwargs: BeautifulSoup의 SoupStrainer로 특정 HTML 요소만 필터링합니다. 여기서는 <article> 태그와 id="dic_area" 속성을 가진 콘텐츠만 추출합니다.
2. 텍스트 요약 자동화: LangChain과 Ollama 통합
LangChain과 Ollama를 활용해 스크래핑한 텍스트를 요약합니다. ChatPromptTemplate으로 요약 지침을 설정한 후, ChatOllama를 통해 결과를 생성합니다.
template = """
# Instruction
아래의 기사를 읽고, 다음 지침에 따라 요약해 주세요:
1. 전체 내용을 50단어 이내로 요약한 '제목' 필드를 작성해 주세요.
2. 핵심 내용을 간결하게 정리해서 '내용' 필드에 작성해 주세요.
...
"""
prompt = ChatPromptTemplate.from_template(template)
llama = ChatOllama(
model="benedict/linkbricks-llama3.1-korean:8b",
temparature=0,
)
chain = prompt | llama | StrOutputParser()
• 프롬프트 템플릿: 요약 형식과 규칙을 명확히 지정하여 일관된 출력 결과를 보장합니다.
• 모델 선택: 한국어에 특화된 Ollama 모델(linkbricks-llama3.1-korean:8b)을 사용했습니다.
• 출력 형태: 제목, 내용, 태그로 구성된 구조화된 요약 결과를 반환합니다.
Code
import bs4
from langchain_community.document_loaders import WebBaseLoader
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama import ChatOllama
urls = (
"https://n.news.naver.com/mnews/article/050/0000079549",
"https://n.news.naver.com/mnews/article/050/0000079544",
"https://n.news.naver.com/mnews/article/015/0005030964",
)
loader = WebBaseLoader(
web_paths=urls,
bs_kwargs=dict(
parse_only=bs4.SoupStrainer("article", attrs={"id": ["dic_area"]}),
),
)
docs = loader.load()
template = """
# Instruction
아래의 기사를 읽고, 다음 지침에 따라 요약해 주세요:
1. 전체 내용을 50단어 이내로 요약한 '제목' 필드를 작성해 주세요.
2. 핵심 내용을 간결하게 정리해서 '내용' 필드에 작성해 주세요.
3. 각 '내용'은 한 문장으로, 20단어를 넘지 않도록 해주세요.
4. 텍스트의 핵심 키워드와 관련된 단어나 개념을 10개 내외로 '태그' 필드에 추가해 주세요.
5. 전문 용어가 있다면 간단히 설명을 덧붙여 주세요.
6. 숫자나 통계가 있다면 반드시 포함시켜 주세요.
7. 요약은 객관적이고 중립적인 톤을 유지해 주세요.
반드시 아래 응답 형식을 따라 주세요:
"제목": "전체 내용 요약 (50단어 이내)",
"내용":
- "핵심 내용 1 (20단어 이내)",
- "핵심 내용 2 (20단어 이내)",
- "핵심 내용 3 (20단어 이내)",
- "핵심 내용 4 (20단어 이내)",
- ...
"태그": ["태그 1", "태그 2", "태그 3", ...]
# Article
{article}
""".strip()
prompt = ChatPromptTemplate.from_template(template)
llama = ChatOllama(
# model="llama3.1",
model="benedict/linkbricks-llama3.1-korean:8b",
temparature=0,
)
chain = prompt | llama | StrOutputParser()
for doc in docs:
for token in chain.stream({"article": doc.page_content}):
print(token, end="", flush=True)
print()
Output
제목: "은행의 1주택자 주담대 문턱 높아질 예정"
내용:
- 은행권에서 1주택자 주담대를 대상으로 제한 조치 확산 중
- 유주택자가 새로운 주택 구입 목적의 주담대를 받을 수 없음
- 신한은행이 이자만 내는 주담대 거치 기간 10일부터 없앰
태그: ["은행권", "1주택자", "주담대", "유주택자", "시중은행", "ATM", "이자", "보험업계", "제2금융권"]
제목: "외국인 대거 매도, 개인 순매수 종목 하락, 삼성전자 7.27% 추락"
내용:
- 외국인이 삼성전자 주식을 1조5749억원어치 팔아치웠다.
- 개인 투자자는 2조1490억원어치를 사들여 삼성전자를 매수했다.
- 개인 순매수 종목 상위 10개 중 수익이 난 종목은 유한양행우 1종목만 유일했다.
- 외국인이 순매수한 종목 상위 4개는 LG에너지솔루션, LG전자, 신한지주, 아모레퍼시픽으로 이익을 냈다.
태그: ["삼성전자", "외국인 투자", "개인 투자", "순매도", "순매수", "코스피", "LG에너지솔루션"]
"전기차 화재 안전관리 대책"
- "배터리 안전관리 시스템(BMS)에 통신 기능 무료 설치 및 업데이트",
- "10만대 BMS 무상 알림서비스 제공 및 10년간 운영",
- "내년부터 배터리 인증제 시행 및 11월부터 전기차 배터리 정보 공개 의무화",
- "전기차 제조사 책임보험 가입 의무화 및 충전사업자 무과실 책임보험 가입 의무화",
- " 스마트제어 충전기 보급 확대 및 연내 BMS 위험도 표준 마련".
태그: ["전기차", "배터리 안전관리", "BMS", "통신 기능 설치", "전자 차량", "화재 안전관리 대책", "스마트 제어 충전기", "무과실 책임보험"]
728x90
반응형
'IT > Langchain' 카테고리의 다른 글
[Langchain] 계엄령 기념, 집밥 같은 랭체인 코드로 계엄령 뉴스 보기 (3) | 2024.12.05 |
---|---|
[Langchain] AI vs AI 토론을 가장한 말싸움 하기 (0) | 2024.12.02 |
[Langchain] 웹 요약 Agent (1) | 2024.11.26 |
[Langchain] PDF 요약 Agent (1) | 2024.11.25 |
[Langchain] Math Agent (0) | 2024.11.25 |