Data connection은 LLM과 외부의 데이터를 연결하기 위한 기능이다.
RAG (Retrieval Argumented Generation)
GPT가 미처 학습하지 못한 정보( 가령, 최근에 발생한 이벤트나 사내 정보 등 )를 사용하게 싶은 경우가 있다. 이 경우, 프롬프트에 컨텍스트(context)를 넣은 방법을 떠올릴 수 있다.
# 프롬프트
문맥을 고려하여 한 문장으로 질문에 답해 주세요.
문맥: """
<A회사의 사내 복지 정책>
"""
질문: A회사에서 야근하면, 받을 수 있는 수당은 얼마인가요?
물론 LLM은 토큰 수 제한이 있기에, 모든 데이터를 컨텍스트로 담을 수는 없다. 그래서 "관련이 있는 데이터"만 컨텍스트로 담는 과정이 필요하고, 이를 위한 기법이 바로 RAG (Retrieval Argumented Generation)이다. 이것의 한 예시로, 문서를 OpenAI의 Embeddings API 등으로 벡터화해 입력과 벡터가 가장 가까운 문서를 검색하여 컨텍스트에 포함시키는 것이 있다.
랭체인의 Data Connection에서는 특히 벡터 스토어(Vector Store)를 사용하여 문서를 벡터화하여 저장해두었다가, 입력된 테그슽와 벡터에 가까운 문서를 검색하여 컨텍스트에 포함시켜 사용하는 방법을 제공한다.
텍스트 벡터화란?
텍스트를 숫자 배열로 변환하는 것을 의미한다. 일반적으로 등장하는 키워드나 의미가 가까운 텍스트가 벡토로도 거리가 가까워지도록 변환한다.
Data connection
Data Connection에는 아래와 같은 기능들이 있다.
1. Document loaders: 데이터 소스로부터 문서를 불러온다.
2. Document transformers: 문서에 어떤 종류의 변환을 가한다.
3. Text embedding models: 문서를 벡터화한다.
4. Vector stores: 벡터화된 문서를 저장할 수 있는 저장소다.
5. Retrievers: 입력된 텍스트와 관련된 문서를 검색한다.

Document loaders
데이터 로딩이 필요한 것이 Document loader이다. Langchain은 다양한 Document loader들을 제공한다. [참고]
개인적으로 Cofluence, Notion, Slack, S3 등 정말 다양한 저장소에 대해 Loader가 지원된다는 점이 매력적인 듯 싶다.
How-to guides | 🦜️🔗 LangChain
Here you’ll find answers to “How do I….?” types of questions.
python.langchain.com
예를 들어, GitLoader를 통해 깃허브 내 .mdx 확장자를 가진 파일을 로드할 때는 아래와 같이 구현해볼 수 있다.
from langchain.document_loaders import GitLoader
def file_filter(file_path):
return file_path.endswith(".mdx")
loader = GitLoader(
clone_url="https://github.com/langchain-ai/langchain",
repo_path="./langchain",
branch="master",
file_filter=file_filter,
)
raw_docs = loader.load()
Document transformers
불러온 문서에 어떤 변환을 가하는 경우가 많다. 이 역할은 Document transformer가 수행한다.
예를 들어, 문서를 일정 길이의 청크로 분할하고 싶을 수 있다. 문서를 적절히 분할하여 저장해두면, LLM에 입력하는 토큰 수를 줄이고 더 정확한 답변을 얻을 수 있기 때문이다. 랭체인의 CharacterTextSplitter 클래스를 사용하면, 이를 손쉽게 수행할 수 있다.
from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(raw_docs)
이외에도 랭체인은 다양한 Document transformer를 지원한다. [참고]
개인적으로 기억에 남는 건, 유사한 문서 제외(EmbeddingRedundantFilter)였다.
Document transformers | 🦜️🔗 LangChain
📄️ OpenAI metadata tagger It can often be useful to tag ingested documents with structured metadata, such as the title, tone, or length of a document, to allow for a more targeted similarity search later. However, for large numbers of documents, perfo
python.langchain.com
Text embedding models
문서 변환이 끝났다면, 텍스트를 벡터화할 차례이다. 사실, 문서의 벡터화 처리는 다음에 나올 Vector store 클래스에 데이터를 저장할 때 내부적으로 수행된다. 하지만 이를 가시적으로 확인해보고 싶다면, OpenAiEmbeddings 라는 클래스를 사용해 벡터화를 진행해볼 수 있다.
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
query = "AWS의 S3에서 데이터를 읽기 위한 DocumentLoader가 있나요?"
vector = embeddings.embed_query(query)
print(vector)
# 결과
# [-0.015598894545180425, -0.01281194535456013, ...,0.020851993287593514]
# 텍스트가 1536차원의 벡터로 변환된다.
Vector stores
다음은 문서를 벡터화하여 저장하는 단계이다. 여기서는 크로마(Chroma)라는 로컬에서 사용가능한 벡터 스토어를 사용했지만, 이외에도 Faiss, Elasticsearch, Redis 등 모두를 벡터 스토어로 활용할 수 있다.
from langchain.vectorstores import Chroma
db = Chroma.from_documents(docs, embeddings)
Retrievers
Retrievers는 벡터 스토어에서 사용자의 입력과 관련된 문서를 가져오는 역할을 수행한다. 특히 랭체인에서는 텍스트와 관련된 문서를 가져오는 인터페이스를 'Retriever'라고 한다.
아래 예시를 살펴보면, Retriever가 정상적으로 S3를 대상으로 하는 DoucmentLoader에 대한 내용을 가져온 것을 볼 수 있다.
retriever = db.as_retriever()
query = "AWS S3에서 데이터를 불러올 수 있는 DocumentLoader가 있나요?"
context_docs = retriever.get_relevant_documents(query)
first_doc = context_docs[0]
print(first_doc.page_content)
# 출력 결과
"""
See a [usage example](/docs/integrations/text_embedding/sagemaker-endpoint).
```python
from langchain_community.embeddings import SagemakerEndpointEmbeddings
from langchain_community.llms.sagemaker_endpoint import ContentHandlerBase
```
## Document loaders
### AWS S3 Directory and File
>[Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-folders.html)
> is an object storage service.
>[AWS S3 Directory](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-folders.html)
>[AWS S3 Buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucket.html)
See a [usage example for S3DirectoryLoader](/docs/integrations/document_loaders/aws_s3_directory).
See a [usage example for S3FileLoader](/docs/integrations/document_loaders/aws_s3_file).
```python
from langchain_community.document_loaders import S3DirectoryLoader, S3FileLoader
```
### Amazon Textract
"""
RetrievalQA (Chain)
실제 애플리케이션에서는 입력과 관련된 문서를 검색하는 것 외에도 검색한 내용을 PromptTemplate에 컨텍스트로 삽입하여 LLM에게 질문하고 답변(QA)을 요청하는 경우가 있다. 이 일련의 처리를 위해 RetrievalQA라는 이름의 Chain이 제공된다.
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
qa_chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever)
qa_chain.invoke(query)
# 실제로 qa_chain에서 생성된 프롬프트는 아래와 같다.
"""
"prompts": [
"System: Use the following pieces of context to answer the user's question. \nIf you don't know the answer, just say that you don't know, don't try to make up an answer.\n----------------\nSee a [usage example](/docs/integrations/text_embedding/sagemaker-endpoint).\n```python\nfrom langchain_community.embeddings import SagemakerEndpointEmbeddings\nfrom langchain_community.llms.sagemaker_endpoint import ContentHandlerBase\n```\n\n## Document loaders\n\n### AWS S3 Directory and File\n\n>[Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-folders.html)\n> is an object storage service.\n>[AWS S3 Directory](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-folders.html)\n>[AWS S3 Buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucket.html)\n\nSee a [usage example for S3DirectoryLoader](/docs/integrations/document_loaders/aws_s3_directory).\n\nSee a [usage example for S3FileLoader](/docs/integrations/document_loaders/aws_s3_file).\n\n```python\nfrom langchain_community.document_loaders import S3DirectoryLoader, S3FileLoader\n```\n\n### Amazon Textract\n\nfrom langchain_community.document_loaders import AzureAIDocumentIntelligenceLoader\n\nfile_path = \"<filepath>\"\nendpoint = \"<endpoint>\"\nkey = \"<key>\"\nloader = AzureAIDocumentIntelligenceLoader(\n api_endpoint=endpoint, api_key=key, file_path=file_path, api_model=\"prebuilt-layout\"\n)\n\ndocuments = loader.load()\n```\n\nfrom langchain_community.document_loaders import AzureAIDocumentIntelligenceLoader\n\nfile_path = \"<filepath>\"\nendpoint = \"<endpoint>\"\nkey = \"<key>\"\nloader = AzureAIDocumentIntelligenceLoader(\n api_endpoint=endpoint, api_key=key, file_path=file_path, api_model=\"prebuilt-layout\"\n)\n\ndocuments = loader.load()\n```\n\n```python\nfrom langchain_community.chat_models import ChatHunyuan\n```\n\n\n## Document Loaders\n\n### Tencent COS\n\n>[Tencent Cloud Object Storage (COS)](https://www.tencentcloud.com/products/cos) is a distributed \n> storage service that enables you to store any amount of data from anywhere via HTTP/HTTPS protocols. \n> `COS` has no restrictions on data structure or format. It also has no bucket size limit and \n> partition management, making it suitable for virtually any use case, such as data delivery, \n> data processing, and data lakes. COS provides a web-based console, multi-language SDKs and APIs, \n> command line tool, and graphical tools. It works well with Amazon S3 APIs, allowing you to quickly \n> access community tools and plugins.\n\nInstall the Python SDK:\n\n```bash\npip install cos-python-sdk-v5\n```\n\n#### Tencent COS Directory\n\nFor more information, see [this notebook](/docs/integrations/document_loaders/tencent_cos_directory)\nHuman: AWS S3에서 데이터를 불러올 수 있는 DocumentLoader가 있나요?"
]
"""
chain_type의 종류
- stuff: 입력과 관련된 여러 문서를 동시에 프롬프트에 포함시켜 답변을 얻는 방식
- map_reduce: 각 문서에 대한 답변을 얻고(map), 이후 최종 답변을 얻는 흐름(reduce)
- map_rerank: 각 문서에 대한 답변을 얻는 동시에 LLM이 답변에 점수를 매기고, 가장 점수가 높은 답변이 최종 답변이 되는 방식
- refine: LLM에 문서를 하나씩 주면서 점진적으로 답변을 만들고, 다듬어 나가는 흐름
'Programming > Langchain' 카테고리의 다른 글
LCEL 에 관하여 (3) | 2024.12.05 |
---|---|
랭체인 에이전트 (1) | 2024.10.31 |
랭체인 기초 (1) | 2024.09.19 |