跳到主要內容
Open In ColabOpen on GitHub

如何處理在查詢分析時的多個檢索器

有時,查詢分析技術可能允許選擇要使用的檢索器。 若要使用此功能,您需要新增一些邏輯來選擇要執行的檢索器。 我們將展示一個簡單的範例(使用模擬資料)來說明如何做到這一點。

設定

安裝依賴項

%pip install -qU langchain langchain-community langchain-openai langchain-chroma
Note: you may need to restart the kernel to use updated packages.

設定環境變數

在此範例中,我們將使用 OpenAI

import getpass
import os

if "OPENAI_API_KEY" not in os.environ:
os.environ["OPENAI_API_KEY"] = getpass.getpass()

# Optional, uncomment to trace runs with LangSmith. Sign up here: https://smith.langchain.com.
# os.environ["LANGSMITH_TRACING"] = "true"
# os.environ["LANGSMITH_API_KEY"] = getpass.getpass()

建立索引

我們將在虛假資訊上建立向量儲存庫。

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter

texts = ["Harrison worked at Kensho"]
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_texts(texts, embeddings, collection_name="harrison")
retriever_harrison = vectorstore.as_retriever(search_kwargs={"k": 1})

texts = ["Ankush worked at Facebook"]
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_texts(texts, embeddings, collection_name="ankush")
retriever_ankush = vectorstore.as_retriever(search_kwargs={"k": 1})

查詢分析

我們將使用函式呼叫來組織輸出。 我們將使其返回多個查詢。

from typing import List, Optional

from pydantic import BaseModel, Field


class Search(BaseModel):
"""Search for information about a person."""

query: str = Field(
...,
description="Query to look up",
)
person: str = Field(
...,
description="Person to look things up for. Should be `HARRISON` or `ANKUSH`.",
)
from langchain_core.output_parsers.openai_tools import PydanticToolsParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI

output_parser = PydanticToolsParser(tools=[Search])

system = """You have the ability to issue search queries to get information to help answer user information."""
prompt = ChatPromptTemplate.from_messages(
[
("system", system),
("human", "{question}"),
]
)
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
structured_llm = llm.with_structured_output(Search)
query_analyzer = {"question": RunnablePassthrough()} | prompt | structured_llm

我們可以看到這允許在檢索器之間進行路由

query_analyzer.invoke("where did Harrison Work")
Search(query='work history', person='HARRISON')
query_analyzer.invoke("where did ankush Work")
Search(query='work history', person='ANKUSH')

使用查詢分析進行檢索

那麼我們該如何將其包含在鏈中呢? 我們只需要一些簡單的邏輯來選擇檢索器並傳遞搜尋查詢

from langchain_core.runnables import chain
API 參考:chain
retrievers = {
"HARRISON": retriever_harrison,
"ANKUSH": retriever_ankush,
}
@chain
def custom_chain(question):
response = query_analyzer.invoke(question)
retriever = retrievers[response.person]
return retriever.invoke(response.query)
custom_chain.invoke("where did Harrison Work")
[Document(page_content='Harrison worked at Kensho')]
custom_chain.invoke("where did ankush Work")
[Document(page_content='Ankush worked at Facebook')]

此頁面是否有幫助?