Files
Source/ollama/langchain3.ipynb
T
cooney 096222c64f 랭체인 심화2
- 뉴스 크롤링 후 필요 내용 가공
- 유사 단어 추출
- 각종 문서안 필요 내용 가공
2026-06-02 18:11:05 +09:00

2470 lines
120 KiB
Plaintext

{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": [
"#### RAG 심화\n",
"- 중복 문서 문제 : 비슷한 내용의 청크가 여러개 반환되어 컨텍스트 낭비 발생\n",
"- 검색 : 시맨틱 유사도만으로는 정확한 키워드 매칭이 어려움\n",
"- 구조적 질의 불가 : '2024년 이후 계약 금액이 1억이상인 제품 찾기' 같은 메타 필터 처리 불가\n",
"- 노이즈 청크 : 관련성이 낮은 청크가 LLM 에게 전달되어 환각 유발"
],
"id": "e7f0623c946dacf1"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:38:49.652822616Z",
"start_time": "2026-06-02T00:38:40.039385151Z"
}
},
"cell_type": "code",
"source": [
"from langchain_ollama import ChatOllama\n",
"from langchain_ibm import ChatWatsonx\n",
"from langchain_core.prompts import PromptTemplate, ChatPromptTemplate, MessagesPlaceholder\n",
"from langchain_core.output_parsers import StrOutputParser, JsonOutputParser, PydanticOutputParser\n",
"from langchain_core.runnables import RunnablePassthrough, RunnableParallel, RunnableLambda\n",
"from langchain_core.messages import HumanMessage, SystemMessage, AIMessage\n",
"from langchain_core.chat_history import InMemoryChatMessageHistory, BaseChatMessageHistory\n",
"from langchain_core.runnables.history import RunnableWithMessageHistory\n",
"from pydantic import BaseModel, Field\n",
"from typing import Literal\n",
"from dotenv import load_dotenv\n",
"import os\n",
"\n",
"from langchain_community.document_loaders import PyPDFLoader, CSVLoader, WebBaseLoader, DirectoryLoader\n",
"from youtube_transcript_api import YouTubeTranscriptApi\n",
"from langchain_core.documents import Document\n",
"from langchain_text_splitters import RecursiveCharacterTextSplitter\n",
"from langchain_ollama import OllamaEmbeddings\n",
"from langchain_ibm import WatsonxEmbeddings\n",
"from langchain_chroma import Chroma\n",
"from langchain_community.vectorstores import FAISS\n",
"from langchain_openai import ChatOpenAI\n",
"\n",
"from langchain_classic.chains.query_constructor.base import AttributeInfo\n",
"\n",
"# 1. BM25Retriever를 올바른 커뮤니티 경로로 분리 (쉼표 오타 및 경로 수정)\n",
"from langchain_classic.retrievers import EnsembleRetriever, ContextualCompressionRetriever, BM25Retriever\n",
"from langchain_community.retrievers import BM25Retriever\n",
"\n",
"from langchain_classic.retrievers.self_query.chroma import ChromaTranslator\n",
"from langchain_classic.retrievers.self_query.base import SelfQueryRetriever\n",
"from langchain_community.cross_encoders import HuggingFaceCrossEncoder\n",
"from langchain_cohere import CohereRerank\n",
"from langchain_classic.retrievers.document_compressors import LLMChainExtractor, EmbeddingsFilter, DocumentCompressorPipeline"
],
"id": "266323db794d81bc",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/cooney/Source/.venv/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
" from .autonotebook import tqdm as notebook_tqdm\n",
"/tmp/ipykernel_10169/2607715662.py:14: DeprecationWarning: `langchain-community` is being sunset and is no longer actively maintained. See https://github.com/langchain-ai/langchain-community/issues/674 for details and migration guidance toward standalone integration packages.\n",
" from langchain_community.document_loaders import PyPDFLoader, CSVLoader, WebBaseLoader, DirectoryLoader\n",
"USER_AGENT environment variable not set, consider setting it to identify your requests.\n"
]
}
],
"execution_count": 1
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:38:49.667368566Z",
"start_time": "2026-06-02T00:38:49.655109157Z"
}
},
"cell_type": "code",
"source": [
"# .env 내용 가져오기\n",
"load_dotenv()\n",
"\n",
"apikey = os.getenv(\"WATSONX_API_KEY\")\n",
"project_id = os.getenv(\"WATSONX_PROJECT_ID\")\n",
"watsonx_ai_url = os.getenv(\"WATSONX_URL\")\n",
"hf_token = os.getenv(\"HF_TOKEN\")\n",
"COHERE_API_KEY = os.getenv(\"COHERE_API_KEY\")"
],
"id": "be9e3b7dfc34f47f",
"outputs": [],
"execution_count": 2
},
{
"cell_type": "code",
"id": "38308ea9",
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:38:54.969896546Z",
"start_time": "2026-06-02T00:38:49.670559612Z"
}
},
"source": [
"ollama_embedding = OllamaEmbeddings(model=\"nomic-embed-text-v2-moe\")\n",
"watson_embedding = WatsonxEmbeddings(\n",
" model_id=\"ibm/granite-embedding-278m-multilingual\",\n",
" url = f\"{watsonx_ai_url}\",\n",
" api_key = f\"{apikey}\",\n",
" project_id=f\"{project_id}\"\n",
")\n",
"\n",
"hugging_llm = ChatOpenAI(\n",
" model=\"Qwen/Qwen2.5-7B-Instruct:together\",\n",
" api_key=hf_token,\n",
" base_url=\"https://router.huggingface.co/v1\",\n",
" temperature=0\n",
")\n",
"\n",
"watson_llm = ChatWatsonx(\n",
" model_id=\"ibm/granite-4-h-small\",\n",
" url = f\"{watsonx_ai_url}\",\n",
" api_key = f\"{apikey}\",\n",
" project_id=f\"{project_id}\",\n",
" max_tokens = 2000,\n",
" params = {\n",
" \"temperature\":0\n",
" }\n",
")\n",
"\n",
"# 로컬 LLM\n",
"qwen_llm = ChatOllama(model=\"qwen3.5:4b\",temperature=0)\n",
"exaone_llm = ChatOllama(model=\"exaone3.5:2.4b\",temperature=0)\n",
"gemma_llm = ChatOllama(model=\"gemma4:e2b\")"
],
"outputs": [],
"execution_count": 3
},
{
"cell_type": "code",
"id": "f0ea314f",
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:38:55.009258425Z",
"start_time": "2026-06-02T00:38:54.994086163Z"
}
},
"source": [
"# pdf => chunks 반환 함수\n",
"def create_chunks_from_pdf(pdf_path,chunk_size=500,chunk_overlap=50):\n",
" loader = PyPDFLoader(pdf_path)\n",
" splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)\n",
" chunks = splitter.split_documents(loader.load())\n",
"\n",
" # 공백 제거\n",
" chunks = [chunk for chunk in chunks if chunk.page_content.strip()]\n",
" return chunks\n",
"\n",
"def create_vectorstore(chunks,embeddings,collection_name,persist_directory='./db/chroma_db'):\n",
" return Chroma.from_documents(\n",
" documents=chunks, \n",
" embedding=embeddings, \n",
" persist_directory=persist_directory, \n",
" collection_name=collection_name)\n",
"\n",
"\n",
"def create_retriever(vectorstore,search_type=\"similarity\",k=3,fetch_k=20,lambda_mult=0.5):\n",
" kwargs = {\"k\":k}\n",
"\n",
" if search_type==\"mmr\":\n",
" kwargs['fetch_k'] = fetch_k\n",
" kwargs['lambda_mult'] = lambda_mult \n",
"\n",
"\n",
" return vectorstore.as_retriever(search_type=search_type, search_kwargs=kwargs)\n",
"\n",
"\n",
"def print_retrieved_docs(title, retriever, query):\n",
" docs = retriever.invoke(query)\n",
"\n",
" print(\"\\n\"+\"=\"*50)\n",
" print(title)\n",
" print(\"=\"*50)\n",
"\n",
" for i, doc in enumerate(docs):\n",
" print(f\"\\n[chunk {i}]\")\n",
" print(doc.page_content)\n",
" print(f\"\\nPage: {doc.metadata.get(\"page\")}\")"
],
"outputs": [],
"execution_count": 4
},
{
"cell_type": "markdown",
"id": "d74ac88b",
"metadata": {},
"source": [
"### 1. 임베딩 모델, 청크 사이즈, 오버랩 "
]
},
{
"cell_type": "code",
"id": "9bdff4a0",
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:38:55.821089156Z",
"start_time": "2026-06-02T00:38:55.014167237Z"
}
},
"source": [
"chunks1 = create_chunks_from_pdf(\"./data/Summary of ChatGPTGPT-4 Research.pdf\",1000, 100)\n",
"chunks2 = create_chunks_from_pdf(\"./data/Summary of ChatGPTGPT-4 Research.pdf\",300, 30)\n",
"\n",
"print(f\"분할된 청크 수 : {len(chunks1)}\")\n",
"print(f\"분할된 청크 수 : {len(chunks2)}\")"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"분할된 청크 수 : 118\n",
"분할된 청크 수 : 378\n"
]
}
],
"execution_count": 5
},
{
"cell_type": "code",
"id": "09b02dbc",
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:39:06.978655069Z",
"start_time": "2026-06-02T00:38:55.837812970Z"
}
},
"source": [
"vectorestore1 = create_vectorstore(chunks1,watson_embedding,collection_name=\"gpt_research_watson3\")\n",
"vectorestore2 = create_vectorstore(chunks1,ollama_embedding,collection_name=\"gpt_research_watson4\")\n",
"\n",
"watson1_retriever = create_retriever(vectorestore1)\n",
"watson2_retriever = create_retriever(vectorestore2)\n",
"\n",
"\n",
"query = 'where can i use chatGPT?'\n",
"\n",
"print_retrieved_docs('watson embedding',watson1_retriever, query)\n",
"print_retrieved_docs('ollama embedding',watson2_retriever,query)"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"==================================================\n",
"watson embedding\n",
"==================================================\n",
"\n",
"[chunk 0]\n",
"development.\n",
"2 Related work of ChatGPT\n",
"In this section, we review the latest research related to the application, ethics,\n",
"and evaluation of ChatGPT.\n",
"2.1 Application of ChatGPT\n",
"2.1.1 Question And Answering\n",
"In the education field\n",
"ChatGPT is commonly used for question and answers testing in the edu-\n",
"cation sector. Users can use ChatGPT to learn, compare and verify answers\n",
"for different academic subjects such as physics, mathematics, and chemistry,\n",
"4\n",
"\n",
"Page: 3\n",
"\n",
"[chunk 1]\n",
"development.\n",
"2 Related work of ChatGPT\n",
"In this section, we review the latest research related to the application, ethics,\n",
"and evaluation of ChatGPT.\n",
"2.1 Application of ChatGPT\n",
"2.1.1 Question And Answering\n",
"In the education field\n",
"ChatGPT is commonly used for question and answers testing in the edu-\n",
"cation sector. Users can use ChatGPT to learn, compare and verify answers\n",
"for different academic subjects such as physics, mathematics, and chemistry,\n",
"4\n",
"\n",
"Page: 3\n",
"\n",
"[chunk 2]\n",
"of LLM for a variety of transportation tasks.\n",
"Nowadays, ChatGPT shows a wide range of applications in data visualiza-\n",
"tion, information extraction, data enhancement, quality assessment, and multi-\n",
"modal data processing.But there are also issues on how to further utilize hints\n",
"to effectively interact with ChatGPT, lack of ability to process and analyze data\n",
"18\n",
"\n",
"Page: 17\n",
"\n",
"==================================================\n",
"ollama embedding\n",
"==================================================\n",
"\n",
"[chunk 0]\n",
"development.\n",
"2 Related work of ChatGPT\n",
"In this section, we review the latest research related to the application, ethics,\n",
"and evaluation of ChatGPT.\n",
"2.1 Application of ChatGPT\n",
"2.1.1 Question And Answering\n",
"In the education field\n",
"ChatGPT is commonly used for question and answers testing in the edu-\n",
"cation sector. Users can use ChatGPT to learn, compare and verify answers\n",
"for different academic subjects such as physics, mathematics, and chemistry,\n",
"4\n",
"\n",
"Page: 3\n",
"\n",
"[chunk 1]\n",
"development.\n",
"2 Related work of ChatGPT\n",
"In this section, we review the latest research related to the application, ethics,\n",
"and evaluation of ChatGPT.\n",
"2.1 Application of ChatGPT\n",
"2.1.1 Question And Answering\n",
"In the education field\n",
"ChatGPT is commonly used for question and answers testing in the edu-\n",
"cation sector. Users can use ChatGPT to learn, compare and verify answers\n",
"for different academic subjects such as physics, mathematics, and chemistry,\n",
"4\n",
"\n",
"Page: 3\n",
"\n",
"[chunk 2]\n",
"While ChatGPT did not perform as well as commercial systems on biomedical\n",
"abstracts or Reddit comments, it may be a good speech translator. Prieto et\n",
"al. [29] evaluated the use of ChatGPT in developing an automated construction\n",
"schedule based on natural language prompts. The experiment required building\n",
"new partitions in an existing space and providing details on the rooms to be\n",
"partitioned. The results showed that ChatGPT was able to generate a coher-\n",
"ent schedule that followed a logical approach to meet the requirements of the\n",
"given scope. However, there were still several major flaws that would limit the\n",
"use of this tool in real-world projects.Michail et al. [30] proposed a method\n",
"to improve the prediction accuracy of the HeFit fine-tuned XLM T model on\n",
"tweet intimacy by generating a dataset of tweets with intimacy rating tags using\n",
"ChatGPT. The specific operation is to input tweets with intimacy rating tags\n",
"into ChatGPT and then output similar tweets.\n",
"\n",
"Page: 10\n"
]
}
],
"execution_count": 6
},
{
"cell_type": "markdown",
"id": "85b489ff",
"metadata": {},
"source": [
"### 2. MMR(Maximal Marginal Relevace) Retriever\n",
"- 관련성(Relevace)과 다양성(Diversity) 고려\n",
"- 법률 문서, 기술 매뉴얼처럼 유사 내용이 반복되는 문서에서 효과적\n",
"- 동작과정\n",
" - 질문 => 임베딩\n",
" - 벡터 스토어에서 질문과 유사한 상위 fetch_K(후보 문서) 추출\n",
" - 후보문서에서 MMR 점수 계산 => 가장 높은 문서 추출\n",
" - 남은 후보에서 MMR 점수 계산 => 높은 문서 추출\n",
" - 추출한 높은 문서에서 최종 K 반환"
]
},
{
"cell_type": "code",
"id": "f6d1c603",
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:39:10.309479368Z",
"start_time": "2026-06-02T00:39:06.998428714Z"
}
},
"source": [
"chunks1 = create_chunks_from_pdf(\"./data/2026 상 삼성전자 DX부문 직무기술서.pdf\")\n",
"vectorestore1 = create_vectorstore(chunks1,watson_embedding,collection_name=\"samsung_watson1\",persist_directory=\"./db/watson_chroma\")\n",
"\n",
"\n",
"mmr_retriever = create_retriever(vectorestore1,search_type=\"mmr\",k=5)\n",
"similarity_retriever = create_retriever(vectorestore1,k=5)\n",
"\n",
"query = '마케팅 - 제품/서비스 마케팅 포지션은?'\n",
"\n",
"print_retrieved_docs('MMR',mmr_retriever, query)\n",
"print_retrieved_docs('similarity',similarity_retriever, query)\n"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"==================================================\n",
"MMR\n",
"==================================================\n",
"\n",
"[chunk 0]\n",
"마케팅\n",
"마켓 센싱 및 정보 분석 결과를 바탕으로\n",
" 당사 제품과 서비스의 차별화 가치를 소비자에게 효과적인\n",
"커뮤니케이션 방법으로 전달하여 목표한 경영성과를 창출하고 브랜드 가치를 제고합니다\n",
"\n",
"Page: 14\n",
"\n",
"[chunk 1]\n",
"국내영업마케팅\n",
"국내의 각 분야별 영업 채널을 발굴\n",
" 지원하여 성과 창출과 지속 성장을 추구하는 동시에\n",
" 한국 시장에\n",
"대한 심도있는 분석을 통해 삼성전자\n",
" 부문 제품의 마케팅 전략을 수립 ⋅ 적용하고 글로벌\n",
"시장으로의 확산 기반을 마련합니다\n",
"\n",
"Page: 24\n",
"\n",
"[chunk 2]\n",
"해외영업\n",
"고객과 시장\n",
" 제품에 대한 이해를 바탕으로 시장 수요와 경쟁환경을 분석하여 국가\n",
" 거래선별 목표 설정\n",
"영업전략 수립\n",
" 신규 제품\n",
" 영업 채널을 발굴하고 판매전략 수립 및 실행을 통해 매출 극대화에\n",
"기여합니다\n",
"\n",
"Page: 18\n",
"\n",
"[chunk 3]\n",
"구매\n",
"제품 생산에 필요한 자원\n",
" 부품\n",
" 설비 및 제품\n",
" 을 최적의 품질과 가격으로\n",
"협상\n",
" 구매하고 시장의 수요 및 생산 계획에 맞춰 적기 공급하여 회사 경영에 기여합니다\n",
"\n",
"Page: 26\n",
"\n",
"[chunk 4]\n",
"•\n",
"•\n",
"•\n",
"•\n",
"•\n",
"•\n",
"•\n",
"•\n",
"•\n",
"•\n",
"•\n",
"\n",
"Page: 4\n",
"\n",
"==================================================\n",
"similarity\n",
"==================================================\n",
"\n",
"[chunk 0]\n",
"마케팅\n",
"마켓 센싱 및 정보 분석 결과를 바탕으로\n",
" 당사 제품과 서비스의 차별화 가치를 소비자에게 효과적인\n",
"커뮤니케이션 방법으로 전달하여 목표한 경영성과를 창출하고 브랜드 가치를 제고합니다\n",
"\n",
"Page: 14\n",
"\n",
"[chunk 1]\n",
"마케팅\n",
"마켓 센싱 및 정보 분석 결과를 바탕으로\n",
" 당사 제품과 서비스의 차별화 가치를 소비자에게 효과적인\n",
"커뮤니케이션 방법으로 전달하여 목표한 경영성과를 창출하고 브랜드 가치를 제고합니다\n",
"\n",
"Page: 14\n",
"\n",
"[chunk 2]\n",
"국내영업마케팅\n",
"국내의 각 분야별 영업 채널을 발굴\n",
" 지원하여 성과 창출과 지속 성장을 추구하는 동시에\n",
" 한국 시장에\n",
"대한 심도있는 분석을 통해 삼성전자\n",
" 부문 제품의 마케팅 전략을 수립 ⋅ 적용하고 글로벌\n",
"시장으로의 확산 기반을 마련합니다\n",
"\n",
"Page: 24\n",
"\n",
"[chunk 3]\n",
"국내영업마케팅\n",
"국내의 각 분야별 영업 채널을 발굴\n",
" 지원하여 성과 창출과 지속 성장을 추구하는 동시에\n",
" 한국 시장에\n",
"대한 심도있는 분석을 통해 삼성전자\n",
" 부문 제품의 마케팅 전략을 수립 ⋅ 적용하고 글로벌\n",
"시장으로의 확산 기반을 마련합니다\n",
"\n",
"Page: 24\n",
"\n",
"[chunk 4]\n",
"해외영업\n",
"고객과 시장\n",
" 제품에 대한 이해를 바탕으로 시장 수요와 경쟁환경을 분석하여 국가\n",
" 거래선별 목표 설정\n",
"영업전략 수립\n",
" 신규 제품\n",
" 영업 채널을 발굴하고 판매전략 수립 및 실행을 통해 매출 극대화에\n",
"기여합니다\n",
"\n",
"Page: 18\n"
]
}
],
"execution_count": 7
},
{
"cell_type": "markdown",
"id": "82d43df6",
"metadata": {},
"source": [
"### 3. SelfQuery Retriever\n",
"- 자연어 질문을 분석하여 시맨틱 검색쿼리와 메타데이터필터를 LLM이 자동으로 생성하게 하는 고급 Retriever\n",
"- 질문 : 2023년 이후 계약금액이 1억이상인 계약 찾아줘 => LLM \n",
" - 시맨틱 검색쿼리 : 계약\n",
" - filter : {year >= 2023, 계약금액 >= 100000 ~}"
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:39:10.354728792Z",
"start_time": "2026-06-02T00:39:10.323419955Z"
}
},
"cell_type": "code",
"source": "# !pip install lark",
"id": "6b910cf56efea998",
"outputs": [],
"execution_count": 8
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:39:10.379517355Z",
"start_time": "2026-06-02T00:39:10.363143821Z"
}
},
"cell_type": "code",
"source": [
"docs = [\n",
" Document(\n",
" page_content=\"삼성전자 제품 마케팅 직무입니다.\",\n",
" metadata={\n",
" \"year\":2025,\n",
" \"department\":\"marketing\"\n",
" }\n",
" ),\n",
" Document(\n",
" page_content=\"AI 연구 개발 직무입니다.\",\n",
" metadata={\n",
" \"year\":2024,\n",
" \"department\":\"ai\"\n",
" }\n",
" ),\n",
" Document(\n",
" page_content=\"백엔드 개발 직무입니다.\",\n",
" metadata={\n",
" \"year\":2025,\n",
" \"department\":\"developer\"\n",
" }\n",
" ),\n",
"]\n",
"\n",
"\n",
"metadata_field_info = [\n",
" AttributeInfo(name=\"year\", description=\"문서 작성 연도\", type=\"integer\"),\n",
" AttributeInfo(name=\"department\", description=\"직무 부서\", type=\"string\"),\n",
"]\n",
"\n",
"document_content_description = \"회사 내부 문서 및 직무 자료\"\n"
],
"id": "b3a603a71973fd7b",
"outputs": [],
"execution_count": 9
},
{
"cell_type": "code",
"id": "c0c3f024",
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:39:10.830552895Z",
"start_time": "2026-06-02T00:39:10.383461062Z"
}
},
"source": [
"vectorestore1 = create_vectorstore(docs,watson_embedding,collection_name=\"selfquery\",persist_directory=\"./db/watson_chroma\")\n",
"\n",
"self_query_retriever = SelfQueryRetriever.from_llm(\n",
" llm=watson_llm,\n",
" vectorstore=vectorestore1,\n",
" document_contents=document_content_description,\n",
" metadata_field_info=metadata_field_info,\n",
" verbose=True,\n",
" enable_limit=True,\n",
" structured_query_translator=ChromaTranslator()\n",
")"
],
"outputs": [],
"execution_count": 10
},
{
"cell_type": "code",
"id": "6eab886a",
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:39:11.872173033Z",
"start_time": "2026-06-02T00:39:10.860932404Z"
}
},
"source": [
"question = \"2024년 이후 ai 부서 직무를 찾아줘\"\n",
"self_query_retriever.invoke(question)"
],
"outputs": [
{
"data": {
"text/plain": [
"[Document(id='332a384f-1b79-4f7e-ab61-639c5a1bf1b6', metadata={'year': 2024, 'department': 'ai'}, page_content='AI 연구 개발 직무입니다.'),\n",
" Document(id='bc41054e-39de-4e78-9597-493201c869e8', metadata={'year': 2024, 'department': 'ai'}, page_content='AI 연구 개발 직무입니다.'),\n",
" Document(id='c6040e27-f3d2-4d48-9f70-7835f32c25d2', metadata={'year': 2024, 'department': 'ai'}, page_content='AI 연구 개발 직무입니다.')]"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 11
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:39:12.635032714Z",
"start_time": "2026-06-02T00:39:11.893548831Z"
}
},
"cell_type": "code",
"source": [
"docs = [\n",
" Document(\n",
" page_content=\"수분 가득한 히알루산 세럼으로 피부 속 깊은 곳까지 수분을 공급합니다.\",\n",
" metadata={\n",
" \"year\" : 2024,\n",
" \"category\" : \"스킨\",\n",
" \"user_rating\" : 4\n",
" }\n",
" ),\n",
" Document(\n",
" page_content=\"식물성 성분으로 만든 저자극 클렌징 오일 메이크업과 노폐물을 부드럽게 제거합니다.\",\n",
" metadata={\n",
" \"year\" : 2023,\n",
" \"category\" : \"클렌징\",\n",
" \"user_rating\" : 4\n",
" }\n",
" ),\n",
" Document(\n",
" page_content=\"비타민 C 함유 브라이트닝 크림, 칙칙한 피부톤을 환하게 밝혀줍니다.\",\n",
" metadata={\n",
" \"year\" : 2023,\n",
" \"category\" : \"스킨케어\",\n",
" \"user_rating\" : 2\n",
" }\n",
" ),\n",
" Document(\n",
" page_content=\"롱래스팅 립스틱, 선명한 발색과 촉촉한 사용감으로 하루종일 편안하게 사용 가능합니다.\",\n",
" metadata={\n",
" \"year\" : 2024,\n",
" \"category\" : \"메이크업\",\n",
" \"user_rating\" : 4\n",
" }\n",
" ),\n",
" Document(\n",
" page_content=\"자외선 차단 기능이 있는 톤업 선크림, SPF50+/PA+++ 높은 자외선 차단 지수로 피부를 보호합니다.\",\n",
" metadata={\n",
" \"year\" : 2025,\n",
" \"category\" : \"선케어\",\n",
" \"user_rating\" : 5\n",
" }\n",
" ),\n",
"]\n",
"\n",
"# 메타데이터빌드정보생성\n",
"metadata_field_info = [\n",
" AttributeInfo(\n",
" name=\"year\", description=\"화장품 출시연도']\", type =\"integer\"\n",
" ),\n",
" AttributeInfo(\n",
" name=\"category\", description=\"화장품 카테고리['스킨케어', '메이크업', '클렌징','선케어']\", type =\"string\"\n",
" ),\n",
" AttributeInfo(\n",
" name=\"user_rating\", description=\"화장품 평점 (1~5)\", type =\"integer\"\n",
" ),\n",
"]\n",
"\n",
"document_content_description = \"화장품 제품 정보\"\n",
"\n",
"vectorestore1 = create_vectorstore(docs,watson_embedding,collection_name=\"selfquery2\",persist_directory=\"./db/watson_chroma\")\n",
"\n",
"self_query_retriever = SelfQueryRetriever.from_llm(\n",
" llm=watson_llm,\n",
" vectorstore=vectorestore1,\n",
" document_contents=document_content_description,\n",
" metadata_field_info=metadata_field_info,\n",
" verbose=True,\n",
" enable_limit=True,\n",
" structured_query_translator=ChromaTranslator()\n",
")"
],
"id": "fb4c8d00756e3188",
"outputs": [],
"execution_count": 12
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:39:15.110354021Z",
"start_time": "2026-06-02T00:39:12.652654064Z"
}
},
"cell_type": "code",
"source": "self_query_retriever.invoke(\"2024년 이후로 평점 4 이상인 제품 추천해줘\")",
"id": "393aa0f2a8738b62",
"outputs": [
{
"data": {
"text/plain": [
"[Document(id='29b45694-d674-4b55-a219-cbec31c2acb3', metadata={'year': 2024, 'user_rating': 4, 'category': '메이크업'}, page_content='롱래스팅 립스틱, 선명한 발색과 촉촉한 사용감으로 하루종일 편안하게 사용 가능합니다.'),\n",
" Document(id='92fc368a-9463-41dd-93fb-875935baecfc', metadata={'year': 2024, 'user_rating': 4, 'category': '메이크업'}, page_content='롱래스팅 립스틱, 선명한 발색과 촉촉한 사용감으로 하루종일 편안하게 사용 가능합니다.'),\n",
" Document(id='b0cb742e-89e6-444c-a73b-297b15499edb', metadata={'user_rating': 4, 'year': 2024, 'category': '메이크업'}, page_content='롱래스팅 립스틱, 선명한 발색과 촉촉한 사용감으로 하루종일 편안하게 사용 가능합니다.'),\n",
" Document(id='03c5e2ec-4887-4f57-a401-f365e8c901b8', metadata={'year': 2024, 'user_rating': 4, 'category': '메이크업'}, page_content='롱래스팅 립스틱, 선명한 발색과 촉촉한 사용감으로 하루종일 편안하게 사용 가능합니다.')]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 13
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:39:16.109816938Z",
"start_time": "2026-06-02T00:39:15.126701645Z"
}
},
"cell_type": "code",
"source": "self_query_retriever.invoke(\"카테고리가 선케어인 상품을 추천해줘\")",
"id": "d03ad9759aef2406",
"outputs": [
{
"data": {
"text/plain": [
"[Document(id='73206df1-3067-4695-99c8-ae114a9a150f', metadata={'year': 2025, 'user_rating': 5, 'category': '선케어'}, page_content='자외선 차단 기능이 있는 톤업 선크림, SPF50+/PA+++ 높은 자외선 차단 지수로 피부를 보호합니다.'),\n",
" Document(id='68eaaa43-d8c6-4348-bc7b-b02581db5ebd', metadata={'user_rating': 5, 'category': '선케어', 'year': 2025}, page_content='자외선 차단 기능이 있는 톤업 선크림, SPF50+/PA+++ 높은 자외선 차단 지수로 피부를 보호합니다.'),\n",
" Document(id='54a8a7dd-41fa-41b0-8909-2dff86f20edf', metadata={'category': '선케어', 'year': 2025, 'user_rating': 5}, page_content='자외선 차단 기능이 있는 톤업 선크림, SPF50+/PA+++ 높은 자외선 차단 지수로 피부를 보호합니다.')]"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 14
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:39:17.402896437Z",
"start_time": "2026-06-02T00:39:16.139386682Z"
}
},
"cell_type": "code",
"source": [
"pdf_path = \"./data/2026 상 삼성전자 DX부문 직무기술서.pdf\"\n",
"chunks = create_chunks_from_pdf(pdf_path)\n",
"\n",
"for i in range(2):\n",
" print(\"=\"*50)\n",
" print(chunks[i].page_content[:500])"
],
"id": "cfbecd5680f35c4b",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"==================================================\n",
"회로개발\n",
"회로 기술을 기반으로 삼성전자 제품 및 솔루션의 혁신적인 가치를 창출합니다\n",
"==================================================\n",
"•\n",
"•\n",
"•\n",
"•\n",
"•\n",
"•\n",
"•\n",
"•\n",
"•\n",
"•\n",
"•\n",
"•\n",
"•\n",
"•\n"
]
}
],
"execution_count": 15
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:39:17.438770596Z",
"start_time": "2026-06-02T00:39:17.418100891Z"
}
},
"cell_type": "code",
"source": "# !pip install easyocr pymupdf",
"id": "b69c53f3cad97652",
"outputs": [],
"execution_count": 16
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:39:26.941862357Z",
"start_time": "2026-06-02T00:39:17.440484055Z"
}
},
"cell_type": "code",
"source": [
"# PDF 를이미지로 변환하기\n",
"import fitz\n",
"\n",
"pdf = fitz.open(pdf_path)\n",
"for page_num in range(len(pdf)):\n",
" page = pdf[page_num]\n",
" pix = page.get_pixmap(dpi=300)\n",
" pix.save(f\"page_{page_num}.png\")\n"
],
"id": "a1b6e2d07785856c",
"outputs": [],
"execution_count": 17
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:40:05.375160693Z",
"start_time": "2026-06-02T00:39:26.958881638Z"
}
},
"cell_type": "code",
"source": [
"# 이미지 => 텍스트 추출\n",
"import easyocr\n",
"\n",
"reader = easyocr.Reader(['ko', 'en'])\n",
"result = reader.readtext(\"page_19.png\", detail=0, paragraph=True)\n",
"print(\"\\n\".join(result))"
],
"id": "ebce3c155b2e0e5c",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/cuda/__init__.py:187: UserWarning: CUDA initialization: The NVIDIA driver on your system is too old (found version 12020). Please update your GPU driver by downloading and installing a new version from the URL: http://www.nvidia.com/Download/index.aspx Alternatively, go to: https://pytorch.org to install a PyTorch version that has been compiled with your version of the CUDA driver. (Triggered internally at /pytorch/c10/cuda/CUDAFunctions.cpp:119.)\n",
" return torch._C._cuda_getDeviceCount() > 0\n",
"Neither CUDA nor MPS are available - defaulting to CPU. Note: This module is much faster with a GPU.\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"DA사업부(수원 근무) 해외영업 B2C 영업\n",
"포지션 소개 Job Overview\n",
"글로벌 시장과 소비자에 대한 이해틀 바탕으로 생활가전 제품의 판매 전락올 수립하고 매출 확대와 브랜드 리더십올 제고합니다.\n",
"수행업무 Job Details\n",
"담당 지역의 시장과 고객 특성, 판매 데이터들 분석하여 매출과 손의 극대화틀 위한 제품 가격유통 마켓팅올 아우르는 장단기 판매 전락올 수립합니다. 수립든 판매 전락올 기반으로 담당 법인과 현업하여 적기 공급올 위한 오퍼레이선올 지원하고 현지 법인의 실행 계획과 진척올 관리 및 개선합니다.\n",
"자격요건 Requirements\n",
"영어로 해외 자료 조사 및 커류니키이선이 가능하신 분 Global 이문화에 대한 이해도가 높으신 분 팀위크와 협업 능력올 보유하신 분\n",
"우대사항 Preferences\n",
"직무와 연관된 대내외 활동 경험올 보유하신 분 제2외국어 회화 역량울 보유하신 분\n",
"커리어 비전 Career Vision\n",
"담당 지역의 언어와 문화 습득올 포함한 글로벌 역량울 강화할 수 있으려 고객시장 유통 특성 등 전문 지식 습득과 법인 관리 및 개선올 통한 영업 실무 경험올 쌍울 수 있습니다. 삼성전자 해외영업 주재원으로서 현지 법인에서 근무하여, 매출 확대와 브랜드 리더십올 공고히 하는 현장 경험올 익히려 글로벌 영업 전문가로 성장할 수 있습니다:\n",
"'글로벌올 무대로 DA의 새로운 가능성울 열어갈 당신에게\"\n",
"시장과 소비자에 대한 이해틀 바탕으로\n",
"생활가전 브랜드틀 최고의 자리로 이끌어 칼 인재틀 모십니다.\n"
]
}
],
"execution_count": 18
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:49:24.188537816Z",
"start_time": "2026-06-02T00:40:05.530931311Z"
}
},
"cell_type": "code",
"source": [
"import json\n",
"pages =[]\n",
"\n",
"for page_num in range(31):\n",
" image_path = image_path = f\"page_{page_num}.png\"\n",
" result = reader.readtext(image_path, detail=0, paragraph=True)\n",
" text = \"\\n\".join(result)\n",
" pages.append({\"page\":page_num + 1, \"content\":text})\n",
"\n",
"with open(\"./data/samsung_dx_ocr.json\", \"w\", encoding=\"utf-8\") as f:\n",
" json.dump(pages, f, ensure_ascii=False, indent=2)"
],
"id": "27d16657006fed92",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n"
]
}
],
"execution_count": 19
},
{
"metadata": {},
"cell_type": "markdown",
"source": [
"### BM25\n",
"\n",
"- 유사도 검색은 의미적 유사성 위주(정확한 제품명, 코드, 버전, 고유명사 등의 키워드 매칭에는 약함)\n",
"- 유사도 검색의 단점 보완 (semantic + sparse)\n",
"- 예\n",
" - 환불 가능한 기간이 어떻게 되나요? 유사도 검색 유리\n",
" - ERR_CONNECTION 오류 => 키워드 검색"
],
"id": "afa6a2718ad4156f"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:49:24.236000469Z",
"start_time": "2026-06-02T00:49:24.204889072Z"
}
},
"cell_type": "code",
"source": "# !pip install rank-bm25",
"id": "f183e2922317e17e",
"outputs": [],
"execution_count": 20
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:49:24.265639045Z",
"start_time": "2026-06-02T00:49:24.238260865Z"
}
},
"cell_type": "code",
"source": [
"with open(\"./data/samsung_dx_ocr.json\", \"r\", encoding=\"utf-8\") as f:\n",
" pages = json.load(f)\n",
"\n",
"docs = []\n",
"for page in pages:\n",
" docs.append(\n",
" Document(\n",
" page_content=page[\"content\"],\n",
" metadata={\"page\":page['page'],\n",
" \"source\": \"samsung_dx_ocr\"\n",
" }\n",
" )\n",
" )\n"
],
"id": "31092e4f4e4e36a4",
"outputs": [],
"execution_count": 21
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:49:27.025679698Z",
"start_time": "2026-06-02T00:49:24.268751872Z"
}
},
"cell_type": "code",
"source": [
"# len(docs)\n",
"\n",
"splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)\n",
"chunks = splitter.split_documents(docs)\n",
"\n",
"vectorstore = create_vectorstore(\n",
" chunks=chunks, embeddings=watson_embedding, persist_directory=\"./db/chroma_db\", collection_name=\"samsung_dx\")"
],
"id": "c43289aff540dd23",
"outputs": [],
"execution_count": 22
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:49:27.475999389Z",
"start_time": "2026-06-02T00:49:27.039390529Z"
}
},
"cell_type": "code",
"source": [
"# vectorstore.similarity_search(\"\", k=3)\n",
"\n",
"# 유사도 검색\n",
"dense_retriever = create_retriever(vectorstore)\n",
"# 키워드 검색(법령, 제품명...)\n",
"bm25_retriever = BM25Retriever.from_documents(chunks)\n",
"bm25_retriever.k = 4\n",
"\n",
"# weights : 검색전략 0.4:0.6 dense:bm25\n",
"hybrid_retriever = EnsembleRetriever(retrievers=[dense_retriever, bm25_retriever], weights=[0.5, 0.5])\n",
"\n",
"query = \"시스템 소프트웨어 자격요건에 운영체제 개념도 포함되어 있어?\"\n",
"# search_docs = hybrid_retriever(query)\n",
"\n",
"print_retrieved_docs(\"hybrid\", hybrid_retriever, query)"
],
"id": "aa0cdd84b0afba4",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"==================================================\n",
"hybrid\n",
"==================================================\n",
"\n",
"[chunk 0]\n",
"자격요건 Requirements\n",
"컴퓨터 전기 전자, 기계 로봇공학 등 관련 전공올 하신 분 운영체제 기본 개념에 대한 이해도틀 보유하신 분 요구사항울 분석하여 소프트웨어들 구조적으로 설계 및 구현하는 역량울 보유하신 분 다양한 분야의 엔지니어와 적극적으로 소통하여 협업할 수 짓는 역량울 보유하신 분\n",
"우대사항 Preferences\n",
"CIC++ 기반 시스템 프로그래망 역량울 보유하신 분 Linux 기반 임베디드 시스템 개발 경험올 보유하신 분(Kernel, Device Driver, BSP 등) CAN EtherCAT, UDP 등 하드웨어 통신 프로토록 활용 경험 보유하신 분 ROS2 기반 로보텍스 프로적트 수행 경험올 보유하신 분 Git 기반 협업 및 CICD 환경에서의 개발 경험올 보유하신 분\n",
"커리어 비전 Career Vision\n",
"\n",
"Page: 7\n",
"\n",
"[chunk 1]\n",
"미래로봇추진단(서울 근무) S/W개발 시스템 소프트웨어\n",
"포지션 소개 Job Overview\n",
"휴머노이드 로봇의 실시간 제어 시스템 및 소프트웨어 플렉품올 개발하는 직무입니다: 운영체제 환경 구성, 디바이스 드라이버, 실시간 제어 프레임위크 등 로봇 동작의 핵심 기반이 되는 소프트웨어름 설계 및 개발하다, 하드웨어 설계 조직 및 Al 연구 조직과 긴밀히 현업합니다:\n",
"수행업무 Job Details\n",
"휴머노이드 로봇의 실시간 제어 프레임위크 설계하고 개발합니다: 모터; 센서 등 로봇 하드웨어 제어름 위한 디바이스 드라이버 및 하드웨어 추상화 계층올 개발합니다. 로봇 제어용 운영체제(Linux 기반 실시간 OS 등) 환경올 구성하고 시스템 성능올 최적화합니다: 유관 부서와 협업하여 보행 조작 등 Al 기능과 제어 시스템 간 연동 미들웨어름 개발합니다:\n",
"자격요건 Requirements\n",
"\n",
"Page: 7\n",
"\n",
"[chunk 2]\n",
"커리어 비전 Career Vision\n",
"휴머노이드 로봇의 초기 개발 단계부터 참여하여 핵심 개발자로 성장할 수 있습니다: 실시간 제어; 시스템 아키택처 , 로봇 미들웨어 등 다양한 경험올 통해 로보텍스 시스템 SW 전문가, 나아가 시스템 아키넥트로의 커리어 확장이 가능합니다.\n",
"66 휴머노이드의 미래틀 함께 설계할 분올 찾습니다\"\n",
"로봇이 안정적으로 동작하기 위한 소프트웨어 기반을 함께 만들어갈 도전적인 기술 과제틀 즐기는 분의 지원올 환영합니다:\n",
"\n",
"Page: 7\n",
"\n",
"[chunk 3]\n",
"삼성전자 DX부문 2026년 상반기 3급 신입사원 채용 공고\n",
"직무\n",
"포지선\n",
"모집 사업부\n",
"근무지\n",
"모집 전공\n",
"회로설계\n",
"MX사업부\n",
"수원\n",
"회로개발\n",
"회로설계\n",
"미래로봇추진단\n",
"서울\n",
"전기전자 등 관련 전공\n",
"시스템 개발\n",
"네트위크사업부\n",
"수원\n",
"시스템 소프트웨어\n",
"미래로봇추진단\n",
"서울\n",
"인공지능\n",
"MX사업부\n",
"수원\n",
"인공지능\n",
"Samsung Research\n",
"서울\n",
"전산 컴퓨터 전기전자, 산공 기계 통계(이공) , 수학, 물리 등 관련 전공\n",
"S/W개발\n",
"미들웨어 개발\n",
"네트위크사업부\n",
"수원\n",
"서버 소프트웨어\n",
"네트위크사업부\n",
"수원\n",
"애플리켜이선 개발\n",
"네트위크사업부\n",
"수원\n",
"전산/컴퓨터 전기전자 기계, 화학 화공 재료금속 산공 통계(이공) 등 관련 전공\n",
"품질| 서비스\n",
"품질\n",
"Global CS센터\n",
"수원\n",
"영상디스플레이사업부 DA사업부 MX사업부\n",
"마켓팅\n",
"제품서비스 마켓팅\n",
"수원\n",
"B2C 영업\n",
"DA사업부 MX사업부\n",
"수원\n",
"해외영업\n",
"B2B 영업\n",
"영상디스플레이사업부 DA사업부 네트위크사업부\n",
"수원\n",
"전공 무관\n",
"국내영업마켓팅\n",
"국내영업마켓팅\n",
"한국총관\n",
"전국\n",
"구매\n",
"\n",
"Page: 1\n"
]
}
],
"execution_count": 23
},
{
"metadata": {},
"cell_type": "markdown",
"source": [
"### ReRanking & Contextual Compression\n",
"- 유사도 검색(Bi-Encoder) : 쿼리(질문)와 문서를 각각 벡터로 변환 후 계산\n",
"- Cross-Encoder : 쿼리 + 문서 쌍으로 벡터로 변환\n",
" - 정확도가 매우 높으나, 매우 느림"
],
"id": "5193731c62868f02"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:49:27.485106716Z",
"start_time": "2026-06-02T00:49:27.477613705Z"
}
},
"cell_type": "code",
"source": "# !pip install cohere langchain-cohere sentence-transformers",
"id": "5b6a77f06c3e8d",
"outputs": [],
"execution_count": 24
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:49:31.034751822Z",
"start_time": "2026-06-02T00:49:27.485893002Z"
}
},
"cell_type": "code",
"source": [
"# 기본검색(유사도 검색)\n",
"base_retriever = (create_retriever(vectorstore, k=20))\n",
"query = \"원격근무 정책은 어떻게 되나요?\"\n",
"docs = base_retriever.invoke(query)\n",
"\n",
"# 20개 후보군을 대상으로 reranking\n",
"reranker = CohereRerank(model = \"rerank-v4.0-pro\", top_n=5)\n",
"\n",
"compression_retriever = ContextualCompressionRetriever(base_compressor=reranker, base_retriever=base_retriever)\n",
"\n",
"# 최종\n",
"# docs = compression_retriever.invoke(query)\n",
"\n",
"print_retrieved_docs(\"Rerank\", compression_retriever, query)"
],
"id": "cd205195800d51e2",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"==================================================\n",
"Rerank\n",
"==================================================\n",
"\n",
"[chunk 0]\n",
"네트위크사업부(수원 근무) 구매\n",
"포지션 소개 Job Overview\n",
"글로벌 SCM 데이터지 기반으로 구매 프로세스트 학신하고 최적의 파트너십올 통해 사업의 이익과 경쟁력올 극대화합니다.\n",
"수행업무 Job Details\n",
"부품별 구매 Lead Time올 효율적으로 관리해 제품의 적시 생산과 공급올 지원하고 원자재 적정 재고 운영으로 사업부 실적올 극대화합니다 부품의 핵심 원자재와 생산 공정올 분석하여 공급 Lead Time 및 가용량울 최적화합니다. 제품의 생산/판매 계획 및 중장기 물동 변화에 긴밀하게 대응하다, 이와 연계하여 부품 Forecast틀 관리합니다:\n",
"자격요건 Requirements\n",
"해외 협력사와의 소통올 위한 글로벌 커류니키이선 능력올 보유하신 분(영어 및 제2외국어) 최신 네트위크 기술 동향 파악, 비즈니스 현상 전락 공급망 관리(SCM)에 대한 높은 이해도와 관심올 보유하신 분 내부 팀위크 및 협력사 간 원활한 현업으로 목표름 달성하는 협력적 태도와 실행력올 보유하신 분\n",
"\n",
"Page: 28\n",
"\n",
"[chunk 1]\n",
"네트위크사업부(수원 근무) 구매\n",
"포지션 소개 Job Overview\n",
"글로벌 SCM 데이터지 기반으로 구매 프로세스트 학신하고 최적의 파트너십올 통해 사업의 이익과 경쟁력올 극대화합니다.\n",
"수행업무 Job Details\n",
"부품별 구매 Lead Time올 효율적으로 관리해 제품의 적시 생산과 공급올 지원하고 원자재 적정 재고 운영으로 사업부 실적올 극대화합니다 부품의 핵심 원자재와 생산 공정올 분석하여 공급 Lead Time 및 가용량울 최적화합니다. 제품의 생산/판매 계획 및 중장기 물동 변화에 긴밀하게 대응하다, 이와 연계하여 부품 Forecast틀 관리합니다:\n",
"자격요건 Requirements\n",
"해외 협력사와의 소통올 위한 글로벌 커류니키이선 능력올 보유하신 분(영어 및 제2외국어) 최신 네트위크 기술 동향 파악, 비즈니스 현상 전락 공급망 관리(SCM)에 대한 높은 이해도와 관심올 보유하신 분 내부 팀위크 및 협력사 간 원활한 현업으로 목표름 달성하는 협력적 태도와 실행력올 보유하신 분\n",
"\n",
"Page: 28\n",
"\n",
"[chunk 2]\n",
"네트위크사업부(수원 근무) 구매\n",
"포지션 소개 Job Overview\n",
"글로벌 SCM 데이터지 기반으로 구매 프로세스트 학신하고 최적의 파트너십올 통해 사업의 이익과 경쟁력올 극대화합니다.\n",
"수행업무 Job Details\n",
"부품별 구매 Lead Time올 효율적으로 관리해 제품의 적시 생산과 공급올 지원하고 원자재 적정 재고 운영으로 사업부 실적올 극대화합니다 부품의 핵심 원자재와 생산 공정올 분석하여 공급 Lead Time 및 가용량울 최적화합니다. 제품의 생산/판매 계획 및 중장기 물동 변화에 긴밀하게 대응하다, 이와 연계하여 부품 Forecast틀 관리합니다:\n",
"자격요건 Requirements\n",
"해외 협력사와의 소통올 위한 글로벌 커류니키이선 능력올 보유하신 분(영어 및 제2외국어) 최신 네트위크 기술 동향 파악, 비즈니스 현상 전락 공급망 관리(SCM)에 대한 높은 이해도와 관심올 보유하신 분 내부 팀위크 및 협력사 간 원활한 현업으로 목표름 달성하는 협력적 태도와 실행력올 보유하신 분\n",
"\n",
"Page: 28\n",
"\n",
"[chunk 3]\n",
"우대사항 Preferences\n",
"설비 직무 관련 국가기술자격올 보유하신 분(기사 이상) 직무 관련 대내외 경험흘 보유하신 분(프로적트 논문 특히, 경진대회 등) 해외법인과 커유니키이선이 가능한 수준의 외국어(영어, 중국어) 회화 역량울 보유하신 분\n",
"커리어 비전 Career Vision\n",
"인프라 분야의 전문역량울 통한 사고 예방 및 잠재 리스크트 개선하는 환경안전 전문가로 성장합니다.\n",
"66 '인프라틀 지팅하다\"\n",
"안정적인 시스템 운영으로 조직의 기반을 함께 만들어칼 인재틀 찾고 있습니다. 책임감과 실행력올 갖춘 인프라 운영 인재틀 기다럽니다!\n",
"\n",
"Page: 31\n",
"\n",
"[chunk 4]\n",
"우대사항 Preferences\n",
"설비 직무 관련 국가기술자격올 보유하신 분(기사 이상) 직무 관련 대내외 경험흘 보유하신 분(프로적트 논문 특히, 경진대회 등) 해외법인과 커유니키이선이 가능한 수준의 외국어(영어, 중국어) 회화 역량울 보유하신 분\n",
"커리어 비전 Career Vision\n",
"인프라 분야의 전문역량울 통한 사고 예방 및 잠재 리스크트 개선하는 환경안전 전문가로 성장합니다.\n",
"66 '인프라틀 지팅하다\"\n",
"안정적인 시스템 운영으로 조직의 기반을 함께 만들어칼 인재틀 찾고 있습니다. 책임감과 실행력올 갖춘 인프라 운영 인재틀 기다럽니다!\n",
"\n",
"Page: 31\n"
]
}
],
"execution_count": 25
},
{
"metadata": {},
"cell_type": "markdown",
"source": [
"### LLMChainExtractor\n",
"- 질문 + 문서를같이LLM에게 보내서 질문과 관련된 내용만추출\n",
"- 현재 chunks 안에있는 내용을줄여내는 것"
],
"id": "df31e5ec44fc385d"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:49:47.805214037Z",
"start_time": "2026-06-02T00:49:31.058423510Z"
}
},
"cell_type": "code",
"source": [
"# 문서로드 / 청크추출\n",
"chunks = create_chunks_from_pdf(\"./data/제주관광가이드.pdf\")\n",
"# 인덱싱 - vectorstore\n",
"vectorstore = create_vectorstore(chunks, watson_embedding, collection_name=\"jeju_guid\")\n",
"# 질의\n",
"base_retriever = create_retriever(vectorstore=vectorstore, k=20)\n",
"\n",
"docs = base_retriever.invoke(\"생활 속 제주어에서 엄불랑하다는 무슨 뜻이야?\")\n",
"for doc in docs:\n",
" print(doc.page_content[:500])\n",
" print(\"-\"*10)"
],
"id": "708a2178c4c97bfe",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"생활 속 제주어\n",
"제주는 타 지역보다 한국어의 고형(古形)을 많이 유지하고 있는 동시에 \n",
"제주도만의 고유한 어휘나 문법적 특성을 가지고 있다.\n",
"다른 지역 사람이 못 알아듣는 제주어\n",
"제주어 뜻풀이\n",
"솔쩨기 살짝\n",
"안네다 드리다\n",
"베지근허다 입안에 기름기가 감돌아 맛이 있다.\n",
"엄불랑허다 어마어마하다\n",
"코시롱허다 고소하다\n",
"산도록허다 시원하다 예) 물이 산도록헌 게 좋다.\n",
"두령청이 우두망찰\n",
"무사 왜\n",
"영, 경, 정 이렇게, 그렇게, 저렇게\n",
"게메 글쎄\n",
"인사말\n",
"제주어 뜻풀이\n",
"펜안허우꽈? 편안(안녕)하십니까?\n",
"제주도 오난 어떵허우꽈? 제주도에 오니 어떠십니까?\n",
"차말로 좋수다. 참말로 좋습니다.\n",
"공기도 마고, 산이영 바다잉여 마딱 좋은게마씀 공기도 맑고, 산이랑 바다랑 모두 좋네요.\n",
"서울 갈 때랑 하영 다앙 갑서. 서울 갈 때는 많이 담아서 가십시오.\n",
"게메양. 경 헤시민 얼마나 좋코마씀? 글쎄요. 그렇게 했으면 얼마나 좋겠습니까?\n",
"식당에서\n",
"제주어 뜻풀이\n",
"무신걸 먹으코? 무엇을 먹을까?\n",
"----------\n",
"생활 속 제주어\n",
"제주는 타 지역보다 한국어의 고형(古形)을 많이 유지하고 있는 동시에 \n",
"제주도만의 고유한 어휘나 문법적 특성을 가지고 있다.\n",
"다른 지역 사람이 못 알아듣는 제주어\n",
"제주어 뜻풀이\n",
"솔쩨기 살짝\n",
"안네다 드리다\n",
"베지근허다 입안에 기름기가 감돌아 맛이 있다.\n",
"엄불랑허다 어마어마하다\n",
"코시롱허다 고소하다\n",
"산도록허다 시원하다 예) 물이 산도록헌 게 좋다.\n",
"두령청이 우두망찰\n",
"무사 왜\n",
"영, 경, 정 이렇게, 그렇게, 저렇게\n",
"게메 글쎄\n",
"인사말\n",
"제주어 뜻풀이\n",
"펜안허우꽈? 편안(안녕)하십니까?\n",
"제주도 오난 어떵허우꽈? 제주도에 오니 어떠십니까?\n",
"차말로 좋수다. 참말로 좋습니다.\n",
"공기도 마고, 산이영 바다잉여 마딱 좋은게마씀 공기도 맑고, 산이랑 바다랑 모두 좋네요.\n",
"서울 갈 때랑 하영 다앙 갑서. 서울 갈 때는 많이 담아서 가십시오.\n",
"게메양. 경 헤시민 얼마나 좋코마씀? 글쎄요. 그렇게 했으면 얼마나 좋겠습니까?\n",
"식당에서\n",
"제주어 뜻풀이\n",
"무신걸 먹으코? 무엇을 먹을까?\n",
"----------\n",
"생활 속 제주어\n",
"제주는 타 지역보다 한국어의 고형(古形)을 많이 유지하고 있는 동시에 \n",
"제주도만의 고유한 어휘나 문법적 특성을 가지고 있다.\n",
"다른 지역 사람이 못 알아듣는 제주어\n",
"제주어 뜻풀이\n",
"솔쩨기 살짝\n",
"안네다 드리다\n",
"베지근허다 입안에 기름기가 감돌아 맛이 있다.\n",
"엄불랑허다 어마어마하다\n",
"코시롱허다 고소하다\n",
"산도록허다 시원하다 예) 물이 산도록헌 게 좋다.\n",
"두령청이 우두망찰\n",
"무사 왜\n",
"영, 경, 정 이렇게, 그렇게, 저렇게\n",
"게메 글쎄\n",
"인사말\n",
"제주어 뜻풀이\n",
"펜안허우꽈? 편안(안녕)하십니까?\n",
"제주도 오난 어떵허우꽈? 제주도에 오니 어떠십니까?\n",
"차말로 좋수다. 참말로 좋습니다.\n",
"공기도 마고, 산이영 바다잉여 마딱 좋은게마씀 공기도 맑고, 산이랑 바다랑 모두 좋네요.\n",
"서울 갈 때랑 하영 다앙 갑서. 서울 갈 때는 많이 담아서 가십시오.\n",
"게메양. 경 헤시민 얼마나 좋코마씀? 글쎄요. 그렇게 했으면 얼마나 좋겠습니까?\n",
"식당에서\n",
"제주어 뜻풀이\n",
"무신걸 먹으코? 무엇을 먹을까?\n",
"----------\n",
"생활 속 제주어\n",
"제주는 타 지역보다 한국어의 고형(古形)을 많이 유지하고 있는 동시에 \n",
"제주도만의 고유한 어휘나 문법적 특성을 가지고 있다.\n",
"다른 지역 사람이 못 알아듣는 제주어\n",
"제주어 뜻풀이\n",
"솔쩨기 살짝\n",
"안네다 드리다\n",
"베지근허다 입안에 기름기가 감돌아 맛이 있다.\n",
"엄불랑허다 어마어마하다\n",
"코시롱허다 고소하다\n",
"산도록허다 시원하다 예) 물이 산도록헌 게 좋다.\n",
"두령청이 우두망찰\n",
"무사 왜\n",
"영, 경, 정 이렇게, 그렇게, 저렇게\n",
"게메 글쎄\n",
"인사말\n",
"제주어 뜻풀이\n",
"펜안허우꽈? 편안(안녕)하십니까?\n",
"제주도 오난 어떵허우꽈? 제주도에 오니 어떠십니까?\n",
"차말로 좋수다. 참말로 좋습니다.\n",
"공기도 마고, 산이영 바다잉여 마딱 좋은게마씀 공기도 맑고, 산이랑 바다랑 모두 좋네요.\n",
"서울 갈 때랑 하영 다앙 갑서. 서울 갈 때는 많이 담아서 가십시오.\n",
"게메양. 경 헤시민 얼마나 좋코마씀? 글쎄요. 그렇게 했으면 얼마나 좋겠습니까?\n",
"식당에서\n",
"제주어 뜻풀이\n",
"무신걸 먹으코? 무엇을 먹을까?\n",
"----------\n",
"생활 속 제주어\n",
"제주는 타 지역보다 한국어의 고형(古形)을 많이 유지하고 있는 동시에 \n",
"제주도만의 고유한 어휘나 문법적 특성을 가지고 있다.\n",
"다른 지역 사람이 못 알아듣는 제주어\n",
"제주어 뜻풀이\n",
"솔쩨기 살짝\n",
"안네다 드리다\n",
"베지근허다 입안에 기름기가 감돌아 맛이 있다.\n",
"엄불랑허다 어마어마하다\n",
"코시롱허다 고소하다\n",
"산도록허다 시원하다 예) 물이 산도록헌 게 좋다.\n",
"두령청이 우두망찰\n",
"무사 왜\n",
"영, 경, 정 이렇게, 그렇게, 저렇게\n",
"게메 글쎄\n",
"인사말\n",
"제주어 뜻풀이\n",
"펜안허우꽈? 편안(안녕)하십니까?\n",
"제주도 오난 어떵허우꽈? 제주도에 오니 어떠십니까?\n",
"차말로 좋수다. 참말로 좋습니다.\n",
"공기도 마고, 산이영 바다잉여 마딱 좋은게마씀 공기도 맑고, 산이랑 바다랑 모두 좋네요.\n",
"서울 갈 때랑 하영 다앙 갑서. 서울 갈 때는 많이 담아서 가십시오.\n",
"게메양. 경 헤시민 얼마나 좋코마씀? 글쎄요. 그렇게 했으면 얼마나 좋겠습니까?\n",
"식당에서\n",
"제주어 뜻풀이\n",
"무신걸 먹으코? 무엇을 먹을까?\n",
"----------\n",
"생활 속 제주어\n",
"제주는 타 지역보다 한국어의 고형(古形)을 많이 유지하고 있는 동시에 \n",
"제주도만의 고유한 어휘나 문법적 특성을 가지고 있다.\n",
"다른 지역 사람이 못 알아듣는 제주어\n",
"제주어 뜻풀이\n",
"솔쩨기 살짝\n",
"안네다 드리다\n",
"베지근허다 입안에 기름기가 감돌아 맛이 있다.\n",
"엄불랑허다 어마어마하다\n",
"코시롱허다 고소하다\n",
"산도록허다 시원하다 예) 물이 산도록헌 게 좋다.\n",
"두령청이 우두망찰\n",
"무사 왜\n",
"영, 경, 정 이렇게, 그렇게, 저렇게\n",
"게메 글쎄\n",
"인사말\n",
"제주어 뜻풀이\n",
"펜안허우꽈? 편안(안녕)하십니까?\n",
"제주도 오난 어떵허우꽈? 제주도에 오니 어떠십니까?\n",
"차말로 좋수다. 참말로 좋습니다.\n",
"공기도 마고, 산이영 바다잉여 마딱 좋은게마씀 공기도 맑고, 산이랑 바다랑 모두 좋네요.\n",
"서울 갈 때랑 하영 다앙 갑서. 서울 갈 때는 많이 담아서 가십시오.\n",
"게메양. 경 헤시민 얼마나 좋코마씀? 글쎄요. 그렇게 했으면 얼마나 좋겠습니까?\n",
"식당에서\n",
"제주어 뜻풀이\n",
"무신걸 먹으코? 무엇을 먹을까?\n",
"----------\n",
"생활 속 제주어\n",
"제주는 타 지역보다 한국어의 고형(古形)을 많이 유지하고 있는 동시에 \n",
"제주도만의 고유한 어휘나 문법적 특성을 가지고 있다.\n",
"다른 지역 사람이 못 알아듣는 제주어\n",
"제주어 뜻풀이\n",
"솔쩨기 살짝\n",
"안네다 드리다\n",
"베지근허다 입안에 기름기가 감돌아 맛이 있다.\n",
"엄불랑허다 어마어마하다\n",
"코시롱허다 고소하다\n",
"산도록허다 시원하다 예) 물이 산도록헌 게 좋다.\n",
"두령청이 우두망찰\n",
"무사 왜\n",
"영, 경, 정 이렇게, 그렇게, 저렇게\n",
"게메 글쎄\n",
"인사말\n",
"제주어 뜻풀이\n",
"펜안허우꽈? 편안(안녕)하십니까?\n",
"제주도 오난 어떵허우꽈? 제주도에 오니 어떠십니까?\n",
"차말로 좋수다. 참말로 좋습니다.\n",
"공기도 마고, 산이영 바다잉여 마딱 좋은게마씀 공기도 맑고, 산이랑 바다랑 모두 좋네요.\n",
"서울 갈 때랑 하영 다앙 갑서. 서울 갈 때는 많이 담아서 가십시오.\n",
"게메양. 경 헤시민 얼마나 좋코마씀? 글쎄요. 그렇게 했으면 얼마나 좋겠습니까?\n",
"식당에서\n",
"제주어 뜻풀이\n",
"무신걸 먹으코? 무엇을 먹을까?\n",
"----------\n",
"생활 속 제주어\n",
"제주는 타 지역보다 한국어의 고형(古形)을 많이 유지하고 있는 동시에 \n",
"제주도만의 고유한 어휘나 문법적 특성을 가지고 있다.\n",
"다른 지역 사람이 못 알아듣는 제주어\n",
"제주어 뜻풀이\n",
"솔쩨기 살짝\n",
"안네다 드리다\n",
"베지근허다 입안에 기름기가 감돌아 맛이 있다.\n",
"엄불랑허다 어마어마하다\n",
"코시롱허다 고소하다\n",
"산도록허다 시원하다 예) 물이 산도록헌 게 좋다.\n",
"두령청이 우두망찰\n",
"무사 왜\n",
"영, 경, 정 이렇게, 그렇게, 저렇게\n",
"게메 글쎄\n",
"인사말\n",
"제주어 뜻풀이\n",
"펜안허우꽈? 편안(안녕)하십니까?\n",
"제주도 오난 어떵허우꽈? 제주도에 오니 어떠십니까?\n",
"차말로 좋수다. 참말로 좋습니다.\n",
"공기도 마고, 산이영 바다잉여 마딱 좋은게마씀 공기도 맑고, 산이랑 바다랑 모두 좋네요.\n",
"서울 갈 때랑 하영 다앙 갑서. 서울 갈 때는 많이 담아서 가십시오.\n",
"게메양. 경 헤시민 얼마나 좋코마씀? 글쎄요. 그렇게 했으면 얼마나 좋겠습니까?\n",
"식당에서\n",
"제주어 뜻풀이\n",
"무신걸 먹으코? 무엇을 먹을까?\n",
"----------\n",
"생활 속 제주어\n",
"제주는 타 지역보다 한국어의 고형(古形)을 많이 유지하고 있는 동시에 \n",
"제주도만의 고유한 어휘나 문법적 특성을 가지고 있다.\n",
"다른 지역 사람이 못 알아듣는 제주어\n",
"제주어 뜻풀이\n",
"솔쩨기 살짝\n",
"안네다 드리다\n",
"베지근허다 입안에 기름기가 감돌아 맛이 있다.\n",
"엄불랑허다 어마어마하다\n",
"코시롱허다 고소하다\n",
"산도록허다 시원하다 예) 물이 산도록헌 게 좋다.\n",
"두령청이 우두망찰\n",
"무사 왜\n",
"영, 경, 정 이렇게, 그렇게, 저렇게\n",
"게메 글쎄\n",
"인사말\n",
"제주어 뜻풀이\n",
"펜안허우꽈? 편안(안녕)하십니까?\n",
"제주도 오난 어떵허우꽈? 제주도에 오니 어떠십니까?\n",
"차말로 좋수다. 참말로 좋습니다.\n",
"공기도 마고, 산이영 바다잉여 마딱 좋은게마씀 공기도 맑고, 산이랑 바다랑 모두 좋네요.\n",
"서울 갈 때랑 하영 다앙 갑서. 서울 갈 때는 많이 담아서 가십시오.\n",
"게메양. 경 헤시민 얼마나 좋코마씀? 글쎄요. 그렇게 했으면 얼마나 좋겠습니까?\n",
"식당에서\n",
"제주어 뜻풀이\n",
"무신걸 먹으코? 무엇을 먹을까?\n",
"----------\n",
"생활 속 제주어\n",
"제주는 타 지역보다 한국어의 고형(古形)을 많이 유지하고 있는 동시에 \n",
"제주도만의 고유한 어휘나 문법적 특성을 가지고 있다.\n",
"다른 지역 사람이 못 알아듣는 제주어\n",
"제주어 뜻풀이\n",
"솔쩨기 살짝\n",
"안네다 드리다\n",
"베지근허다 입안에 기름기가 감돌아 맛이 있다.\n",
"엄불랑허다 어마어마하다\n",
"코시롱허다 고소하다\n",
"산도록허다 시원하다 예) 물이 산도록헌 게 좋다.\n",
"두령청이 우두망찰\n",
"무사 왜\n",
"영, 경, 정 이렇게, 그렇게, 저렇게\n",
"게메 글쎄\n",
"인사말\n",
"제주어 뜻풀이\n",
"펜안허우꽈? 편안(안녕)하십니까?\n",
"제주도 오난 어떵허우꽈? 제주도에 오니 어떠십니까?\n",
"차말로 좋수다. 참말로 좋습니다.\n",
"공기도 마고, 산이영 바다잉여 마딱 좋은게마씀 공기도 맑고, 산이랑 바다랑 모두 좋네요.\n",
"서울 갈 때랑 하영 다앙 갑서. 서울 갈 때는 많이 담아서 가십시오.\n",
"게메양. 경 헤시민 얼마나 좋코마씀? 글쎄요. 그렇게 했으면 얼마나 좋겠습니까?\n",
"식당에서\n",
"제주어 뜻풀이\n",
"무신걸 먹으코? 무엇을 먹을까?\n",
"----------\n",
"생활 속 제주어\n",
"제주는 타 지역보다 한국어의 고형(古形)을 많이 유지하고 있는 동시에 \n",
"제주도만의 고유한 어휘나 문법적 특성을 가지고 있다.\n",
"다른 지역 사람이 못 알아듣는 제주어\n",
"제주어 뜻풀이\n",
"솔쩨기 살짝\n",
"안네다 드리다\n",
"베지근허다 입안에 기름기가 감돌아 맛이 있다.\n",
"엄불랑허다 어마어마하다\n",
"코시롱허다 고소하다\n",
"산도록허다 시원하다 예) 물이 산도록헌 게 좋다.\n",
"두령청이 우두망찰\n",
"무사 왜\n",
"영, 경, 정 이렇게, 그렇게, 저렇게\n",
"게메 글쎄\n",
"인사말\n",
"제주어 뜻풀이\n",
"펜안허우꽈? 편안(안녕)하십니까?\n",
"제주도 오난 어떵허우꽈? 제주도에 오니 어떠십니까?\n",
"차말로 좋수다. 참말로 좋습니다.\n",
"공기도 마고, 산이영 바다잉여 마딱 좋은게마씀 공기도 맑고, 산이랑 바다랑 모두 좋네요.\n",
"서울 갈 때랑 하영 다앙 갑서. 서울 갈 때는 많이 담아서 가십시오.\n",
"게메양. 경 헤시민 얼마나 좋코마씀? 글쎄요. 그렇게 했으면 얼마나 좋겠습니까?\n",
"식당에서\n",
"제주어 뜻풀이\n",
"무신걸 먹으코? 무엇을 먹을까?\n",
"----------\n",
"식당에서\n",
"제주어 뜻풀이\n",
"무신걸 먹으코? 무엇을 먹을까?\n",
"게메양, 제주도에만 이신 거 먹게마씀. 글쎄요, 제주도에만 있는 것 먹게요.\n",
"구젱기영 무꾸럭이영 오토미영 하간 거 다 잇수다. 소라랑 문어랑 옥돔이랑 온갖 거 다 있습니다.\n",
"모멀펌벅에 자리젯! 메밀범벅에 자리젓!\n",
"먹을 것도 잘도 하신게. 먹을 것도 정말(엄청) 많네.\n",
"타 지역과 의미가 다른 제주어\n",
"제주어 뜻풀이\n",
"감저 고구마\n",
"지슬, 지실 감자\n",
"-허게 하자(청유의 의미) 공부허게: 공부하자\n",
"글라 가자 예) 장에 글라.(장에 가자.)\n",
"호미 낫\n",
"가겡이, 가각지, 가게 호미\n",
"폭삭 속앗수다 무척 수고하셨습니다.\n",
"삼춘 ①삼촌 ②나이 든 남자 어른이나 여자 어른을 부르는 말.\n",
"요망지다 야무지다\n",
"아 까다 아깝다(사랑스럽고 귀엽다)\n",
"젊은 층도 자주 사용하는 제주어\n",
"제주어 뜻풀이\n",
"뭐허멘? 뭐하니?\n",
"가이, 자이, 야이 걔, 쟤, 얘\n",
"기 그래\n",
"뒌 됐어\n",
"허쿠다 하겠습니다\n",
"잘도 정말, 엄청\n",
"벨라지다 바라지다\n",
"----------\n",
"식당에서\n",
"제주어 뜻풀이\n",
"무신걸 먹으코? 무엇을 먹을까?\n",
"게메양, 제주도에만 이신 거 먹게마씀. 글쎄요, 제주도에만 있는 것 먹게요.\n",
"구젱기영 무꾸럭이영 오토미영 하간 거 다 잇수다. 소라랑 문어랑 옥돔이랑 온갖 거 다 있습니다.\n",
"모멀펌벅에 자리젯! 메밀범벅에 자리젓!\n",
"먹을 것도 잘도 하신게. 먹을 것도 정말(엄청) 많네.\n",
"타 지역과 의미가 다른 제주어\n",
"제주어 뜻풀이\n",
"감저 고구마\n",
"지슬, 지실 감자\n",
"-허게 하자(청유의 의미) 공부허게: 공부하자\n",
"글라 가자 예) 장에 글라.(장에 가자.)\n",
"호미 낫\n",
"가겡이, 가각지, 가게 호미\n",
"폭삭 속앗수다 무척 수고하셨습니다.\n",
"삼춘 ①삼촌 ②나이 든 남자 어른이나 여자 어른을 부르는 말.\n",
"요망지다 야무지다\n",
"아 까다 아깝다(사랑스럽고 귀엽다)\n",
"젊은 층도 자주 사용하는 제주어\n",
"제주어 뜻풀이\n",
"뭐허멘? 뭐하니?\n",
"가이, 자이, 야이 걔, 쟤, 얘\n",
"기 그래\n",
"뒌 됐어\n",
"허쿠다 하겠습니다\n",
"잘도 정말, 엄청\n",
"벨라지다 바라지다\n",
"----------\n",
"식당에서\n",
"제주어 뜻풀이\n",
"무신걸 먹으코? 무엇을 먹을까?\n",
"게메양, 제주도에만 이신 거 먹게마씀. 글쎄요, 제주도에만 있는 것 먹게요.\n",
"구젱기영 무꾸럭이영 오토미영 하간 거 다 잇수다. 소라랑 문어랑 옥돔이랑 온갖 거 다 있습니다.\n",
"모멀펌벅에 자리젯! 메밀범벅에 자리젓!\n",
"먹을 것도 잘도 하신게. 먹을 것도 정말(엄청) 많네.\n",
"타 지역과 의미가 다른 제주어\n",
"제주어 뜻풀이\n",
"감저 고구마\n",
"지슬, 지실 감자\n",
"-허게 하자(청유의 의미) 공부허게: 공부하자\n",
"글라 가자 예) 장에 글라.(장에 가자.)\n",
"호미 낫\n",
"가겡이, 가각지, 가게 호미\n",
"폭삭 속앗수다 무척 수고하셨습니다.\n",
"삼춘 ①삼촌 ②나이 든 남자 어른이나 여자 어른을 부르는 말.\n",
"요망지다 야무지다\n",
"아 까다 아깝다(사랑스럽고 귀엽다)\n",
"젊은 층도 자주 사용하는 제주어\n",
"제주어 뜻풀이\n",
"뭐허멘? 뭐하니?\n",
"가이, 자이, 야이 걔, 쟤, 얘\n",
"기 그래\n",
"뒌 됐어\n",
"허쿠다 하겠습니다\n",
"잘도 정말, 엄청\n",
"벨라지다 바라지다\n",
"----------\n",
"식당에서\n",
"제주어 뜻풀이\n",
"무신걸 먹으코? 무엇을 먹을까?\n",
"게메양, 제주도에만 이신 거 먹게마씀. 글쎄요, 제주도에만 있는 것 먹게요.\n",
"구젱기영 무꾸럭이영 오토미영 하간 거 다 잇수다. 소라랑 문어랑 옥돔이랑 온갖 거 다 있습니다.\n",
"모멀펌벅에 자리젯! 메밀범벅에 자리젓!\n",
"먹을 것도 잘도 하신게. 먹을 것도 정말(엄청) 많네.\n",
"타 지역과 의미가 다른 제주어\n",
"제주어 뜻풀이\n",
"감저 고구마\n",
"지슬, 지실 감자\n",
"-허게 하자(청유의 의미) 공부허게: 공부하자\n",
"글라 가자 예) 장에 글라.(장에 가자.)\n",
"호미 낫\n",
"가겡이, 가각지, 가게 호미\n",
"폭삭 속앗수다 무척 수고하셨습니다.\n",
"삼춘 ①삼촌 ②나이 든 남자 어른이나 여자 어른을 부르는 말.\n",
"요망지다 야무지다\n",
"아 까다 아깝다(사랑스럽고 귀엽다)\n",
"젊은 층도 자주 사용하는 제주어\n",
"제주어 뜻풀이\n",
"뭐허멘? 뭐하니?\n",
"가이, 자이, 야이 걔, 쟤, 얘\n",
"기 그래\n",
"뒌 됐어\n",
"허쿠다 하겠습니다\n",
"잘도 정말, 엄청\n",
"벨라지다 바라지다\n",
"----------\n",
"식당에서\n",
"제주어 뜻풀이\n",
"무신걸 먹으코? 무엇을 먹을까?\n",
"게메양, 제주도에만 이신 거 먹게마씀. 글쎄요, 제주도에만 있는 것 먹게요.\n",
"구젱기영 무꾸럭이영 오토미영 하간 거 다 잇수다. 소라랑 문어랑 옥돔이랑 온갖 거 다 있습니다.\n",
"모멀펌벅에 자리젯! 메밀범벅에 자리젓!\n",
"먹을 것도 잘도 하신게. 먹을 것도 정말(엄청) 많네.\n",
"타 지역과 의미가 다른 제주어\n",
"제주어 뜻풀이\n",
"감저 고구마\n",
"지슬, 지실 감자\n",
"-허게 하자(청유의 의미) 공부허게: 공부하자\n",
"글라 가자 예) 장에 글라.(장에 가자.)\n",
"호미 낫\n",
"가겡이, 가각지, 가게 호미\n",
"폭삭 속앗수다 무척 수고하셨습니다.\n",
"삼춘 ①삼촌 ②나이 든 남자 어른이나 여자 어른을 부르는 말.\n",
"요망지다 야무지다\n",
"아 까다 아깝다(사랑스럽고 귀엽다)\n",
"젊은 층도 자주 사용하는 제주어\n",
"제주어 뜻풀이\n",
"뭐허멘? 뭐하니?\n",
"가이, 자이, 야이 걔, 쟤, 얘\n",
"기 그래\n",
"뒌 됐어\n",
"허쿠다 하겠습니다\n",
"잘도 정말, 엄청\n",
"벨라지다 바라지다\n",
"----------\n",
"식당에서\n",
"제주어 뜻풀이\n",
"무신걸 먹으코? 무엇을 먹을까?\n",
"게메양, 제주도에만 이신 거 먹게마씀. 글쎄요, 제주도에만 있는 것 먹게요.\n",
"구젱기영 무꾸럭이영 오토미영 하간 거 다 잇수다. 소라랑 문어랑 옥돔이랑 온갖 거 다 있습니다.\n",
"모멀펌벅에 자리젯! 메밀범벅에 자리젓!\n",
"먹을 것도 잘도 하신게. 먹을 것도 정말(엄청) 많네.\n",
"타 지역과 의미가 다른 제주어\n",
"제주어 뜻풀이\n",
"감저 고구마\n",
"지슬, 지실 감자\n",
"-허게 하자(청유의 의미) 공부허게: 공부하자\n",
"글라 가자 예) 장에 글라.(장에 가자.)\n",
"호미 낫\n",
"가겡이, 가각지, 가게 호미\n",
"폭삭 속앗수다 무척 수고하셨습니다.\n",
"삼춘 ①삼촌 ②나이 든 남자 어른이나 여자 어른을 부르는 말.\n",
"요망지다 야무지다\n",
"아 까다 아깝다(사랑스럽고 귀엽다)\n",
"젊은 층도 자주 사용하는 제주어\n",
"제주어 뜻풀이\n",
"뭐허멘? 뭐하니?\n",
"가이, 자이, 야이 걔, 쟤, 얘\n",
"기 그래\n",
"뒌 됐어\n",
"허쿠다 하겠습니다\n",
"잘도 정말, 엄청\n",
"벨라지다 바라지다\n",
"----------\n",
"식당에서\n",
"제주어 뜻풀이\n",
"무신걸 먹으코? 무엇을 먹을까?\n",
"게메양, 제주도에만 이신 거 먹게마씀. 글쎄요, 제주도에만 있는 것 먹게요.\n",
"구젱기영 무꾸럭이영 오토미영 하간 거 다 잇수다. 소라랑 문어랑 옥돔이랑 온갖 거 다 있습니다.\n",
"모멀펌벅에 자리젯! 메밀범벅에 자리젓!\n",
"먹을 것도 잘도 하신게. 먹을 것도 정말(엄청) 많네.\n",
"타 지역과 의미가 다른 제주어\n",
"제주어 뜻풀이\n",
"감저 고구마\n",
"지슬, 지실 감자\n",
"-허게 하자(청유의 의미) 공부허게: 공부하자\n",
"글라 가자 예) 장에 글라.(장에 가자.)\n",
"호미 낫\n",
"가겡이, 가각지, 가게 호미\n",
"폭삭 속앗수다 무척 수고하셨습니다.\n",
"삼춘 ①삼촌 ②나이 든 남자 어른이나 여자 어른을 부르는 말.\n",
"요망지다 야무지다\n",
"아 까다 아깝다(사랑스럽고 귀엽다)\n",
"젊은 층도 자주 사용하는 제주어\n",
"제주어 뜻풀이\n",
"뭐허멘? 뭐하니?\n",
"가이, 자이, 야이 걔, 쟤, 얘\n",
"기 그래\n",
"뒌 됐어\n",
"허쿠다 하겠습니다\n",
"잘도 정말, 엄청\n",
"벨라지다 바라지다\n",
"----------\n",
"식당에서\n",
"제주어 뜻풀이\n",
"무신걸 먹으코? 무엇을 먹을까?\n",
"게메양, 제주도에만 이신 거 먹게마씀. 글쎄요, 제주도에만 있는 것 먹게요.\n",
"구젱기영 무꾸럭이영 오토미영 하간 거 다 잇수다. 소라랑 문어랑 옥돔이랑 온갖 거 다 있습니다.\n",
"모멀펌벅에 자리젯! 메밀범벅에 자리젓!\n",
"먹을 것도 잘도 하신게. 먹을 것도 정말(엄청) 많네.\n",
"타 지역과 의미가 다른 제주어\n",
"제주어 뜻풀이\n",
"감저 고구마\n",
"지슬, 지실 감자\n",
"-허게 하자(청유의 의미) 공부허게: 공부하자\n",
"글라 가자 예) 장에 글라.(장에 가자.)\n",
"호미 낫\n",
"가겡이, 가각지, 가게 호미\n",
"폭삭 속앗수다 무척 수고하셨습니다.\n",
"삼춘 ①삼촌 ②나이 든 남자 어른이나 여자 어른을 부르는 말.\n",
"요망지다 야무지다\n",
"아 까다 아깝다(사랑스럽고 귀엽다)\n",
"젊은 층도 자주 사용하는 제주어\n",
"제주어 뜻풀이\n",
"뭐허멘? 뭐하니?\n",
"가이, 자이, 야이 걔, 쟤, 얘\n",
"기 그래\n",
"뒌 됐어\n",
"허쿠다 하겠습니다\n",
"잘도 정말, 엄청\n",
"벨라지다 바라지다\n",
"----------\n",
"식당에서\n",
"제주어 뜻풀이\n",
"무신걸 먹으코? 무엇을 먹을까?\n",
"게메양, 제주도에만 이신 거 먹게마씀. 글쎄요, 제주도에만 있는 것 먹게요.\n",
"구젱기영 무꾸럭이영 오토미영 하간 거 다 잇수다. 소라랑 문어랑 옥돔이랑 온갖 거 다 있습니다.\n",
"모멀펌벅에 자리젯! 메밀범벅에 자리젓!\n",
"먹을 것도 잘도 하신게. 먹을 것도 정말(엄청) 많네.\n",
"타 지역과 의미가 다른 제주어\n",
"제주어 뜻풀이\n",
"감저 고구마\n",
"지슬, 지실 감자\n",
"-허게 하자(청유의 의미) 공부허게: 공부하자\n",
"글라 가자 예) 장에 글라.(장에 가자.)\n",
"호미 낫\n",
"가겡이, 가각지, 가게 호미\n",
"폭삭 속앗수다 무척 수고하셨습니다.\n",
"삼춘 ①삼촌 ②나이 든 남자 어른이나 여자 어른을 부르는 말.\n",
"요망지다 야무지다\n",
"아 까다 아깝다(사랑스럽고 귀엽다)\n",
"젊은 층도 자주 사용하는 제주어\n",
"제주어 뜻풀이\n",
"뭐허멘? 뭐하니?\n",
"가이, 자이, 야이 걔, 쟤, 얘\n",
"기 그래\n",
"뒌 됐어\n",
"허쿠다 하겠습니다\n",
"잘도 정말, 엄청\n",
"벨라지다 바라지다\n",
"----------\n"
]
}
],
"execution_count": 26
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:49:59.175454898Z",
"start_time": "2026-06-02T00:49:47.825460785Z"
}
},
"cell_type": "code",
"source": [
"# 답변만 축약\n",
"extractor = LLMChainExtractor.from_llm(watson_llm)\n",
"\n",
"compression_retriever = ContextualCompressionRetriever(base_compressor=extractor, base_retriever=base_retriever)\n",
"\n",
"docs = compression_retriever.invoke(\"생활 속 제주어에서 엄불랑하다는 무슨 뜻이야?\")\n",
"for doc in docs:\n",
" print(doc.page_content[:500])\n",
" print(\"-\"*10)\n"
],
"id": "c2eb4460a120553c",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"엄불랑허다 어마어마하다\n",
"----------\n",
"엄불랑허다 어마어마하다\n",
"----------\n",
"엄불랑허다 어마어마하다\n",
"----------\n",
"엄불랑허다 어마어마하다\n",
"----------\n",
"엄불랑허다 어마어마하다\n",
"----------\n",
"엄불랑허다 어마어마하다\n",
"----------\n",
"엄불랑허다 어마어마하다\n",
"----------\n",
"엄불랑허다 어마어마하다\n",
"----------\n",
"엄불랑허다 어마어마하다\n",
"----------\n",
"엄불랑허다 어마어마하다\n",
"----------\n",
"엄불랑허다 어마어마하다\n",
"----------\n"
]
}
],
"execution_count": 27
},
{
"metadata": {},
"cell_type": "markdown",
"source": [
"### Embedding Filter\n",
"- 임계값을 기준으로 미달한 문서 제외\n"
],
"id": "dcba506da059c54f"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:50:09.276173628Z",
"start_time": "2026-06-02T00:49:59.190701406Z"
}
},
"cell_type": "code",
"source": [
"embedding_filter = EmbeddingsFilter(embeddings=watson_embedding, similarity_threshold=0.8)\n",
"\n",
"pipeline = DocumentCompressorPipeline(transformers=[embedding_filter,extractor])\n",
"\n",
"compression_retriever = ContextualCompressionRetriever(base_compressor=pipeline, base_retriever=base_retriever)\n",
"\n",
"docs = compression_retriever.invoke(\"생활 속 제주어에서 엄불랑하다는 무슨 뜻이야?\")\n",
"for doc in docs:\n",
" print(doc.page_content[:500])\n",
" print(\"-\"*10)\n"
],
"id": "637a4cd6a412d4d6",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"엄불랑허다 어마어마하다\n",
"----------\n",
"엄불랑허다 어마어마하다\n",
"----------\n",
"엄불랑허다 어마어마하다\n",
"----------\n",
"엄불랑허다 어마어마하다\n",
"----------\n",
"엄불랑허다 어마어마하다\n",
"----------\n",
"엄불랑허다 어마어마하다\n",
"----------\n",
"엄불랑허다 어마어마하다\n",
"----------\n",
"엄불랑허다 어마어마하다\n",
"----------\n",
"엄불랑허다 어마어마하다\n",
"----------\n",
"엄불랑허다 어마어마하다\n",
"----------\n",
"엄불랑허다 어마어마하다\n",
"----------\n"
]
}
],
"execution_count": 28
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:50:10.288867811Z",
"start_time": "2026-06-02T00:50:09.287890271Z"
}
},
"cell_type": "code",
"source": [
"filtered_docs = embedding_filter.compress_documents(docs, query)\n",
"len(filtered_docs)"
],
"id": "ae22a001943f6b92",
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 29
},
{
"metadata": {},
"cell_type": "markdown",
"source": [
"#### RAG 성능개선\n",
"1. 문서전처리\n",
"- chunk 최적화 metadata 추가\n",
"\n",
"2. Retrieval(검색 개선\n",
"- MMR, BM25, Hybrid, SelfQuery\n",
"\n",
"3. Retrieval 후처리\n",
"- Rerank, EmbeddingFilter, LLMChainExtractor"
],
"id": "e95c6bc3809f125f"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:50:44.214523942Z",
"start_time": "2026-06-02T00:50:10.304249553Z"
}
},
"cell_type": "code",
"source": [
"# 한양대대학원캠퍼스가이드.pdf 로드 후 chunk_size=500, overlap =50 split 한후 청크 사이즈 확인\n",
"# 청크 내용 확인\n",
"\n",
"pdf_path = \"./data/한양대 대학원 캠퍼스 가이드.pdf\"\n",
"chunks = create_chunks_from_pdf(pdf_path)\n",
"len(chunks)\n",
"\n",
"# pdf -> 이미지 이미지->텍스트 인식 json으로 저장\n",
"# 벡터스토어에 저장 collection_name=\"hanyang_campus\""
],
"id": "d27e6157b22b8011",
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 30
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:51:18.008958897Z",
"start_time": "2026-06-02T00:50:44.231442765Z"
}
},
"cell_type": "code",
"source": [
"pdf_path = \"./data/한양대 대학원 캠퍼스 가이드.pdf\"\n",
"chunks = create_chunks_from_pdf(pdf_path)\n",
"\n",
"for i in range(min(2, len(chunks))):\n",
" print(\"=\"*50)\n",
" print(chunks[i].page_content[:500])"
],
"id": "e6cdbf960d07d310",
"outputs": [],
"execution_count": 31
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:51:38.353190588Z",
"start_time": "2026-06-02T00:51:18.020849964Z"
}
},
"cell_type": "code",
"source": [
"# PDF 를이미지로 변환하기\n",
"import fitz\n",
"\n",
"pdf = fitz.open(pdf_path)\n",
"for page_num in range(len(pdf)):\n",
" page = pdf[page_num]\n",
" pix = page.get_pixmap(dpi=300)\n",
" pix.save(f\"pages_{page_num}.png\")"
],
"id": "5e7e9f9389a952fb",
"outputs": [],
"execution_count": 32
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T00:52:03.209537974Z",
"start_time": "2026-06-02T00:51:38.370120389Z"
}
},
"cell_type": "code",
"source": [
"# 이미지 => 텍스트 추출\n",
"import easyocr\n",
"\n",
"reader = easyocr.Reader(['ko', 'en'])\n",
"result = reader.readtext(\"pages_19.png\", detail=0, paragraph=True)\n",
"print(\"\\n\".join(result))"
],
"id": "19b6e4974c7c8b3d",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Neither CUDA nor MPS are available - defaulting to CPU. Note: This module is much faster with a GPU.\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"I. 개요\n",
"(5) 운영 회장 이하 12명의 간부로 학생회틀 이끌어 가고 있습니다 총 예산은 매 학기 원우들이 내는 원우회비와 각종 행사률 위한 학교 지원금으로 구성되어 있으려 원우들올 위한 다양한 복지 및 행사에 집행되고 있습니다: 참고로 원우회비틀 납부하신 분에 한해서만 진행되는 행사들도 있으니 원우회비률 납부하서서 더 많은 혜택올 받아 가시기 바람니다\n",
"(6) 활동 학생회에서 매년 정기적으로 진행하는 활동은 보통 아래와 같으 이밖에도 도서 지원 사업 졸업 기념 이번트 등 원우들올 위해 여러 가지 활동올 하고 있습니다\n",
"I. 학사안내\n",
"1) 춘 추계 원우 한마당 개최 춘계(4 5월) 추계(9 10월) 원우한마당올 매년 개최하고 있으려 이 자리는 학과루 떠나 원우들 간의 친목과 화합울 도모하는 장입니다: 많은 상품과 교우 관계 네트위크 구축을 통해서 즐거운 대학원 생활올 누리실 수 있습니다: 부가적으로 따르는 상품 및 기념품도 꼭 확인하시기 바람니다:\n",
"1 로드맵으로 본 대학원 생활 2 주요 학사안내 3. 기타 학사안내 4. 학생 종합정보 프로그램 안내\n",
"2) 여름방학 해외 단기 연수 프로그램 여름방학기간올 활용하여 매년 정기적으로 이루어지고 있습니다: 해외 대학 팀방 등올 포함한 해외 단기 연수름 통해 원우들이 보다 넓은 세계로 나가기 위한 견문을 넓히고 새롭고 다양한 경험올 통하여 원우들이 한 단계 더 나아갈 수 잇는 밀거름이 되길 바람니다:\n",
"매해컨흉대 대학원 인우가 되는 신입생들어계 이률 기념하여 정성이 담긴 작은기념품올 제작하여 배부하고 있습니다: 또한 원우 한마당 기념품도 제작하여 배부하고 있습니다\n",
"ID\n",
"4) 특별강좌 개설 원우들의 논문작성이나 수업에 관련하여 현실적인 도움이 월 수 있도록 외부에서 전문 강사흘 초방하여 특별강좌흘 개설하고 있습니다: 현재는 방학 기간을 이용하여 SPSS STATA(통계 프로그램)과 같은 통계강좌 및 논문 작성 방법 등 원우들에게 유의할 만한 특강울 개설하고 있으려 앞으로 설문과 홍보름 통해 많은 원우들이 필요로 하는 강좌들 정기적으로 개설할 예정입니다:\n",
"X 원우회의 모든 소식은 흉페이지틀 통해서 전달되다 언제든지 확인하실 수 있습니다: 게시판올 통하여 궁금하 사랑이나 건의사항울 올려주시기 바람니다 원우 여러분들의 적극적인 참여가 학생회틀 더욱 발전시길 것입니다\n",
"36 2026 한양대학교 대학원 캠퍼스 가이드\n"
]
}
],
"execution_count": 33
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T01:22:56.350924696Z",
"start_time": "2026-06-02T00:52:03.223503871Z"
}
},
"cell_type": "code",
"source": [
"import json\n",
"pages =[]\n",
"\n",
"for page_num in range(len(pdf)):\n",
" image_path = image_path = f\"pages_{page_num}.png\"\n",
" result = reader.readtext(image_path, detail=0, paragraph=True)\n",
" text = \"\\n\".join(result)\n",
" pages.append({\"pages\":page_num + 1, \"content\":text})\n",
"\n",
"with open(\"./data/hanyang_campus.json\", \"w\", encoding=\"utf-8\") as f:\n",
" json.dump(pages, f, ensure_ascii=False, indent=2)"
],
"id": "aca56248c4cb8e79",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n",
"/home/cooney/Source/.venv/lib/python3.12/site-packages/torch/utils/data/dataloader.py:752: UserWarning: 'pin_memory' argument is set as true but no accelerator is found, then device pinned memory won't be used.\n",
" super().__init__(loader)\n"
]
}
],
"execution_count": 34
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T01:22:56.379584524Z",
"start_time": "2026-06-02T01:22:56.364430340Z"
}
},
"cell_type": "code",
"source": [
"with open(\"./data/hanyang_campus.json\", \"r\", encoding=\"utf-8\") as f:\n",
" pages = json.load(f)\n",
"\n",
"docs = []\n",
"for page in pages:\n",
" docs.append(\n",
" Document(\n",
" page_content=page[\"content\"],\n",
" metadata={\"pages\":page['pages'],\n",
" \"source\": \"hanyang_campus\"\n",
" }\n",
" )\n",
" )"
],
"id": "ca49b61be9b3a884",
"outputs": [],
"execution_count": 35
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T01:23:03.094530621Z",
"start_time": "2026-06-02T01:22:56.381266Z"
}
},
"cell_type": "code",
"source": [
"# len(docs)\n",
"\n",
"splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)\n",
"chunks = splitter.split_documents(docs)\n",
"\n",
"vectorstore = create_vectorstore(\n",
" chunks=chunks, embeddings=watson_embedding, persist_directory=\"./db/chroma_db\", collection_name=\"hanyang_campus\")"
],
"id": "3b6e9435b199c2f2",
"outputs": [],
"execution_count": 36
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2026-06-02T01:23:03.149472417Z",
"start_time": "2026-06-02T01:23:03.110209373Z"
}
},
"cell_type": "code",
"source": [
"# 검색\n",
"hanyang_vectorstore\\\n",
" =Chroma(persist_directory=\"./db/chroma_db\", embedding_function=watson_embedding,collection_name=\"hanyang_campus\")\n",
"\n"
],
"id": "7b39c5cb6fa77996",
"outputs": [],
"execution_count": 37
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.10"
}
},
"nbformat": 4,
"nbformat_minor": 5
}