[Recent Interests] Data Engineering / MLOps
[LangChain] LangChain์„ ํ™œ์šฉํ•œ ๋ฌธ์„œ ๊ธฐ๋ฐ˜ ์ฑ—๋ด‡ ๋งŒ๋“ค๊ธฐ

2024.2 ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋œ ๊ฒŒ์‹œ๊ธ€ ์ž…๋‹ˆ๋‹ค.
 
LangChain์€ ์–ธ์–ด ๋ชจ๋ธ์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ์ด ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

1. LangChain ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: Python ๋ฐ JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ํ†ตํ•ฉ, ์ด๋Ÿฌํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฒด์ธ๊ณผ ์—์ด์ „ํŠธ๋กœ ๊ฒฐํ•ฉํ•˜๋Š” ๊ธฐ๋ณธ ์‹คํ–‰ ํ™˜๊ฒฝ, ๊ทธ๋ฆฌ๊ณ  ์ฒด์ธ๊ณผ ์—์ด์ „ํŠธ์˜ ์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ตฌํ˜„์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
2. LangChain ํ…œํ”Œ๋ฆฟ: ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์œ„ํ•œ ์‰ฝ๊ฒŒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ฐธ์กฐ ์•„ํ‚คํ…์ฒ˜ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค.
3. LangServe: REST API๋กœ LangChain ์ฒด์ธ์„ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
4. LangSmith: ๋ชจ๋“  LLM ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋นŒ๋“œ๋œ ์ฒด์ธ์„ ๋””๋ฒ„๊น…, ํ…Œ์ŠคํŠธ, ํ‰๊ฐ€ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋ฐœ์ž ํ”Œ๋žซํผ์œผ๋กœ, LangChain๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.

LangChain์€ ์–ธ์–ด ๋ชจ๋ธ์„ ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•˜์—ฌ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์šด์˜ํ•˜๋Š”๋ฐ ํ•„์ˆ˜์ ์ธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
 

https://python.langchain.com/docs/get_started/introduction

 
ํ†ต์ƒ์ ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์งˆ๋ฌธ์„ ์ดํ•ดํ•˜๊ณ  ์ ์ ˆํ•œ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ž์—ฐ์–ด ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฑ—๋ด‡์ด๋ผ๊ณ  ํ‘œํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํŠœํ† ๋ฆฌ์–ผ์—์„œ ์‚ฌ์šฉํ•  langchain์˜ RetrievalQA๋ฅผ ์ด์šฉํ•˜์—ฌ QA(Question Answering) ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•ด๋ด…๋‹ˆ๋‹ค. QA ์‹œ์Šคํ…œ์€ ์งˆ๋ฌธ ์ดํ•ด -> ์ •๋ณด ๊ฒ€์ƒ‰ -> ๋‹ต๋ณ€ ์ƒ์„ฑ ํ๋ฆ„์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. 
QA์‹œ์Šคํ…œ์€ ์‚ฌ์ „์— ์„ค์ •ํ•œ ๋ฌธ์„œ/์ง€์‹์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‘๋‹ต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์งˆ๋ฌธ๋งŒ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋‹ต๋ณ€ ํ›„์— ๋Œ€ํ™”๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ ์ž‘์šฉ์„ ์ด์–ด๊ฐ€๋Š” chatGPT ๊ธฐ๋ฐ˜ ์ฑ—๋ด‡๊ณผ ๋‹ฌ๋ฆฌ QA ์‹œ์Šคํ…œ์€ ํ•˜๋‚˜์˜ ์งˆ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‹ต๋ณ€ ํ›„ ๋Œ€ํ™”๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค๋Š” ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 
 
langchain์„ ์‚ฌ์šฉํ•œ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ์šฐ์„  ๊ฐ€์ƒํ™˜๊ฒฝ๋ถ€ํ„ฐ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. 

conda create -n langchain python=3.11

 
๊ฐ€์ƒํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™” ํ•˜๊ณ  ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. 

conda activate langchain
pip install langchain openai pypdf chromadb tiktoken langchain-community langchain-openai

# jupyter notebook ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰์‹œ ์„ค์น˜
pip install jupyter notebook

 
์ด์ œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ import ํ•ฉ๋‹ˆ๋‹ค.

from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain.chains import RetrievalQA

์ด์ œ OPENAI_API_KEY๋ฅผ ์„ค์ •ํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 
OPENAI_API_KEY ์‹œํฌ๋ฆฟ ํ‚ค ์ƒ์„ฑ์€ ์•„๋ž˜ ๋ฐฉ๋ฒ•์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋”๋ณด๊ธฐ

1. OpenAI ํšŒ์›๊ฐ€์ž… ํ›„ https://platform.openai.com/usage ์˜ ์šฐ์ธก์—์„œ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ํฌ๋ ˆ๋”ง์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์ด๋ฏธ ๋ฌด๋ฃŒ ์ œ๊ณต ํฌ๋ ˆ๋”ง์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์—ฌ ์ถฉ์ „ํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

 

2. ์ขŒ์ธก์˜ API keys ํƒญ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ์ƒˆ๋กœ์šด ์‹œํฌ๋ฆฟ ํ‚ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

3. ์ƒ์„ฑํ›„ ๋‚˜์˜จ ๊ฐ’์„ ์ž˜ ๋ณต์‚ฌํ•ด๋‘ก๋‹ˆ๋‹ค.

๊ฐ€๊ฒฉ ์ •์ฑ…์€ ์ˆ˜์‹œ๋กœ ์—…๋ฐ์ดํŠธ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์•„๋ž˜ ๋งํฌ์—์„œ ๊ฐ€๊ฒฉ ์ •์ฑ…์„ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
https://openai.com/pricing
 
(์ฐธ๊ณ ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•˜๋Š” ๋™์•ˆ ์ œ๊ฐ€ ์‚ฌ์šฉํ•œ ํฌ๋ ˆ๋”ง ์‚ฌ์šฉ๋Ÿ‰์€ 0.05 ๋‹ฌ๋Ÿฌ์˜€์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋Ÿ‰์€ ๋ฌธ์„œ์˜ ๊ธธ์ด๋‚˜ ์‚ฌ์šฉ ๋ชจ๋ธ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ๋Ÿ‰ ํŽ˜์ด์ง€ (https://platform.openai.com/usage)๋ฅผ ์ฒดํฌํ•˜์‹œ๊ธธ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. )
 
์ž์‹ ์˜ OpenAI ์‹œํฌ๋ฆฟ ํ‚ค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

import os 
os.environ["OPENAI_API_KEY"] = "์ด๊ณณ์— ํ‚ค๊ฐ’ ์ž…๋ ฅ"

 
์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ์–ด์˜ฌ ๋ฌธ์„œ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ…์ŠคํŠธ ๋ถ„ํ• ๊ธฐ์™€ ์ž„๋ฒ ๋”ฉ์„ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ์˜ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ ํŒŒ์ผ์„ ์ฝ์–ด์˜จ ๋’ค ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ค‘ ํ•˜๋‚˜์ธ Chroma DB๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ์ •๋ณด๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. 

from langchain_community.document_loaders import PyPDFLoader

# PDF ํŒŒ์ผ ๊ฒฝ๋กœ ๋ชฉ๋ก
pdf_files = [
    "docs/1.pdf",
    "docs/2.pdf",
]

# ๋กœ๋”, ํ…์ŠคํŠธ ๋ถ„ํ• ๊ธฐ ๋ฐ ์ž„๋ฒ ๋”ฉ ์ดˆ๊ธฐํ™”
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
embeddings = OpenAIEmbeddings()

texts = []

# ๊ฐ PDF ํŒŒ์ผ์— ๋Œ€ํ•ด ์ž‘์—… ์ˆ˜ํ–‰
for pdf_file in pdf_files:
    loader = PyPDFLoader(pdf_file)
    documents = loader.load()
    texts.extend(text_splitter.split_documents(documents))

# Chroma ๋ฒกํ„ฐ ์Šคํ† ์–ด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ๋ฌธ์„œ์—์„œ ๋ฒกํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
docsearch = Chroma.from_documents(texts, embeddings)

 
 
์ œ๊ฐ€ ์‚ฌ์šฉํ•œ ๋ฌธ์„œ ํŒŒ์ผ์€ apple ํ™ˆํŽ˜์ด์ง€์—์„œ macOS ์„ค๋ช…์„œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ pdf ๋กœ ์ƒ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 
๋ชจ๋“  ์„ค๋ช…์„œ๋ฅผ ๋ถ™์—ฌ๋„ฃ๊ธฐ์—๋Š” ์–‘์ด ๋ฐฉ๋Œ€ํ•˜์—ฌ ๋ฐ์Šคํฌํƒ‘ ์•Œ์•„๋ณด๊ธฐ ํŒŒํŠธ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ pdf ํŒŒ์ผ์„ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ๋Š” langchain์˜ ํ”„๋กฌํฌํŠธ ํ…œํ”Œ๋ฆฟ์„ ์ด์šฉํ•˜์—ฌ ๋ฌธ์„œ ๊ธฐ๋ฐ˜ ์งˆ์˜์— ์‚ฌ์šฉํ•˜๋Š” ์šฉ๋„์— ๋งž์ถฐ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

from langchain.prompts import PromptTemplate
prompt_template = """Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.

{context}

Question: {question}
Answer in Korean:"""
# ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค
PROMPT = PromptTemplate(
    template=prompt_template, input_variables=["context", "question"]
)

ํ…œํ”Œ๋ฆฟ ๋‚ด์šฉ์„ ์‚ดํŽด๋ณด๋ฉด ๋ฌธ๋งฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์งˆ๋ฌธ์— ๋Œ€๋‹ต์„ ํ•˜๋ผ๊ณ  ํ•˜๊ณ , ๋ชจ๋ฅด๋ฉด ๋ชจ๋ฅธ๋‹ค๊ณ  ๋งํ•˜๊ณ  ๋‹ต์„ ๋งŒ๋“ค์–ด ๋‚ด์ง€ ๋ง๋ผ๊ณ  ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
 
์ด์ œ RetrievalQA๋ฅผ ์‚ฌ์šฉํ•ด์„œ QA system์„ ์ƒ์„ฑํ•ด๋ด…๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๊นŒ์ง€ ์ž‘์„ฑํ•˜๋ฉด ๋ชจ๋“  ๋‹จ๊ณ„๊ฐ€ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค!

chain_type_kwargs = {"prompt": PROMPT}
qa = RetrievalQA.from_chain_type(llm=ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0), 
                                 chain_type="stuff", 
                                 retriever=docsearch.as_retriever(), 
                                 return_source_documents=True, 
                                 chain_type_kwargs=chain_type_kwargs)


- `llm=OpenAI()` : llm ์ธ์ž๋Š” ์–ธ์–ด ๋ชจ๋ธ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” OpenAI์˜ ์–ธ์–ด ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
- `chain_type="stuff"` : chain_type์€ ์ฒด์ธ์˜ ์œ ํ˜•์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
- `retriever=docsearch.as_retriever()` : retriever๋Š” ๋ฌธ์„œ ๊ฒ€์ƒ‰์— ์‚ฌ์šฉ๋˜๋Š” ๋ฆฌํŠธ๋ฆฌ๋ฒ„(retriever)๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. docsearch๋Š” ์šฐ๋ฆฌ๊ฐ€ ์•ž์—์„œ ์ดˆ๊ธฐํ™” ํ•œ Chroma ๋ฒกํ„ฐ ์Šคํ† ์–ด์ž…๋‹ˆ๋‹ค.
- `return_source_documents=True` : ์ด ์ธ์ž๋Š” RetrievalQA๊ฐ€ ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ๋ฅผ ๋ฐ˜ํ™˜ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. True๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ํ•œ ๋ฌธ์„œ๋ฅผ context๋กœ ํ™œ์šฉํ•˜์—ฌ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
- `chain_type_kwargs=chain_type_kwargs` : chain_type_kwargs๋Š” ์ฒด์ธ ์œ ํ˜•์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ถ”๊ฐ€ ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•ž์„œ ์ •์˜ํ•œ chain_type_kwargs ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ๋”•์…”๋„ˆ๋ฆฌ์—๋Š” ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ ๋“ฑ์˜ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
 
์ด์ œ ์งˆ๋ฌธ์„ ์ž‘์„ฑํ•ด๋ด…๋‹ˆ๋‹ค!

result = qa.invoke({"query": "์ œ์–ด์„ผํ„ฐ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?"})

result ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{'query': '์ œ์–ด์„ผํ„ฐ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?',
 'result': ' ์ œ์–ด ์„ผํ„ฐ๋Š” Mac์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ํ•ญ๋ชฉ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ์„ค์ •์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ œ์–ด ์„ผํ„ฐ์—๋Š” ํ•ญ์ƒ ํ‘œ์‹œ๋˜๋Š” ๋ชจ๋“ˆ๊ณผ ๋ฉ”๋‰ด ๋ง‰๋Œ€์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ์–ด ์„ผํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.',
 'source_documents': [Document(page_content='์„ ํƒํ•˜์‹ญ์‹œ์˜ค.  ํŒ: ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ํ•ญ๋ชฉ์€ ์ œ์–ด ์„ผํ„ฐ์—์„œ ๋ฉ”๋‰ด ๋ง‰๋Œ€๋กœ ๋“œ๋ž˜๊ทธํ•˜์—ฌ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋‰ด ๋ง‰๋Œ€์—์„œ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•˜๋ ค๋ฉด Command ํ‚ค๋ฅผ ๋ˆ„๋ฅธ ์ƒํƒœ๋กœ ํ•ญ๋ชฉ์„ ๋ฉ”๋‰ด ๋ง‰๋Œ€ ๋ฐ–์œผ๋กœ ๋“œ๋ž˜๊ทธํ•˜์‹ญ์‹œ์˜ค.  ์ œ์–ด ์„ผํ„ฐ ์‚ฌ์šฉ์žํ™”ํ•˜๊ธฐ Mac์—์„œ Apple ๋ฉ”๋‰ด > ์‹œ์Šคํ…œ ์„ค์ •์„ ์„ ํƒํ•œ ๋‹ค์Œ, ์‚ฌ์ด๋“œ๋ฐ”์—์„œ ์ œ์–ด ์„ผํ„ฐ๋ฅผ ํด๋ฆญํ•˜์‹ญ์‹œ์˜ค. (์•„๋ž˜๋กœ ์Šคํฌ๋กคํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)  ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ์„น์…˜์—์„œ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์„ค์ •์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.  ์ œ์–ด ์„ผํ„ฐ ๋ชจ๋“ˆ: ์ด ์„น์…˜์— ์žˆ๋Š” ํ•ญ๋ชฉ์€ ์ œ์–ด ์„ผํ„ฐ์— ํ•ญ์ƒ ํ‘œ์‹œ๋˜๋ฉฐ, ์ œ๊ฑฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฉ”๋‰ด ๋ง‰๋Œ€์— ํ•ด๋‹น ํ•ญ๋ชฉ์„ ํ‘œ์‹œํ•˜๋„๋ก ์„ ํƒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ๋ชฉ ์˜†์— ์žˆ๋Š” ํŒ์—… ๋ฉ”๋‰ด๋ฅผ ํด๋ฆญํ•œ ๋‹ค์Œ, ์˜ต์…˜์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.  ๊ธฐํƒ€ ๋ชจ๋“ˆ: ์ด ์„น์…˜์˜ ํ•ญ๋ชฉ์„ ์ œ์–ด ์„ผํ„ฐ ๋ฐ ๋ฉ”๋‰ด ๋ง‰๋Œ€์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ๋ชฉ ์•„๋ž˜์˜ ๊ฐ ์˜ต์…˜์„ ์ผœ๊ฑฐ๋‚˜ ๋„์‹ญ์‹œ์˜ค. ์ผ๋ถ€ ํ•ญ๋ชฉ์—๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ถ”๊ฐ€ ์„ค์ •์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.  ๋ฉ”๋‰ด ๋ง‰๋Œ€๋งŒ: ๋ฉ”๋‰ด ๋ง‰๋Œ€ ์‹œ๊ณ„์˜ ์˜ต์…˜์„ ์„ ํƒํ•˜๊ณ  ๋ฉ”๋‰ด ๋ง‰๋Œ€์— ๋‹ค๋ฅธ ํ•ญ๋ชฉ(์˜ˆ: Spotlight, Siri, Time Machine ๋ฐ VPN ์ƒํƒœ)์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.  ๊ฐœ๋ณ„ ์˜ต์…˜์— ๊ด€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋Š” ์ œ์–ด ์„ผํ„ฐ ์„ค์ • ๋ณ€๊ฒฝํ•˜๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.  Mac์—์„œ Siri ์‚ฌ์šฉํ•˜๊ธฐ Mac์—์„œ Siri๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํšŒ์˜ ์„ค์ •, ์•ฑ ์—ด๊ธฐ ๋˜๋Š” ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ๋น ๋ฅด๊ฒŒ ๋ฐ›๋Š” ๋“ฑ์˜ ์ผ์ƒ์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.  ๋ฉ”๋‰ด ๋ง‰๋Œ€์— Siri ์•„์ด์ฝ˜์ด ์žˆ๊ณ  โ€œ1์ธ์น˜๊ฐ€ ๋ช‡ ์„ผํ‹ฐ๋ฏธํ„ฐ์•ผโ€๋ผ๋Š” ์š”์ฒญ๊ณผ ๊ทธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€(๊ณ„์‚ฐ๊ธฐ๋กœ ๋ณ€ํ™˜ํ•œ ์ˆ˜์น˜)์ด ์žˆ๋Š” Siri ์œˆ๋„์šฐ๋ฅผ ํ‘œ์‹œํ•˜๋Š” Mac ๋ฐ์Šคํฌํƒ‘์˜ ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ ๋ถ€๋ถ„. ํด๋ฆญํ•˜์—ฌ ๋‹ค๋ฅธ ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ๋Š” Siri ์œˆ๋„์šฐ ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์— ์žˆ๋Š” ์•„์ด์ฝ˜. ๋‹ซ๊ธฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ Siri ์œˆ๋„์šฐ๋ฅผ ๋‹ซ์„ ์ˆ˜ ์žˆ์Œ. Siri ์ผœ๊ธฐ Mac์—์„œ Apple ๋ฉ”๋‰ด > ์‹œ์Šคํ…œ ์„ค์ •์„ ์„ ํƒํ•œ ๋‹ค์Œ, ์‚ฌ์ด๋“œ๋ฐ”์—์„œ Siri ๋ฐ Spotlight๋ฅผ ํด๋ฆญํ•˜์‹ญ์‹œ์˜ค. (์•„๋ž˜๋กœ ์Šคํฌ๋กคํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)  ์˜ค๋ฅธ์ชฝ์—์„œ, โ€˜Siri ์š”์ฒญํ•˜๊ธฐโ€™๊ฐ€ ์•„์ง ์ผœ์ ธ ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด๋ฅผ ์ผ  ๋‹ค์Œ, ํ™œ์„ฑํ™”๋ฅผ ํด๋ฆญํ•˜์‹ญ์‹œ์˜ค.  ์ด ์˜ต์…˜์„ ์„ ํƒ ํ•ด์ œํ•œ ์ƒํƒœ์—์„œ Siri๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ, Siri๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ผ๋Š” ๋Œ€ํ™”์ƒ์ž๊ฐ€ ๋‚˜ํƒ€', metadata={'page': 5, 'source': '1.pdf'}),
  Document(page_content='๋ฐ์Šคํฌํƒ‘์—์„œ ์œˆ๋„์šฐ ์ฐพ๊ธฐ ๋ฐ์Šคํฌํƒ‘์ด ์—ด๋ ค ์žˆ๋Š” ์œˆ๋„์šฐ๋กœ ๊ฐ€๋“์ฐฌ ๊ฒฝ์šฐ, Mission Control์„ ํ†ตํ•ด ์œˆ๋„์šฐ๋ฅผ ์˜†์œผ๋กœ ์ด๋™ํ•˜์—ฌ ๋ฐ์Šคํฌํƒ‘์„ ๋ณด๊ฑฐ๋‚˜, ๋ฐ์Šคํฌํƒ‘์— ์—ด๋ ค ์žˆ๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์„ ๊ฐ„๋‹จํžˆ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•„์š”ํ•œ ์œˆ๋„์šฐ๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Mission Control์—์„œ ์—ด๋ฆฐ ์œˆ๋„์šฐ ๋ฐ Spaces ๋ณด๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.  ์—ฌ๋Ÿฌ ๋Œ€์˜ ๋ฐ์Šคํฌํƒ‘ ์‚ฌ์šฉํ•˜๊ธฐ ๋ฐ์Šคํฌํƒ‘ Spaces๋ฅผ ์ถ”๊ฐ€๋กœ ์ƒ์„ฑํ•˜์—ฌ ํŠน์ • ๋ฐ์Šคํฌํƒ‘์—์„œ ์ž‘์—…์„ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•œ ๋ฐ์Šคํฌํƒ‘์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง‘์ค‘์ ์œผ๋กœ ์ž‘์—…ํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ๋ฐ์Šคํฌํƒ‘์—์„œ ์ด๋ฉ”์ผ์„ ๊ด€๋ฆฌํ•˜๊ณ  ๋‘ ๋ฐ์Šคํฌํƒ‘์„ ์‰ฝ๊ฒŒ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—… ์ค‘์ธ ์—…๋ฌด์— ์ ํ•ฉํ•˜๋„๋ก ๊ฐ ๋ฐ์Šคํฌํƒ‘์„ ์‚ฌ์šฉ์žํ™”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ Spaces์—์„œ ์ž‘์—…ํ•˜๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.  Mac์—์„œ Spotlight๋กœ ๊ฒ€์ƒ‰ํ•˜๊ธฐ Spotlight๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Mac์—์„œ ์•ฑ, ๋ฌธ์„œ, ์ด๋ฉ”์ผ ๋ฐ ๊ธฐํƒ€ ํ•ญ๋ชฉ์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Siri ์ œ์•ˆ์„ ํ†ตํ•ด ๋‰ด์Šค, ์Šคํฌ์ธ  ์ ์ˆ˜, ๊ธฐ์ƒ ์ƒํƒœ, ์ฃผ๊ฐ€ ๋“ฑ์„ ํ™•์ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Spotlight๋กœ ๊ณ„์‚ฐ ๋ฐ ๋ณ€ํ™˜ ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.  Siri: ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•ด ๋ณด์‹ญ์‹œ์˜ค. โ€œ1์ธ์น˜๋Š” ๋ช‡ ์„ผํ‹ฐ์•ผ?โ€ ๋˜๋Š” โ€œ๋‹ฌ๊ฑ€ ๋œป์ด ๋ญ์•ผ?โ€ Siri๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ.  ํ•ญ๋ชฉ ๊ฒ€์ƒ‰ํ•˜๊ธฐ Mac์—์„œ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.  ๋ฉ”๋‰ด ๋ง‰๋Œ€์—์„œ (๋ณด์ด๋Š” ๊ฒฝ์šฐ) Spotlight ์•„์ด์ฝ˜์„ ํด๋ฆญํ•˜์‹ญ์‹œ์˜ค.  Command-์ŠคํŽ˜์ด์Šค ๋ฐ”๋ฅผ ๋ˆ„๋ฅด์‹ญ์‹œ์˜ค.  ํ‚ค๋ณด๋“œ์˜ ๊ธฐ๋Šฅ ํ‚ค ํ–‰์—์„œ (์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ) ์„ ๋ˆ„๋ฅด์‹ญ์‹œ์˜ค.  ๋ฐ์Šคํฌํƒ‘ ์–ด๋””๋กœ๋“  Spotlight ์œˆ๋„์šฐ๋ฅผ ๋“œ๋ž˜๊ทธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.  ํŒ: ๋ฉ”๋‰ด ๋ง‰๋Œ€์— Spotlight ์•„์ด์ฝ˜์ด ์—†์œผ๋ฉด ์ œ์–ด ์„ผํ„ฐ ์„ค์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.  ๊ฒ€์ƒ‰ ํ•„๋“œ์— ์ฐพ์„ ํ•ญ๋ชฉ์„ ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค. ์ž…๋ ฅ๊ณผ ๋™์‹œ์— ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.  Spotlight๋Š” ๊ฐ€์žฅ ์—ฐ๊ด€์„ฑ ๋†’์€ ํ•ญ๋ชฉ์„ ๋จผ์ € ๋‚˜์—ดํ•˜๋ฉฐ, ๊ฐ€์žฅ ์—ฐ๊ด€์„ฑ ๋†’์€ ํ•ญ๋ชฉ์„ ํด๋ฆญํ•˜์—ฌ ๋ฏธ๋ฆฌ ๋ณด๊ฑฐ๋‚˜ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Spotlight๋Š” ์‚ฌ์šฉ์ž์˜ ๊ฒ€์ƒ‰์–ด๋ฅผ ๋ณ€ํ˜•ํ•˜์—ฌ ๊ฒ€์ƒ‰ํ•œ ํ•ญ๋ชฉ์„ ์ œ์•ˆํ•˜๋ฉฐ Spotlight ๋˜๋Š” ์›น์—์„œ ํ•ด๋‹น ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.', metadata={'page': 2, 'source': '1.pdf'}),
  Document(page_content='๊ฐœ์ธ์ •๋ณด\t๋ณดํ˜ธ\tํ‘œ์‹œ๊ธฐ๋Š”\t์ \t๋˜๋Š”\tํ™”์‚ดํ‘œ์ผ\t์ˆ˜\t์žˆ์œผ๋ฉฐ,\t์ œ์–ด\t์„ผํ„ฐ\t์˜ค๋ฅธ์ชฝ์—\t์žˆ์Šต๋‹ˆ๋‹ค.\tMac์˜\t๋งˆ์ดํฌ๊ฐ€\t์‚ฌ์šฉ\t์ค‘์ธ\t๊ฒฝ์šฐ\t๋ฉ”๋‰ด\t๋ง‰๋Œ€์—์„œ\t์ œ์–ด\t์„ผํ„ฐ\t์•„์ด์ฝ˜\t์˜†์—\t์ฃผํ™ฉ์ƒ‰\t์ ์ด\t๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.\t์นด๋ฉ”๋ผ๊ฐ€\t์‚ฌ์šฉ\t์ค‘์ธ\t๊ฒฝ์šฐ\t์ดˆ๋ก์ƒ‰\t์ ์ด\t๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.\t์‹œ์Šคํ…œ\t์˜ค๋””์˜ค๋ฅผ\t๋…น์Œ\t์ค‘์ธ\t๊ฒฝ์šฐ\t๋ณด๋ผ์ƒ‰\t์ ์ด\t๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.\t์‚ฌ์šฉ์ž์˜\t์œ„์น˜๊ฐ€\t์‚ฌ์šฉ\t์ค‘์ธ\t๊ฒฝ์šฐ\tํ™”์‚ดํ‘œ๊ฐ€\t๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.\t๊ฐœ์ธ์ •๋ณด\t๋ณดํ˜ธ\tํ‘œ์‹œ๊ธฐ\t์ ์€\tํ•œ\t๋ฒˆ์—\tํ•˜๋‚˜๋งŒ\tํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.\t์˜ˆ๋ฅผ\t๋“ค์–ด,\t๋งˆ์ดํฌ\t๋ฐ\t์นด๋ฉ”๋ผ๋ฅผ\t๋ชจ๋‘\t์‚ฌ์šฉ\t์ค‘์ธ\t๊ฒฝ์šฐ\t์ดˆ๋ก์ƒ‰\t์ ๋งŒ\tํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.\t์ œ์–ด\t์„ผํ„ฐ๋ฅผ\t์—ด๋ฉด\t์œˆ๋„์šฐ\t์ƒ๋‹จ์—\t๋งˆ์ดํฌ,\t์œ„์น˜,\t์นด๋ฉ”๋ผ\t๋˜๋Š”\t์‹œ์Šคํ…œ\t์˜ค๋””์˜ค๋ฅผ\t์‚ฌ์šฉ\t์ค‘์ธ\t์•ฑ์„\tํ‘œ์‹œํ•˜๋Š”\tํ•„๋“œ๊ฐ€\tํฌํ•จ๋ \t์ˆ˜\t์žˆ์Šต๋‹ˆ๋‹ค.\tํ•ด๋‹น\tํ•„๋“œ๋ฅผ\tํด๋ฆญํ•˜์—ฌ\t์ถ”๊ฐ€\t์ •๋ณด๊ฐ€\t์žˆ์„\t์ˆ˜\t์žˆ๋Š”\t๊ฐœ์ธ์ •๋ณด\t๋ณดํ˜ธ\t์œˆ๋„์šฐ๋ฅผ\t์—ด\t์ˆ˜\t์žˆ์Šต๋‹ˆ๋‹ค(macOS\t13.3\t์ด์ƒ).\t์•Œ๋ฆผ\t์„ผํ„ฐ\t๋ฉ”๋‰ด\t๋ง‰๋Œ€์˜\t์˜ค๋ฅธ์ชฝ\t๋์—์„œ\t๋‚ ์งœ์™€\t์‹œ๊ฐ„์„\tํด๋ฆญํ•˜์—ฌ\t์•Œ๋ฆผ\t์„ผํ„ฐ๋ฅผ\t์—ด๋ฉด\t์œ„์ ฏ์„\t๋ณด๊ณ \t๋†“์นœ\t์•Œ๋ฆผ์„\tํ™•์ธํ• \t์ˆ˜\t์žˆ์Šต๋‹ˆ๋‹ค.\t์•Œ๋ฆผ\t์„ผํ„ฐ\t์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ\t์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.\tMac ๋ฐ์Šคํฌํƒ‘ ์•Œ์•„๋ณด๊ธฐ ํ™”๋ฉด ์ƒ๋‹จ์—๋Š” ๋ฉ”๋‰ด ๋ง‰๋Œ€๊ฐ€ ์žˆ๊ณ  ํ•˜๋‹จ์—๋Š” Dock์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘๊ฐ„์„ ๋ฐ์Šคํฌํƒ‘์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์Šคํฌํƒ‘์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.  ๋‹คํฌ ํ™”๋ฉด ๋ชจ๋“œ๋กœ ์„ค์ •๋œ Mac ๋ฐ์Šคํฌํƒ‘์— ์–ด๋‘์šด ์ƒ‰์ƒ์˜ ์•ฑ ์œˆ๋„์šฐ, Dock ๋ฐ ๋ฉ”๋‰ด ๋ง‰๋Œ€๊ฐ€ ํ‘œ์‹œ๋จ. ๋ฐ์Šคํฌํƒ‘ ์‚ฌ์ง„ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋‹ค๋ฅธ macOS ๋ฐ์Šคํฌํƒ‘ ์‚ฌ์ง„(๋‹ค์ด๋‚ด๋ฏน์˜ ๊ฒฝ์šฐ ํ•˜๋ฃจ ์ข…์ผ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ๋จ)์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž์˜ ์‚ฌ์ง„์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Mac์—์„œ ๋ฐฐ๊ฒฝํ™”๋ฉด ์‚ฌ์šฉ์žํ™”ํ•˜๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.  ๋ฐ์Šคํฌํƒ‘ ํ™”๋ฉด ๋ชจ๋“œ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋ฉ”๋‰ด ๋ง‰๋Œ€, ๋ฐ์Šคํฌํƒ‘ ์‚ฌ์ง„, Dock ๋ฐ ๋‚ด์žฅ ์•ฑ์— ๋Œ€ํ•ด ๋ผ์ดํŠธ ๋ชจ๋“œ ๋˜๋Š” ๋‹คํฌ ๋ชจ๋“œ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ดํŠธ ๋ชจ๋“œ ๋˜๋Š” ๋‹คํฌ ๋ชจ๋“œ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.  ๋ฐ์Šคํฌํƒ‘์—์„œ ์•Œ๋ฆผ ์‚ฌ์šฉํ•˜๊ธฐ ์•Œ๋ฆผ์€ ๋ฐ์Šคํฌํƒ‘์˜ ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์— ํ‘œ์‹œ๋˜๋ฉฐ ์˜ˆ์ •๋œ ์ด๋ฒคํŠธ, ์ˆ˜์‹  ์ด๋ฉ”์ผ ๋˜๋Š” ๋ฉ”์‹œ์ง€ ๋“ฑ์— ๋Œ€ํ•ด ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์•Œ๋ฆผ์—์„œ ๋ฐ”๋กœ ๋ฏธ๋ฆฌ ์•Œ๋ฆผ์„ ์š”์ฒญํ•˜๊ณ  ๋ฉ”์‹œ์ง€์— ๋‹ต์žฅํ•˜๋Š” ๋“ฑ์˜ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•Œ๋ฆผ์ด ํ‘œ์‹œ๋˜๋Š” ๋ฐฉ์‹๊ณผ ์‹œ๊ธฐ๋ฅผ ์‚ฌ์šฉ์žํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—…์— ์ง‘์ค‘ํ•ด์•ผ ํ•  ๋•Œ ์•Œ๋ฆผ์„ ์ผ์‹œ ์ •์ง€ํ•˜๋ ค๋ฉด ์ง‘์ค‘ ๋ชจ๋“œ๋ฅผ ์ผœ์‹ญ์‹œ์˜ค.  ๋ฐ์Šคํฌํƒ‘์˜ ํŒŒ์ผ ์ •๋ฆฌํ•˜๊ธฐ ๋ฐ์Šคํฌํƒ‘์—์„œ ํŒŒ์ผ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์Šคํƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์Šคํฌํƒ‘์˜ ํ•œ์ชฝ ๋ฉด์„ ๋”ฐ๋ผ ์œ ํ˜•๋ณ„ ๋˜๋Š” ๊ธฐํƒ€ ๊ธฐ์ค€๋ณ„๋กœ ํŒŒ์ผ์„ ๊น”๋”ํ•˜๊ฒŒ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์Šคํฌํƒ‘์— ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ํŒŒ์ผ์ด ์Šคํƒ์œผ๋กœ ์ž๋™ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์Šคํฌํƒ‘ ์Šคํƒ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.', metadata={'page': 1, 'source': '1.pdf'}),
  Document(page_content='๋Œ€๋กœ ํ‚ค๋ณด๋“œ ๋‹จ์ถ•ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.  ๋ฉ”๋‰ด ๋ง‰๋Œ€์—์„œ Siri๋ฅผ ํด๋ฆญํ•˜์‹ญ์‹œ์˜ค. ๋ณด์ด์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ œ์–ด ์„ผํ„ฐ ์„ค์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.  Touch Bar์—์„œ Siri๋ฅผ ํƒญํ•˜์‹ญ์‹œ์˜ค(Mac์— Touch Bar๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ).  โ€œSiri์•ผโ€ ๋˜๋Š” โ€œSiriโ€๋ผ๊ณ  ๋งํ•˜์‹ญ์‹œ์˜ค(์ด ์˜ต์…˜์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ  Siri ๋ฐ Spotlight ์„ค์ •์—์„œ ์ผœ์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ). โ€˜Siri์•ผโ€™ ๋˜๋Š” โ€˜Siriโ€™๊ฐ€ ์‚ฌ์šฉ์ž์˜ ๊ธฐ๊ธฐ ๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด Apple ์ง€์› ๋ฌธ์„œ ๋ชจ๋“  Apple ๊ธฐ๊ธฐ์—์„œ Siri ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.  โ€œ9์‹œ์— ๋ฏธํŒ… ์•ฝ์† ์žก์•„โ€ ๋˜๋Š” โ€œ์–ด์ œ ๊ฒฝ๊ธฐ ๊ฒฐ๊ณผ ์–ด๋• ์–ด?โ€์™€ ๊ฐ™์ด ์š”์ฒญํ•˜์‹ญ์‹œ์˜ค. Siri๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์ฐธ์กฐ.  ์œ„์น˜ ์„œ๋น„์Šค๊ฐ€ ์ผœ์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญ ์‹œ ๊ธฐ๊ธฐ์˜ ์œ„์น˜๋ฅผ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์€ ์‹œ์Šคํ…œ ์„ค์ •์—์„œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฑ์ด Mac์˜ ์œ„์น˜๋ฅผ ๊ฐ์ง€ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.  Siri ๋„๊ธฐ Mac์—์„œ Apple ๋ฉ”๋‰ด > ์‹œ์Šคํ…œ ์„ค์ •์„ ์„ ํƒํ•œ ๋‹ค์Œ, ์‚ฌ์ด๋“œ๋ฐ”์—์„œ Siri ๋ฐ Spotlight๋ฅผ ํด๋ฆญํ•˜์‹ญ์‹œ์˜ค. (์•„๋ž˜๋กœ ์Šคํฌ๋กคํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)  ์˜ค๋ฅธ์ชฝ์—์„œ, โ€˜Siri์—๊ฒŒ ์š”์ฒญํ•˜๊ธฐโ€™๋ฅผ ๋„์‹ญ์‹œ์˜ค.  ๊ฐ€์กฑ ๊ณต์œ  ๊ทธ๋ฃน์˜ ๊ฐ€์กฑ ๋Œ€ํ‘œ์ธ ๊ฒฝ์šฐ ์ž๋…€์— ๋Œ€ํ•ด ์Šคํฌ๋ฆฐ ํƒ€์ž„์„ ์„ค์ •ํ•˜์—ฌ Siri ๋ฐ ๋ฐ›์•„์“ฐ๊ธฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฐ ํƒ€์ž„์—์„œ ์•ฑ ์ œํ•œ ์„ค์ • ๋ณ€๊ฒฝํ•˜๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.  Mac์˜ ์•Œ๋ฆผ ์„ผํ„ฐ ์‚ฌ์šฉํ•˜๊ธฐ Mac์˜ ์•Œ๋ฆผ ์„ผํ„ฐ์—์„œ ๋†“์นœ ์•Œ๋ฆผ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , ์œ„์ ฏ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์Šคํฌํƒ‘์˜ ์˜ค๋ฅธ์ชฝ์—์„œ ์•ฝ์†, ์ƒ์ผ, ๋‚ ์”จ, ์ธ๊ธฐ ํ—ค๋“œ๋ผ์ธ ๋“ฑ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.  ์•Œ๋ฆผ ์„ผํ„ฐ์— ์•Œ๋ฆผ ๋ฐ ์œ„์ ฏ์ด ์žˆ์Œ. Mac์˜ ์•Œ๋ฆผ ์„ผํ„ฐ์—์„œ ์•Œ๋ฆผ ์—ด๊ธฐ ๋˜๋Š” ๋‹ซ๊ธฐ Mac์—์„œ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.  ์•Œ๋ฆผ ์„ผํ„ฐ ์—ด๊ธฐ: ๋ฉ”๋‰ด ๋ง‰๋Œ€์—์„œ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ํŠธ๋ž™ํŒจ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ๊ฐ€์žฅ์ž๋ฆฌ์—์„œ ๋‘ ์†๊ฐ€๋ฝ์„ ์‚ฌ์šฉํ•˜์—ฌ ์™ผ์ชฝ์œผ๋กœ ์“ธ์–ด๋„˜๊ธฐ์‹ญ์‹œ์˜ค.  ์•Œ๋ฆผ ์„ผํ„ฐ ๋‹ซ๊ธฐ: ๋ฐ์Šคํฌํƒ‘์—์„œ ์•„๋ฌด ๊ณณ์ด๋‚˜ ํด๋ฆญํ•˜๊ณ  ๋ฉ”๋‰ด ๋ง‰๋Œ€์—์„œ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜, ํŠธ๋ž™ํŒจ๋“œ์˜ ์˜ค๋ฅธ์ชฝ ๊ฐ€์žฅ์ž๋ฆฌ๋ฅผ ํ–ฅํ•ด ๋‘ ์†๊ฐ€๋ฝ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์“ธ์–ด๋„˜๊ธฐ์‹ญ์‹œ์˜ค.', metadata={'page': 1, 'source': '2.pdf'})]}

query์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์งˆ๋ฌธ, result ์—๋Š” ์ƒ์„ฑ๋œ ๋‹ต๋ณ€, source_documents๋Š” ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ์„ ํ™œ์šฉํ•ด์„œ ๋ฌธ์„œ์—์„œ ๊ฒ€์ƒ‰๋œ ๋ถ€๋ถ„๋“ค ์ž…๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ๋‹ต๋ณ€์„ ํ•œ๋ฒˆ ์‚ดํŽด๋ณผ๊นŒ์š”?

'์ œ์–ด ์„ผํ„ฐ๋Š” Mac์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ํ•ญ๋ชฉ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ์„ค์ •์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ œ์–ด ์„ผํ„ฐ์—๋Š” ํ•ญ์ƒ ํ‘œ์‹œ๋˜๋Š” ๋ชจ๋“ˆ๊ณผ ๋ฉ”๋‰ด ๋ง‰๋Œ€์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ์–ด ์„ผํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.'

๋‹จ ์ฝ”๋“œ ๋ช‡ ์ค„ ๋งŒ์œผ๋กœ๋„ ๋ฌธ์„œ ๊ธฐ๋ฐ˜์˜ QA๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
 
๋‹ค๋ฅธ ์งˆ๋ฌธ๋„ ํ•ด๋ด…๋‹ˆ๋‹ค.

์ž์—ฐ์Šค๋Ÿฌ์šด ๋‹ต๋ณ€์ด ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ž…๋ ฅํ•œ ๋ฌธ์„œ์™€ ๊ด€๊ณ„์—†๋Š” ์งˆ๋ฌธ์„ ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ ์˜ˆ์ œ์—์„œ๋Š” LangChain ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฑ—๋ด‡์„ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฒˆ ์˜ˆ์ œ์—์„œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ python ์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑํ•˜์—ฌ ํ„ฐ๋ฏธ๋„์—์„œ ์‹คํ–‰ํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 
๋ฌธ์„œ ๊ธฐ๋ฐ˜ ์ฑ—๋ด‡์„ ๋‹จ ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๋กœ๋งŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด์„œ LangChain์˜ ํŽธ๋ฆฌํ•จ์„ ๋Š๋‚„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์—๋Š” ์ž์—ฐ์–ด ์ฒ˜๋ฆฌ ๋ถ„์•ผ๋Š” ์ „๋ฌธ๊ฐ€๋“ค์˜ ์˜์—ญ์ด์—ˆ์ง€๋งŒ, ์ด์ œ๋Š” ๋‹ค์–‘ํ•œ ์‚ฌ๋žŒ๋“ค์ด ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŽธ๋ฆฌํ•œ ๋„๊ตฌ๋“ค์ด ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. LangChain์€ ์ด๋Ÿฌํ•œ ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜๋กœ, ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ API์™€ ์ž์„ธํ•œ ๋ฌธ์„œ๋ฅผ ํ†ตํ•ด ์‹ ์†ํ•˜๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ ๊ธฐ๋ฐ˜ ์ฑ—๋ด‡์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ LangChain์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ ๋ถ„๋ฅ˜, ๊ฐ์ • ๋ถ„์„, ์š”์•ฝ ๋“ฑ ๋‹ค์–‘ํ•œ ์ž์—ฐ์–ด ์ฒ˜๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐœ๋ฐœ์ž๋“ค์€ LangChain์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ ์ปค์Šคํ…€ ๋ชจ๋ธ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ํ›ˆ๋ จ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ž์‹ ๋งŒ์˜ ํŠนํ™”๋œ ์ž์—ฐ์–ด ์ฒ˜๋ฆฌ ์†”๋ฃจ์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
์˜ค๋Š˜ ์†Œ๊ฐœํ•œ ๋ถ€๋ถ„์€ LangChain์—์„œ๋„ ๊ทนํžˆ ์ผ๋ถ€๋ถ„์ด๊ณ , ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค๋“ค์ด ๋ฌด๊ถ๋ฌด์ง„ํ•ฉ๋‹ˆ๋‹ค. ๋จธ๋ฆฟ์†์—์„œ ๋งด๋Œ๊ณ  ์žˆ๋˜ ์•„์ด๋””์–ด๊ฐ€ ์žˆ๋‹ค๋ฉด LangChain์„ ํ™œ์šฉํ•˜์—ฌ ์‹คํ˜„ํ•ด๋ณด๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”?
 
OpenAI์˜ API์™€ LangChain์„ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์—์ด์ „ํŠธ๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฟก๋ถ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”
https://python.langchain.com/docs/expression_language/cookbook/
 
์ด๋ฒˆ ์˜ˆ์ œ์—์„œ ์‚ฌ์šฉํ•œ ์ „์ฒด์ฝ”๋“œ๋Š” ์•„๋ž˜ ๋งํฌ์—์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์œผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/jang-hs/PDF-RetrievalQA-Example