NLP/실습

LangChain RAG 실습 2(네이버 뉴스 기사 크롤링)

miimu 2025. 6. 9. 15:44

저번에 인용 도큐먼트에 날짜만 나와 url과 날짜를 같이 인용하도록 바꿔보았다.

 

from langchain_openai import OpenAIEmbeddings
from langchain_community.document_loaders import JSONLoader
from langchain_chroma import Chroma

# embedding 설정
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")

# ChromaDB Path
DB_PATH = "./drive/MyDrive/실습/RAG/db"

# Json 파일 Path
data_path = './drive/MyDrive/실습/RAG/data/'
json_paths = [data_path + json_file for json_file in os.listdir(data_path)]

# Document 로드 후 DB에 저장
for i, json_path in enumerate(json_paths) :
    loader = JSONLoader(
        file_path=json_path,
        jq_schema=".[] | .link + \" \" + .pDate + \" \" + .title + \" \" + .description",
        text_content=False
    )

    docs = loader.load()

    if i == 0 :
        db = Chroma.from_documents(
            documents=docs,
            embedding=embeddings,
            collection_name="2025_news",
            persist_directory=DB_PATH
        )

        db.get()

    else :
        db.add_documents(
            documents=docs,
            embedding=embeddings,
            collection_name="2025_news",
            persist_directory=DB_PATH
        )
        db.get()

jq_schema에 link 내용을 추가하여 url을 인용 도큐먼트로 받을 수 있도록 했다.

 

from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain.chat_models import init_chat_model

llm = init_chat_model('gpt-4o-mini', model_provider='openai')

def format_docs(docs) :
    return "\n\n".join(doc.page_content for doc in docs)

template = """
Question-Answering task Assistant 역할을 맡아주세요. retrieved context를 사용하여 질문에 답변해주세요.
만약에 답을 알지 못한다면, 모른다고 답해주세요.
최대 3문장으로 간결하게 답해주시고, 답변에 사용한 document를 인용해주세요(url과 날짜).

질문 : {question}

Context : {context}

Answer :
"""

prompt = ChatPromptTemplate.from_template(template)

rag_chain = (
    {"context" : retriever | format_docs, "question" : RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

template에 사용한 document를 인용할 때 Url과 날짜를 포함해달라고 요청하였다.

 

 

인용한 document의 url과 날짜가 답변 내용과 일치함을 알 수 있다.