Langchain 검색 : 문서에 대한 효율적이고 유연한 액세스
Langchain Framework의 검색자는 구조화되지 않은 쿼리를 기반으로 문서를 반환하기위한 유연한 인터페이스를 제공하는 중요한 역할을합니다. 벡터 데이터베이스와 달리 검색자는 문서를 저장할 필요가 없습니다. 벡터 데이터베이스는 레트로 어의 기초 역할을 할 수 있지만 각각의 특정 유스 케이스에 대해 사용자 정의 할 수있는 다양한 유형의 레트로어가 있습니다.
학습 목표
목차
Langchain의 검색 자
검색자는 입력으로 문자열 쿼리를 수신하고 문서 개체 목록을 출력합니다. 이 메커니즘을 사용하면 응용 프로그램이 관련 정보를 효율적으로 획득하여 대규모 데이터 세트 또는 지식 기반과의 고급 상호 작용을 가능하게합니다.
벡터 데이터베이스 리트리버는 벡터 표현을 사용하여 문서를 효율적으로 검색합니다. 벡터 스토리지 클래스의 경량 래퍼 역할을하며 검색기 인터페이스를 준수하며 유사성 검색 및 최대 한계 상관 관계 (MMR)와 같은 메소드를 사용합니다.
벡터 데이터베이스에서 리트리버를 만들려면 .as_retriever
메소드를 사용하십시오. 예를 들어, 고객 리뷰를 기반으로 한 Pinecone Vector 데이터베이스의 경우 다음과 같이 설정할 수 있습니다.
langchain_community.document_loaders에서 csvloader를 가져옵니다 langchain_community.vectorstores import pinecone에서 langchain_openai 가져 오기 OpenAiembeddings langchain_text_splitters import aratertextsplitter에서 로더 = csvloader ( "customer_reviews.csv") documents = loader.load () text_splitter = charac 텍스트 = text_splitter.split_documents (문서) Embeddings = OpenAiembedDings () vectorstore = pinecone.from_documents (텍스트, 임베디드) Retriever = vectorstore.as_retriever ()
이제이 검색자를 사용하여 관련 주석을 쿼리 할 수 있습니다.
Docs = retriver.invoke ( "고객은 배터리 수명에 대해 어떻게 생각합니까?")
기본적으로 검색자는 유사성 검색을 사용하지만 MMR을 검색 유형으로 지정할 수 있습니다.
Retriever = vectorstore.as_retriever (search_type = "mmr")
또한 유사성 점수 임계 값과 같은 매개 변수를 전달하거나 Top-K를 사용하여 결과 수를 제한 할 수 있습니다.
Retriever = vectorstore.as_retriever (search_kwargs = { "k": 2, "score_threshold": 0.6})
산출:
벡터 데이터베이스를 검색 자로 사용하면 관련 정보에 대한 효율적인 액세스를 보장하여 문서 검색을 향상시킬 수 있습니다.
MultiqueryReerriever는 쿼리 문구의 변경 및 차선 임베딩과 같은 일반적인 한계를 해결함으로써 거리 기반 벡터 데이터베이스 검색을 향상시킵니다. LLM (Lange Language Model) 자동화 프롬프트 조정을 사용하면 다른 각도에서 주어진 사용자 입력에 대해 여러 쿼리를 생성 할 수 있습니다. 이 프로세스를 사용하면 각 쿼리에 대한 관련 문서를 검색하고 결과를 결합하여 더 풍부한 잠재적 문서 세트를 생성합니다.
MultiqueryReryRiever를 보여 주려면 CSV 파일의 제품 설명을 사용하여 벡터 저장소를 작성하겠습니다.
langchain_community.document_loaders에서 csvloader를 가져옵니다 langchain_community.vectorstores에서 faiss를 가져옵니다 langchain_openai 가져 오기 OpenAiembeddings langchain_text_splitters import aratertextsplitter에서 #로드 제품 설명 로더 = CSVloader ( "Product_Descriptions.csv") data = loader.load () # 블록으로 텍스트를 분할 text_splitter = charac documents = text_splitter.split_documents (데이터) # 벡터 스토리지 임베드 생성 = OpenAiembedDings () vectordb = faiss.from_documents (문서, 임베디드)
MultiqueryReerriever를 사용하려면 쿼리 생성에 사용되는 LLM을 지정하십시오.
langchain.retrievers.multi_query import multiqueryretriever에서 langchain_openai import Chatopenai에서 Question = "고객은 스마트 폰에서 어떤 기능을 중요하게 생각합니까?" llm = chatopenai (온도 = 0) retriever_from_llm = multiqueryRetriever.from_llm ( Retriever = vectordb.as_retriever (), llm = llm )) 고유 한 LEN (고유 _docs) # 검색 된 고유 문서 수
산출:
MultiqueryRertiever는 여러 쿼리를 생성하여 검색된 문서의 다양성과 관련성을 향상시킵니다.
생성 된 쿼리를 조정하려면 사용자 정의 PromptTemplate 및 출력 파서를 만들 수 있습니다.
langchain_core.output_parsers에서 baseoutputparser를 가져옵니다 langchain_core에서 prompttemplate 가져 오기 입력 가져 오기 목록에서 # 사용자 정의 출력 Parser 클래스 LinelistOutputParser (BaseOutputParser [list [str]] : def parse (self, text : str) -> list [str] : 반환 목록 (필터 (없음, text.strip (). split ( "\ n")))) output_parser = linelistoutputparser () # query 생성 Query_prompt의 사용자 정의 프롬프트 = PrustTemplate ( input_variables = [ "Question"], 템플릿 = "" "질문의 다섯 가지 버전을 생성합니다. {Question}" "" )) llm_chain = query_prompt | # 리트리버 리트리버 초기화 = MultiqueryReerriever ( Retriever = vectordb.as_retriever (), llm_chain = llm_chain, parser_key = "lines" )) 고유 한 _docs = retriever.invoke ( "고객은 스마트 폰에서 어떤 기능을 소중히 여기는가?") LEN (고유 _docs) # 검색 된 고유 문서 수
산출
MultiqueryReerriever를 사용하면보다 효율적인 검색 프로세스를 달성하여 사용자 쿼리를 기반으로 다양하고 포괄적 인 결과를 보장 할 수 있습니다.
대규모 문서 모음에서 관련 정보를 검색하는 것은 특히 데이터 수집이 사용자가 할 특정 쿼리에 대해 알 수없는 경우 어려울 수 있습니다. 종종 귀중한 통찰력은 긴 문서에 숨겨져있어 LLM (Language Model)에 대한 비효율적이고 비용이 많이 드는 호출을 초래하면서 이상적인 것보다 적은 대응 성을 제공합니다. 컨텍스트 압축은 검색 프로세스를 개선 하여이 문제를 해결하여 사용자의 쿼리에 따라 관련 정보가 반환되도록합니다. 이 압축에는 단일 문서의 내용을 줄이고 관련없는 문서를 필터링하는 것이 포함됩니다.
컨텍스트 압축 검색기는 기본 검색기를 문서 압축기와 통합하여 실행됩니다. 이 메소드는 문서를 전체적으로 반환하지 않지만 쿼리에서 제공 한 컨텍스트를 기반으로 문서를 압축합니다. 이 압축에는 단일 문서의 내용을 줄이고 관련없는 문서를 필터링하는 것이 포함됩니다.
langchain_community.document_loaders에서 텍스트 로더를 가져옵니다 langchain_community.vectorstores에서 faiss를 가져옵니다 langchain_openai 가져 오기 OpenAiembeddings langchain_text_splitters import aratertextsplitter에서 # 기사 문서를로드하고 분할 = 텍스트 로더 ( "climate_change_policy.txt"). load () text_splitter = charac 텍스트 = text_splitter.split_documents (문서) # 초기화 벡터 스토리지 리트리버 리트리버 = faiss.from_documents (텍스트, OpenAiEmbedDings ()). as_retriever ()
docs = retriver.invoke ( "기후 변화와 싸우기 위해 어떤 행동이 제안되고 있습니까?")
langchain.retrievers에서 컨텍스트 compressionretriever를 가져옵니다 langchain.retrievers.document_compressors import llmchainextractor langchain_openai import OpenAi에서 llm = openai (온도 = 0) compressor = llmchainextractor.from_llm (llm) compression_retriever = contextualcompressionretriever ( base_compressor = compressor, base_retriever = 리트리버 )) # compressed_docs = compression_retriever.invoke 수행 ( "기후 변화와 싸우기 위해 어떤 조치가 제안되고 있습니까?")
압축 결과보기 : ContextualCompressionReRiever는 초기 문서를 처리하고 쿼리와 관련된 관련 정보 만 추출하여 응답을 최적화합니다.
많은 LLM 응용 프로그램에서 검색이 필수적입니다. 그 작업은 사용자 쿼리를 기반으로 관련 문서를 얻는 것입니다. 이 문서는 LLM 프롬프트로 형식화되어 적절한 응답을 생성 할 수 있습니다.
사용자 정의 리트리버를 만들려면 Baseretriever 클래스를 확장하고 다음을 구현하십시오.
방법 | 설명하다 | 필수/선택 사항 |
---|---|---|
_get_relevant_documents
|
쿼리와 관련된 문서를 검색합니다. | 필수의 |
_aget_relevant_documents
|
기본 지원을위한 비동기 구현. | 선택 과목 |
BaseRetriever에서 상속 된 것은 리트리버에 표준 실행 가능한 기능을 제공합니다.
다음은 간단한 리트리버의 예입니다.
입력 가져 오기 목록에서 langchain_core에서 문서 가져 오기 langchain_core.retrievers import Baseretriever에서 클래스 Toyretriever (Baseretriever) : "" "사용자 쿼리가 포함 된 첫 번째 K 문서를 반환하는 간단한 리트리버." "" 문서 : 목록 [문서] K : int def _get_relevant_documents (self, query : str) -> 목록 [문서] : matching_documents = [doc.page_content.lower ()의 query.lower () 인 경우 self.documents의 doc. Matching_documents 반품 [: self.k] # 예제 사용 문서 = [ 문서 ( "개는 훌륭한 회사입니다.", { "type": "dog"}), 문서 ( "고양이는 독립 애완 동물입니다.", { "type": "cat"}), ]] Retriever = Toyretriever (Documents = Documents, K = 1) 결과 = retriver.invoke ( "개") print (result [0] .page_content)
산출
이 구현은 Langchain에서 사용자 정의 검색 자의 핵심 기능을 보여주는 사용자 입력을 기반으로 문서를 검색하는 간단한 방법을 제공합니다.
Langchain Framework에서 Searcher는 다양한 문서 유형 및 사용 사례에서 관련 정보에 효과적으로 액세스 할 수있는 강력한 도구입니다. 개발자는 다양한 검색기 유형 (예 : Vector Storage Retrievers, MultiqueryReryretriever 및 Context Compression Retrievers)을 이해하고 구현함으로써 응용 프로그램의 특정 요구에 따라 문서 검색을 사용자 정의 할 수 있습니다.
각 리트리버 유형은 다중 레비 트리버 사용에서 컨텍스트 압축 사용, 응답 최적화에 이르기까지 고유 한 장점이 있습니다. 또한, 사용자 정의 검색자를 작성하면 내장 옵션이 충족되지 않을 수있는 특수 요구 사항을 수용 할 수있는 유연성이 향상됩니다. 이러한 검색 기술을 마스터하면 개발자는 언어 모델 및 대규모 데이터 세트의 잠재력을 활용하는보다 효율적이고 반응이 좋은 응용 프로그램을 구축 할 수 있습니다.
Q1. Langchain에서 검색 자의 기능은 무엇입니까? A1. 주요 기능은 쿼리를 기반으로 관련 문서를 얻는 것입니다. 이를 통해 응용 프로그램은 문서 자체를 저장하지 않고 큰 데이터 세트에서 필요한 정보에 효과적으로 액세스 할 수 있습니다.
Q2. 검색 자와 벡터 데이터베이스 사이의 것은 어떻습니까? a2. 벡터는 유사성 기반 검색을 허용하는 방식으로 문서를 저장하는 데 사용되며 검색자는 쿼리를 기반으로 검색을위한 인터페이스입니다. 벡터 데이터베이스는 검색 자의 일부가 될 수 있지만 검색 자의 작업은 관련 정보를 얻는 데 중점을 둡니다.
Q3. MultiperyRertiever는 무엇이며 어떻게 작동합니까? A3. MultiqueryRiever는 언어 모델을 사용하여 여러 가지 변형을 생성하여 검색 결과를 향상시킵니다. 이 방법은 다른 문구 문제와 관련 될 수있는 더 넓은 범위의 문서를 캡처하여 검색 정보의 풍부함을 향상시킵니다.
Q4. 컨트롤 압축이 중요한 이유는 무엇입니까? A4. Context Comp는 문서의 내용을 관련 부품으로 만 줄이고 관련된 정보를 필터링하여 검색 결과를 최적화합니다. 완전한 문서에는 관련이없는 세부 사항이 포함되어 있고 자원을 저장하고보다 중앙 집중식 응답을 제공 할 수 있으므로 큰 컬렉션에서 특히 유용합니다.
Q5. a5.
위 내용은 Langchain의 리트리버를위한 3 가지 고급 전략의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!