如何在LangChain FAISS检索器中指定相似度阈值?
使用相似度阈值替代k值检索文档
- 直接在
vectorstore.as_retriever()的search_kwargs中传入score_threshold参数即可,该参数会筛选出相似度高于设定值的文档,替代原有的k值数量限制。 - 示例阈值可根据实际需求调整,比如设置为0.7(数值范围通常在0-1之间,越接近1相似度越高)。
修改后的完整代码如下:
from langchain.document_loaders import PyPDFLoader from langchain.vectorstores import FAISS from langchain.embeddings.openai import OpenAIEmbeddings from langchain.chat_models import ChatOpenAI from langchain.chains import ConversationalRetrievalChain def get_conversation_chain(vectorstore): llm = ChatOpenAI(temperature=0, model_name='gpt-3.5-turbo') # 用score_threshold替代k值,设置相似度阈值为0.7 qa = ConversationalRetrievalChain.from_llm( llm=llm, retriever=vectorstore.as_retriever(search_kwargs={'score_threshold': 0.7}), return_source_documents=True, verbose=True ) return qa loader = PyPDFLoader("sample.pdf") # 加载并拆分PDF文档 pages = loader.load_and_split() # 创建FAISS向量索引 faiss_index = FAISS.from_documents(pages, OpenAIEmbeddings()) # 创建对话链 chat_history = [] qa = get_conversation_chain(faiss_index) query = "What is a sunflower?" result = qa({"question": query, "chat_history": chat_history})
- 补充说明:如果同时设置
k和score_threshold,会先筛选出符合阈值的文档,再从中返回最多k个结果;若没有文档满足阈值条件,检索结果会为空。
内容的提问来源于stack exchange,提问作者G. Macia
相关产品推荐
相关产品推荐

