๐Ÿ“—
smiley book
  • Smiley Books
  • AI
    • Readme
    • openai-whisper
      • ์ƒ˜ํ”Œ ์‹คํ–‰ํ•ด๋ณด๊ธฐ
      • GPU ์„œ๋ฒ„ ์ค€๋น„ํ•˜๊ธฐ
      • API๋กœ whisper๋ฅผ ์™ธ๋ถ€์— ์˜คํ”ˆํ•˜๊ธฐ
      • ํ”„๋กฌํ”„ํŠธ ์ง€์›
      • ์‹ค์‹œ๊ฐ„ message chat
      • ํ™”๋ฉด ์ด์˜๊ฒŒ ๋งŒ๋“ค๊ธฐ์™€ ๋กœ๊ทธ์ธ
      • ํŒŒ์ด์ฌ ๊ฐ€์ƒํ™˜๊ฒฝ
      • ์‹ค์‹œ๊ฐ„ voice chat
      • fine tunning(๋ฏธ์„ธ ์กฐ์ •) ์œผ๋กœ ์„ฑ๋Šฅ ์˜ฌ๋ฆฌ๊ธฐ
      • app์—์„œ api๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ…์ŠคํŠธ๋กœ ๋ฐ”๊ฟ”๋ณด๊ธฐ
    • ollama - llm์„ ์‰ฝ๊ฒŒ ๋‚ด์ปด์—์„œ ์‹คํ–‰
      • ollama webui
      • ollama docker
    • stable diffusion
      • SDXL - text to image
      • SD-webui
    • ChatGPT
      • ๋‹ต๋ณ€์ด ๋Š๊ธธ๋•Œ
      • ์—ญํ• ์„ ์ •ํ•˜์ž
      • ๊ตฌ์ฒด์ ์ธ ์งˆ๋ฌธ
      • ๊ฒฐ๊ณผํ˜•ํƒœ๋ฅผ ์ง€์ •
      • ํ”„๋กฌํ”„ํŠธ๋ฅผ ์—ฌ๋Ÿฌ์ค„๋กœ ์‚ฌ์šฉํ•˜์ž.
      • ๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ ๊ธ€ ๋ฒˆ์—ญ๋ณธ
    • Prompt Engineering
    • Auto-GPT
    • Gemini
      • google ai studio
      • gemini-api
      • embedding guide
    • Huggingface
      • huggingface ์‚ฌ์šฉ๋ฒ•
      • huggingface nlp ๊ณต๋ถ€์ค‘
    • kaggle
      • download dataset
    • langchain
      • langchain์„ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌ
      • basic
      • slackbot
      • rag
      • document-loader
      • website-loader
      • confluence
      • memory
      • function-call
      • langsmith
      • agent-toolkit
  • Ansible
    • templates vs files and jinja2
    • dynamic inventory
    • limit ์˜ต์…˜ ๊ฐ•์ œํ•˜๊ธฐ
    • limit ์‚ฌ์šฉํ›„ gather_fact ๋ฌธ์ œ
  • AWS
    • AWS CLI
    • EKS
      • cluster manage
      • ALB Controller
      • external-dns
      • fargate
    • ECR
    • S3
    • Certificate Manager
  • Azure
    • Azure AD OAuth Client Flow
  • Container
    • Registry
    • ๋นŒ๋“œ์‹œ์— env๊ฐ’ ์„ค์ •ํ•˜๊ธฐ
  • DB
    • PXC
      • Operator
      • PMM
      • ์‚ญ์ œ
      • GTID
      • Cross Site Replication
    • Mssql
    • Mysql
  • dotnet
    • Thread Pool
    • Connection Pool
    • Thread Pool2
  • Devops
    • Recommendation
  • GIT
    • Basic
    • Submodule
  • GitHub
    • Repository
    • GitHub Action
    • GitHub PR
    • Self Hosted Runner
    • GitHub Webhook
  • GitLab
    • CI/CD
    • CI/CD Advance
    • Ssl renew
    • CI/CD Pass env to other job
  • Go Lang
    • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ•
    • multi os binary build
    • kubectl๊ฐ™์€ cli๋งŒ๋“ค๊ธฐ
    • azure ad cli
    • embed static file
    • go study
      • pointer
      • module and package
      • string
      • struct
      • goroutine
  • Kubernetes
    • Kubernetes๋Š” ๋ฌด์—‡์ธ๊ฐ€
    • Tools
    • Install with kubespray
    • Kubernetes hardening guidance
    • 11 ways not to get hacked
    • ArgoCD
      • Install
      • CLI
      • Repository
      • Apps
      • AWS ALB ์‚ฌ์šฉ
      • Notification slack
      • Backup / DR
      • Ingress
      • 2021-11-16 Github error
      • Server Config
      • auth0 ์ธ์ฆ ์ถ”๊ฐ€(oauth,OIDC)
    • Extension
      • Longhorn pvc
      • External dns
      • Ingress nginx
      • Cert Manager
      • Kube prometheus
    • Helm
      • Subchart
      • Tip
    • Loki
    • Persistent Volume
    • TIP
      • Job
      • Pod
      • Log
  • KAFKA
    • raft
  • KVM
    • kvm cpu model
  • Linux
    • DNS Bind9
      • Cert-Manager
      • Certbot
      • Dynamic Update
      • Log
    • Export and variable
    • Grep ์‚ฌ์šฉ๋ฒ•
  • Modeling
    • C4 model introduce
    • Mermaid
    • reference
  • Monitoring
    • Readme
    • 0. What is Monitoring
    • 1. install prometheus and grafana
    • 2. grafana provisioning
    • 3. grafana dashboard
    • 4. grafana portable dashboard
    • 5. prometheus ui
    • 6. prometheus oauth2
    • Prometheus
      • Metric type
      • basic
      • rate vs irate
      • k8s-prometheus
    • Grafana
      • Expolorer
    • Node Exporter
      • advance
      • textfile collector
  • Motivation
    • 3 Simple Rule
  • OPENNEBULA
    • Install(ansible)
    • Install
    • Tip
    • Windows vm
  • Reading
    • comfort zone
    • ๋ฐฐ๋ ค
    • elon musk 6 rule for insane productivity
    • Feynman Technique
    • how to interview - elon musk
    • ๊ฒฝ์ฒญ
    • Readme
  • Redis
    • Install
    • Master-slave Architecture
    • Sentinel
    • Redis Cluster
    • Client programming c#
  • SEO
    • Readme
  • Security
    • criminalip.io
      • criminalip.io
  • Stock
    • robinhood-python
  • Terraform
    • moved block
    • output
  • vault
    • Readme
  • VS Code
    • dev container
    • dev container on remote server
  • Old fashione trend
    • curity
    • MAAS
      • Install maas
      • Manage maas
      • Tip
Powered by GitBook
On this page
  • ๊ฐœ์š”
  • ์ „์ฒ˜๋ฆฌ
  • ์„œ๋น„์Šค
  • ์ •๋ฆฌ
  • Document Loader
  • Document Splitter
  • Embedding ํ•˜๊ธฐ
  • Embedding์„ ๋””๋น„(FAISS) ์— ๋„ฃ๊ธฐ
  • Embedding cache
  • ๊ฒ€์ƒ‰๋œ ๊ฒฐ๊ณผ๋ฅผ prompt์— ๋„ฃ๊ณ  llm์— ๋ณด๋‚ด๊ธฐ
  • DocumentsChain (๋ฌธ์„œ๋ฅผ vector์—์„œ ๊ฐ€์ ธ์™€์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹)
  • ๊ทธ๋ฆผ์œผ๋กœ ์„ค๋ช…
  • stuff ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ฌธ์„œ๋ฅผ prompt์— ๋„ฃ์–ด์„œ ๋ณด๋‚ด์ž.
  • map reduce
  • Refine

Was this helpful?

  1. AI
  2. langchain

rag

PreviousslackbotNextdocument-loader

Last updated 11 months ago

Was this helpful?

๊ฐœ์š”

  1. ์ „์ฒ˜๋ฆฌ

  2. ์„œ๋น„์Šค

๋‘๊ฐœ์˜ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ ์ง„๋‹ค.

์ „์ฒ˜๋ฆฌ

์ „์ฒ˜๋ฆฌ๋ฅผ ํ•ด์„œ ๊ฐ€์ง€๊ณ ์ž‡๋Š” ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ embedํ•ด์„œ ๋””๋น„์— ๋„ฃ์–ด๋‘”๋‹ค.

์„œ๋น„์Šค

์ •๋ฆฌ

Document Loader

https://python.langchain.com/v0.2/docs/integrations/document_loaders/

๋งŽ์€๊ฒƒ์ค‘์— ์•Œ์•„์„œ ๊ณจ๋ผ์“ฐ๋ฉด ๋œ๋‹ค.

https://python.langchain.com/v0.2/docs/integrations/document_loaders/unstructured_file/

์ผ๋‹จ ๋‚œ ์ด๊ฑธ๋กœ ์„ ํƒ

%pip install  --user -Uq  unstructured
from dotenv import load_dotenv
load_dotenv()

from langchain_openai import ChatOpenAI
from langchain_community.document_loaders import UnstructuredMarkdownLoader


loader = UnstructuredMarkdownLoader("files/kubernetes_hardening_guidance.md")

docs = loader.load()
docs
len(docs)

Document Splitter

๋„ํ๋จผํŠธ 1๊ฐœ๋กœ ๋กœ๋“œ๊ฐ€ ๋œ๋‹ค. ์ด ๋ฌธ์„œ๋ฅผ ๋‹ค llm์œผ๋กœ ๋ณด๋‚ด๋„ ๋˜๋‚˜ ๋น„์šฉ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  llm์—์„œ ์ตœ๋Œ€ ํฌ๊ธฐ๊ฐ€ ์ž‡์–ด์„œ ์ „๋ถ€๋‹ค ํ•œ๊บผ๋ฒˆ์— ๋ณด๋‚ด์ง€ ๋ชปํ•œ๋‹ค.

ํ•„์š”์—†๋Š”๋ถ€๋ถ„๊นŒ์ง€ ๋ณด๋‚ด์„œ ๋น„์šฉ์„ ๋‚ด๋Š”๊ฒƒ๋ณด๋‹ค ์งค๋ผ์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋ณด๋‚ด๋ฉด ๋” ์ข‹์„๊ฑฐ๊ฐ™๋‹ค.

from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter()

docs = loader.load_and_split(text_splitter=splitter)
docs

len(docs)

14๊ฐœ๋กœ ์งค๋ผ์ง„๊ฑธ ๋ณผ์ˆ˜ ์žˆ๋‹ค.

๋” ๋งŽ์ด ์ž˜๋ผ๋ณด์ž.

from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=200
)

docs = loader.load_and_split(text_splitter=splitter)
docs

len(docs)

14๊ฐœ๊ฐ€ 2482๋กœ ๋Š˜์–ด๋‚ฌ๋‹ค. ๊ทผ๋ฐ ๋ฌธ์žฅ์ด ์งค๋ฆผ.. llm์ด ์ดํ•ด๋ฅผ ๋ชปํ•จ.

overlap์„ ์‚ฌ์šฉํ•˜์ž.

from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=200,
    chunk_overlap=50,
    separators=["\n", "\r\n"],
    length_function=len,
)

docs = loader.load_and_split(text_splitter=splitter)
docs
len(docs)

openai๋Š” length๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  token์„ ์‚ฌ์šฉํ•œ๋‹ค.

https://platform.openai.com/tokenizer

ํ† ํฐ๊ณผ character๊ฐ€ ๋‹ค๋ฅธ๊ฑธ ์•Œ์ˆ˜์žˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ฌธ์„œ๋ฅผ token๋‹จ์œ„๋กœ ์ดํ•ดํ•ด์•ผํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

๋งํฌ์—์„œ tikoken ํŒจํ‚ค์ง€๋ฅผ ์ถ”์ฒœํ•œ๋‹ค.

https://github.com/openai/tiktoken

์‚ฌ์šฉํ•˜์ž.

%pip install  --user -Uq  tiktoken
from langchain.text_splitter import CharacterTextSplitter

splitter = CharacterTextSplitter.from_tiktoken_encoder(
    chunk_size=200,
    chunk_overlap=50,
    separator="\n",
)

docs = loader.load_and_split(text_splitter=splitter)
len(docs)

๋ฌธ์„œ๊ฐ€ ์ž˜ ๋‚˜๋ˆ ์กŒ๋‹ค. ์ด์ œ ์ž„๋ฒ ๋”ฉ์„ ํ•ด์„œ ๋””๋น„์— ๋„ฃ์–ด๋ณด์ž.

Embedding ํ•˜๊ธฐ

๋ฌธ์„œ๋ฅผ ์ˆซ์ž๋กœ ๋ฐ”๊ฟ”์„œ ๋””๋น„์— ๋„ฃ์„์ค€๋น„๋ฅผ ํ•˜๋Š”๊ฒƒ์ž„ ์ด ์ˆซ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์œ ์‚ฌ๋„๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค.

์ฃผ์˜์‚ฌํ•ญ์€ ์ž„๋ฒ ๋”ฉ ๋ฐฉ์‹์„ ์ง€๊ธˆ ๊ฒฐ์ •ํ•˜๋ฉด ๋‚˜์ค‘์— query๋ฅผ ํ• ๋•Œ๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ•ด์•ผํ•œ๋‹ค.

openai embeding์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.๋‹ค๋ฅธ๊ฒƒ๋“ค๋„ ์žˆ์œผ๋‹ˆ ์ฐพ์•„์„œ ๋ณด์‹œ์š”

https://github.com/turbomaze/word2vecjson ์„ ์ฐธ๊ณ ํ•˜์‹œ์š”

๋‚œ ์ผ๋‹จ ๋ชฐ๋ผ๋„ ๋˜๋Š”๊ฑฐ๊ฐ™์•„์„œ ๋ฐ”๋กœ ์ฝ”๋“œ๋กœ ์ง„ํ–‰

https://python.langchain.com/v0.2/docs/integrations/text_embedding/openai/

OpenAI Embedding์„ ์‚ฌ์šฉํ•˜์ž.

from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
text = "This is a test document."
vector = embeddings.embed_query(text)
vector
len(vector)
doc_result = embeddings.embed_documents([text])
doc_result[0][:5]
print(len(doc_result))
len(doc_result[0])
embeddings = OpenAIEmbeddings(
    model="text-embedding-3-large", dimensions=1024)
len(embeddings.embed_documents([text])[0])

Embedding์„ ๋””๋น„(FAISS) ์— ๋„ฃ๊ธฐ

์ž„๋ฒ ๋”ฉ์„ ํ•ด์„œ FAISS ์— ์ž…๋ ฅํ•˜๊ธฐ

%pip install  --user -Uq faiss-cpu
# %pip install  --user -Uq faiss-gpu
from langchain_openai import OpenAIEmbeddings
from langchain.document_loaders import UnstructuredFileLoader
from langchain.text_splitter import CharacterTextSplitter

from langchain.storage import LocalFileStore
from langchain_community.document_loaders import UnstructuredMarkdownLoader

splitter = CharacterTextSplitter.from_tiktoken_encoder(
    separator="\n",
    chunk_size=600,
    chunk_overlap=100,
)
loader = UnstructuredMarkdownLoader("files/kubernetes_hardening_guidance.md")

docs = loader.load_and_split(text_splitter=splitter)
from langchain.vectorstores import FAISS

embeddings = OpenAIEmbeddings()

# ์ž„๋ฒ ๋”ฉ์„ ํ•ด์„œ ๋””๋น„์— ๋„ฃ๋Š”๋‹ค.
vectorstore = FAISS.from_documents(docs, embeddings)

results = vectorstore.similarity_search("๋ˆ„๊ตฌ์—๊ฒŒ ์ด ๊ฐ€์ด๋“œ๋ฅผ ์ถ”์ฒœํ•˜๋Š”๊ฐ€?")

results

์œ ์‚ฌ๋„ ๊ฒ€์‚ฌ๋ฅผ ํ•ด์„œ ๋ฌธ์žฅ์„ ์ž˜ ์ฐพ์•„์˜จ๋‹ค. ์ด๊ฑธ ํ”„๋กฌํ”„ํŠธ๋กœ llm์— ๋ณด๋‚ด๋ฉด ๋œ๋‹ค.

๋ณดํ†ต 3๊ฐœ๋‚˜ 5๊ฐœ๊ฐ€ ์ข‹๋‹ค๊ณ ํ•œ๋‹ค.

Embedding cache

ํ• ๋•Œ๋งˆ๋‹ค ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.

๋””๋น„์— ์ž…๋ ฅํ•œ ๊ฒƒ์€ ๋กœ์ปฌ ๋“œ๋ผ์ด๋ธŒ์— cache๋ฅผ ํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด openai์— ๋‹ค์‹œ ์š”์ฒญํ•˜์ง€ ์•Š์•„์„œ ์š”๊ธˆ์ด ์ค„์–ด๋“ ๋‹ค.

# caching
from langchain.embeddings import CacheBackedEmbeddings

embeddings = OpenAIEmbeddings()

cache_dir = LocalFileStore("./cache/")

cached_embeddings = CacheBackedEmbeddings.from_bytes_store(embeddings, cache_dir)

# vectorstore = FAISS.from_documents(docs, embeddings)
vectorstore = FAISS.from_documents(docs, cached_embeddings)
# ๊ฒ€์ƒ‰
results = vectorstore.similarity_search("๋ˆ„๊ตฌ์—๊ฒŒ ์ด ๊ฐ€์ด๋“œ๋ฅผ ์ถ”์ฒœํ•˜๋Š”๊ฐ€?")

results

์ด์ œ ์ด ๊ฒฐ๊ณผ๋ฅผ llm์— ๋ณด๋‚ผ๊ฐ€?

๊ฒ€์ƒ‰๋œ ๊ฒฐ๊ณผ๋ฅผ prompt์— ๋„ฃ๊ณ  llm์— ๋ณด๋‚ด๊ธฐ

from langchain.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

retriver = vectorstore.as_retriever()

prompt = ChatPromptTemplate.from_messages(
    [
        ("system",
         """
         You are a helpful AI talking to a human, Answer questions using only the following context.
         If you don't know the answer just say you don't know, don't make it up:
         {context}
         """),
        ("human", "{question}"),
    ]
)

llm = ChatOpenAI(temperature=0.1)

from langchain.schema.runnable import RunnablePassthrough

chain = ({
          "context": retriver,
          "question": RunnablePassthrough(),
        }
        | prompt | llm
)

chain.invoke("๋ˆ„๊ตฌ์—๊ฒŒ ์ด ๊ฐ€์ด๋“œ๋ฅผ ์ถ”์ฒœํ•˜๋Š”๊ฐ€?")

DocumentsChain (๋ฌธ์„œ๋ฅผ vector์—์„œ ๊ฐ€์ ธ์™€์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹)

  1. stuff - vector ๊ฒ€์ƒ‰์— ๊ฑธ๋ฆฐ ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ prompt์— ๋„ฃ์–ด์„œ ๋ณด๋‚ธ๋‹ค.

  2. map reduce

  3. refine

๊ทธ๋ฆผ์œผ๋กœ ์„ค๋ช…

  1. stuff

  1. map reduce

  1. refine

stuff ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ฌธ์„œ๋ฅผ prompt์— ๋„ฃ์–ด์„œ ๋ณด๋‚ด์ž.

stuff๋ผ๊ณ  ๋ถ€๋ฅด๋˜๋ฐ .

์ด๊ฑด ์œ„ ์ƒ˜ํ”Œ์—์„œ ์ฒ˜๋ฆฌํ–ˆ๋‹ค. https://python.langchain.com/v0.2/docs/tutorials/summarization/#stuff

๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ๋‹จ์ผ ํ”„๋กฌํ”„ํŠธ์— "์ฑ„์šฐ๊ธฐ"๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค

We can use chain_type="stuff", especially if using larger context window models such as:

128k token OpenAI gpt-4-turbo-2024-04-09 200k token Anthropic claude-3-sonnet-20240229

beautifulsoup4 ํŒจํ‚ค์ง€๋กœ ์›น์„ ํฌ๋กค๋ง ํ•ด์˜ค๊ณ  ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ llm์— ๊ฐ™์ด ๋„ฃ์–ด์„œ ์š”์•ฝ์„ ๋ฐ›์ž.

ํŒŒ์ผ์ด ํฌ๋‹ˆ๊นŒ. ํฐ๋ชจ๋ธ๋กœ ํ•˜์ž.

map reduce

"๋งต" ๋‹จ๊ณ„์—์„œ ๊ฐ ๋ฌธ์„œ๋ฅผ ์ž์ฒด์ ์œผ๋กœ ์š”์•ฝํ•œ ๋‹ค์Œ ์š”์•ฝ์„ ์ตœ์ข… ์š”์•ฝ์œผ๋กœ "์ถ•์†Œ"ํ•ฉ๋‹ˆ๋‹ค

https://python.langchain.com/v0.2/docs/tutorials/summarization/#map-reduce

from langchain_openai import OpenAIEmbeddings
from langchain.embeddings import CacheBackedEmbeddings
from langchain.vectorstores import FAISS

embeddings = OpenAIEmbeddings()

cached_embeddings = CacheBackedEmbeddings.from_bytes_store(
    embeddings, cache_dir)

vectorstore = FAISS.from_documents(docs, cached_embeddings)

retriever = vectorstore.as_retriever()

vector store์—์„œ ๊ฒ€์ƒ‰์„ ํ•˜๋„๋ก ์ฒด์ธ์„ ๊ตฌ์„ฑ

from langchain.prompts import ChatPromptTemplate
from langchain.schema.runnable import RunnablePassthrough, RunnableLambda

map_doc_prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            """
            Use the following portion of a long document to see if any of the text is relevant to answer the question. Return any relevant text verbatim. If there is no relevant text, return : ''
            -------
            {context}
            """,
        ),
        ("human", "{question}"),
    ]
)

map_doc_chain = map_doc_prompt | llm

def map_docs(inputs):
    documents = inputs["documents"]
    question = inputs["question"]
    return "\n\n".join(
        map_doc_chain.invoke(
            {"context": doc.page_content, "question": question}
        ).content
        for doc in documents
    )


map_chain = {
    "documents": retriever,
    "question": RunnablePassthrough(),
} | RunnableLambda(map_docs)

๊ฒฐ๊ณผ ๋‚˜์˜จ ๋‚ด์šฉ์„ ๋‹ค์‹œ ๋งˆ์ง€๋ง‰ prompt์— ๋„ฃ์–ด์„œ ์ตœ์ข… ์ฟผ๋ฆฌ llm์— ๋ณด๋‚ด๊ธฐ

final_prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            """
            Given the following extracted parts of a long document and a question, create a final answer.
            If you don't know the answer, just say that you don't know. Don't try to make up an answer.
            ------
            {context}
            """,
        ),
        ("human", "{question}"),
    ]
)

chain = {"context": map_chain, "question": RunnablePassthrough()
         } | final_prompt | llm

์š”์ฒญํ•ด๋ณด๊ธฐ


chain.invoke("์š”์•ฝํ•ด์ค˜")

Refine

์ด๊ฑด ์ง์ ‘ ํ•ด๋ณด์‹œ์š”

๋ฌธ์„œ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์š”์•ฝํ•˜๋Š”๋ฐ ๊ธฐ์กด์— ์š”์•ฝ๋œ ๊ฒƒ๊ณผ ํ•จ๊ป˜ ๋‹ค์‹œ ์š”์•ฝ์„ ํ•˜๋Š” ๋ฐฉ์‹ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

alt text
alt text
alt text