langchain / / 2024. 6. 27. 06:54

[langchain] 셀프 쿼리 검색기 (Self-querying)

SelfQueryRetriever는 이름에서 알 수 있듯이 자체적으로 질문을 할 능력이 있다. 특히, 자연어 검색어가 있다면, Retriever는 구조화된 쿼리를 작성하기 위해 쿼리를 작성하는 LLM 체인을 사용하고 Vector Store를 검색할 때 적용한다. 저장된 문서를 검색할 때 유사도 검색 뿐만 아니라 사용자 쿼리에서 저장된 문서 metadata에 대한 필터를 수행한다.

SelfQueryRetriever를 사용하기 위해서는 lark 패키지를 설치해야 한다.
pipenv install lark

SelfQueryRetriever 임베딩

아래는 jira issue에 대한 샘플데이터를 추가하였다. 그리고 project_name, issue_type, priority, assignee, job_days 5개의 metadata를 Chroma DB에 넣었다.

from dotenv import load_dotenv
from langchain_community.vectorstores import Chroma
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings

load_dotenv()

docs = [
    Document(
        page_content='사용자가 로그인 시도를 할 때 "500 Internal Server Error'
        '" 메시지가 나타납니다. 특정 브라우저에서 더 자주 발생합니다.',
        metadata={
            "project_name": "국민은행",
            "issue_type": "bug",
            "priority": "high",
            "assignee": "홍길동",
            "job_days": 5,
        },
    ),
    Document(
        page_content="사용자가 실시간 데이터 분석을 할 수 있는 새로운 대시보드 위젯을 추가합니다. 필요한 데이터는 사용자의 현재 세션에서 가져옵니다.",
        metadata={
            "project_name": "신한은행",
            "issue_type": "story",
            "priority": "middle",
            "assignee": "김철수",
            "job_days": 3,
        },
    ),
    Document(
        page_content="현재 프로필 사진 업데이트가 너무 느리고 자주 실패합니다. 업로드 속도 향상 및 실패율 감소가 필요합니다.",
        metadata={
            "project_name": "국민은행",
            "issue_type": "improvement",
            "priority": "low",
            "assignee": "이영희",
            "job_days": 1,
        },
    ),
    Document(
        page_content="매주 월요일 오전 9시에 자동으로 주간 보고서를 생성하고 관련 부서에 이메일로 전송되도록 설정합니다.",
        metadata={
            "project_name": "하나은행",
            "issue_type": "task",
            "priority": "middle",
            "assignee": "박민수",
            "job_days": 4,
        },
    ),
    Document(
        page_content="새로운 결제 게이트웨이 API를 기존 시스템에 통합하여 결제 처리 속도와 신뢰성을 높입니다. 메인 태스크: 결제 시스템 업그레이드.",
        metadata={
            "project_name": "카카오뱅크",
            "issue_type": "task",
            "priority": "high",
            "assignee": "최지은",
            "job_days": 5,
        },
    ),
]
vectorstore = Chroma.from_documents(
    persist_directory="chroma_self_query_store",
    documents=docs,
    embedding=OpenAIEmbeddings(),
)

SelfQueryRetriever 검색

검색을 해보자.

from dotenv import load_dotenv
from langchain.chains.query_constructor.base import AttributeInfo
from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain_community.vectorstores import Chroma
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
import langchain

langchain.debug = True

load_dotenv()

# metadata={"issue_type": "bug", "priority": "high", "assignee": "홍길동"},
metadata_field_info = [
    AttributeInfo(
        name="project_name",
        description="프로젝트의 이름을 나타낸다.",
        type="string",
    ),
    AttributeInfo(
        name="issue_type",
        description="issue의 유형을 나타낸다. One of ['bug', 'story', 'improvement', 'task']",
        type="string",
    ),
    AttributeInfo(
        name="priority",
        description="이슈의 우선순위",
        type="string",
    ),
    AttributeInfo(
        name="assignee",
        description="이슈의 할당자 이름",
        type="string",
    ),
    AttributeInfo(
        name="job_days",
        description="이슈 작업에 걸리는 공수",
        type="integer",
    ),
]

document_content_description = "이슈의 내용"

# LLM 정의
llm = ChatOpenAI(model="gpt-4-turbo-preview", temperature=0)

vectorstore = Chroma(
    persist_directory="chroma_self_query_store", embedding_function=OpenAIEmbeddings()
)

retriever = SelfQueryRetriever.from_llm(
    llm,
    vectorstore,
    document_content_description,
    metadata_field_info,
)

docs = retriever.invoke("공수가 3 이상인 이슈를 찾아주세요")
for doc in docs:
    print(doc.page_content)

실행결과

새로운 결제 게이트웨이 API를 기존 시스템에 통합하여 결제 처리 속도와 신뢰성을 높입니다. 메인 태스크: 결제 시스템 업그레이드.
매주 월요일 오전 9시에 자동으로 주간 보고서를 생성하고 관련 부서에 이메일로 전송되도록 설정합니다.
사용자가 로그인 시도를 할 때 "500 Internal Server Error" 메시지가 나타납니다. 특정 브라우저에서 더 자주 발생합니다.

실제 공수가 5 이상인 이슈를 잘 찾아주는 것을 확인할 수 있다.

국민은행의 버그건을 찾아보자.

docs = retriever.invoke("국민은행의 버그를 찾아주세요")

실행결과

사용자가 로그인 시도를 할 때 "500 Internal Server Error" 메시지가 나타납니다. 특정 브라우저에서 더 자주 발생합니다.

잘 찾는 것을 확인할 수 있다.

참고

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유