본문 바로가기
IT/aws

AWS에서 RAG 구축 및 예제

by 가능성1g 2025. 4. 18.
반응형

AWS 로그인 후, Aurora and RDS 메뉴 선택

데이터 베이스 > 데이터베이스 생성

 

아래를 참조해서 생성합니다!

 

표준생성

Aurora ( PostgreSQL Compatible )

템플릿 > 개발/테스트

dbcluster 식별자 -> 적당한 이름 ex) pgvector

자격증명관리 > 자체관리

암호 입력

용량범위 적당히 입력 ( 1, 4 충분 )

VPC 보안그룹 새로 생성

이름 입력 ex ) pgvector-sg

Enhanced 모니터링 활성화 <- 꺼야지 생성이 저는 되네요.. ( 무료티어의 한계인가.. )

 

데이터 베이스 생성! 버튼을 누르면 조금 후에 완료가 됩니다. 

완료 이후, 다시 조회를 해서 엔드포인트를 메모해 둡니다.

 

 

이제 파이썬 필요 패키지를 설치하고,

pip install langchain-aws langchain langchain-community bs4

 

아래 소스로 테스트 합니다.

테스트 전에 AI 모델 을 사용허가 받아야 합니다. 

소스내에서는 sonnet3.5, 와 titan-embed 모델을 사용합니다.

 

from langchain_aws import ChatBedrockConverse
from langchain_aws import BedrockEmbeddings
from langchain.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import PGVector

llm = ChatBedrockConverse(model="anthropic.claude-3-5-sonnet-20240620-v1:0")
embeddings = BedrockEmbeddings(model_id="amazon.titan-embed-text-v2:0")
loader = WebBaseLoader("https://docs.aws.amazon.com/ko_kr/bedrock/latest/userguide/titan-embedding-models.html")
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
connection = "postgresql+psycopg2://{db사용자}:{db암호}@{db엔드포인트}:{db포트}/{db명}"
collection_name = "aws_vector"

vectordb = PGVector.from_documents (
    documents=splits,
    embedding=embeddings,
    connection_string=connection,
    collection_name=collection_name,
    use_jsonb=True,
)

prompt_template = """
    마지막에 질문에 대한 간결한 답변을 제공하기 위해 다음 문맥을 활용하세요.
    답을 모른다면 답을 지어내려고 하지 말고 모른다고 하세요.

    <context>
    {context}
    </context>

    Question: {question}
"""

prompt = PromptTemplate(template=prompt_template, input_variables=["context", "question"])

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

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

answer=rag_chain.invoke("Titan Embedding V2는 몇차원인가요?")
print(answer)

 

결과:

Titan Embedding V2의 출력 벡터 크기는 기본값으로 1,024 차원입니다. 그러나 512와 256 차원 옵션도 제공됩니다.

 

참고의 웹페이지를 rag정보로 만들고, 이를 잘 조회해서 답변을 잘합니다.

 

RAG를 쓰지 않은 예제

from langchain_aws import ChatBedrockConverse

llm = ChatBedrockConverse(model="anthropic.claude-3-5-sonnet-20240620-v1:0")
response = llm.invoke("Titan Embedding V2는 몇 차원인가요?")
print(response.content)

 

결과:

Titan Embedding V2는 3072차원입니다.

 

거짓말을 합니다 -ㅅ-;

반응형