一、前言

    在LangChain中,检索器是一个重要模块,主要用于从数据源中检索与查询相关的文档或片段。它能高效进行信息检索,通过快速筛选和语义理解从大规模文本数据中找到相关内容,支持复杂应用场景如检索增强生成和多源数据整合,还具有可定制性和灵活性,可选择不同嵌入模型和索引后端,也支持自定义检索逻辑。例如在企业知识库系统、智能客服系统和智能文档分析系统中都能发挥重要作用。


二、术语

2.1.LangChain

    是一个全方位的、基于大语言模型这种预测能力的应用开发工具。LangChain的预构建链功能,就像乐高积木一样,无论你是新手还是经验丰富的开发者,都可以选择适合自己的部分快速构建项目。对于希望进行更深入工作的开发者,LangChain 提供的模块化组件则允许你根据自己的需求定制和创建应用中的功能链条。

    LangChain本质上就是对各种大模型提供的API的套壳,是为了方便我们使用这些 API,搭建起来的一些框架、模块和接口。

   LangChain的主要特性:
        1.可以连接多种数据源,比如网页链接、本地PDF文件、向量数据库等
        2.允许语言模型与其环境交互
        3.封装了Model I/O(输入/输出)、Retrieval(检索器)、Memory(记忆)、Agents(决策和调度)等核心组件
        4.可以使用链的方式组装这些组件,以便最好地完成特定用例。
        5.围绕以上设计原则,LangChain解决了现在开发人工智能应用的一些切实痛点。

2.2.检索器(Retriever)

    是一种接口,它根据非结构化查询返回文档。它的功能比向量存储更为广泛。检索器不需要能够存储文档,只需能够返回(或检索)它们。向量存储可以作为检索器的基础,但也存在其他类型的检索器。

检索器作用:

1) 高效的信息检索

  • 面对大规模文本数据,Retriever 能够迅速从数据源中找到与用户查询相关的部分,避免对整个数据集进行遍历搜索,从而显著提高检索效率。
  • Retriever 利用文本向量化和相似性度量等技术,能够理解查询的语义并进行基于语义的检索。这意味着即使查询的表述与文档中的表述不完全一致,只要语义相关,Retriever 也能找到相关文档。

2) 支持复杂应用场景

  • 在检索增强生成的应用中,Retriever为语言模型提供相关的上下文信息。语言模型在生成回答时,可以基于 Retriever 检索到的文档进行推理和回答,从而提高回答的准确性和可靠性。
  • Retriever 可以同时从多个不同的数据源中进行检索,将来自不同来源的相关信息整合在一起。

3)可定制性和灵活性

  • Retriever允许开发者根据具体需求选择不同的文本嵌入模型和索引后端。不同的嵌入模型在文本向量化方式上可能存在差异,适用于不同的应用场景;而不同的索引后端在存储和检索数据的性能、可扩展性等方面也有所区别。
  • 支持自定义检索逻辑:开发者可以基于 Retriever 的基础接口,实现自定义检索逻辑。

2.3.ContextualCompressionRetriever

    是一个用于信息检索的组件,旨在提高检索系统在处理大量文本数据时的效率和相关性。它的主要作用是根据上下文压缩和选择信息,以便更好地满足查询需求。

具体来说,ContextualCompressionRetriever`具有以下几个关键功能:

1. 理解查询的上下文,从而更好地匹配相关信息。

2. 通过压缩信息来减少冗余,提高检索效率。

3. 通过结合上下文和压缩机制,提升检索的效果,使得用户能够获得更相关和精炼的答案。

4. 根据不同的查询和上下文进行调整,适应多种应用场景。

2.4.FAISS

是一个高效的相似性搜索库,专门用于处理大规模向量数据集。


三、前提条件 

3.1. 基础环境

  1.  操作系统:不限

3.2. 安装虚拟环境

conda create --name langchain python=3.10
conda activate langchain
pip install langchain langchain-openai langchain-community
# CPU版本安装
pip install faiss-cpu

# GPU版本安装
pip install faiss-gpu

四、技术实现

4.1. FAISS入门示例

# -*- coding: utf-8 -*-
import os

from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.docstore.document import Document

os.environ["OPENAI_API_KEY"] = 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'  # 你的Open AI Key

# 示例文档
documents = [
    Document(page_content="LangChain is a framework for developing applications powered by language models."),
    Document(page_content="FAISS is a library for efficient similarity search and clustering of dense vectors."),
    Document(page_content="OpenAI provides various models for natural language processing tasks."),
]

# 创建嵌入模型
embeddings = OpenAIEmbeddings()

# 将文档转换为嵌入向量
texts = [doc.page_content for doc in documents]

# 创建 FAISS 向量存储
faiss_index = FAISS.from_texts(texts, embeddings)

# 查询向量(示例查询)
query = "What is LangChain?"

# 执行相似性搜索
k = 1  # 返回前 k 个最近邻
results = faiss_index.similarity_search(query, k)

# 输出结果
for result in results:
    print(f"Document: {result.page_content}")

4.2. ContextualCompressionRetriever

# -*- coding: utf-8 -*-
import os

from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
from langchain_community.vectorstores import FAISS
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings, ChatOpenAI

os.environ["OPENAI_API_KEY"] = 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'  # 你的Open AI Key

# 示例文档
documents = [
    Document(page_content="广州是一座历史悠久、文化底蕴深厚的城市,拥有众多独特的景点和美食,值得一游。推荐的景点包括广州塔,这座600米高的地标建筑是俯瞰广州全景的最佳地点;白云山被誉为“羊城第一秀”,是南粤著名的名山;陈家祠则是保存最完好的清代宗祠,展示了广东民间工艺的魅力。此外,北京路步行街、沙面岛和中山纪念堂等地也各具特色。美食方面,虾饺、沙河粉和红米肠等广式点心令人垂涎,荔湾艇子粥和萝卜牛杂则是传统小吃的代表,此外,水菱角、白云猪手和猪脚姜等菜肴更是别具风味,值得品尝。广州的美食和景点交相辉映,让人流连忘返。"),
    Document(page_content="深圳是一个充满活力的城市,拥有许多值得游玩的地方和美食。你可以前往深圳湾公园,欣赏壮丽的海景和城市天际线;也可以游览世界之窗,体验各国文化的缩影。此外,深圳的购物天堂东门步行街和华强北是购物爱好者的乐园。在美食方面,深圳的街头小吃琳琅满目,特别是粤式点心如虾饺和烧卖,还有独具特色的深圳烧烤和海鲜,绝对能满足你的味蕾。别忘了尝试当地的肠粉和煲仔饭,定会让你流连忘返!"),
    Document(page_content="重庆是一个充满魅力的城市,有着丰富的旅游资源和美食文化。在这里,你可以游览壮观的洪崖洞,感受山城的独特风貌,或者前往解放碑步行街,体验城市的繁华。还有著名的长江索道,让你俯瞰壮丽的长江景色。至于美食,重庆火锅是不可错过的,麻辣鲜香让人欲罢不能;此外,酸辣粉、小面和串串香也是当地的特色美味,绝对能让你的味蕾大开。"),
    Document(page_content="上海,是一座充满活力和魅力的国际大都市,拥有丰富的历史文化和现代化的城市风貌。在这里,外滩是一个不可错过的景点,沿着黄浦江漫步,可以欣赏到对岸壮丽的摩天大楼和历史悠久的建筑群,尤其在夜晚,霓虹灯闪烁,更是美不胜收。此外,东方明珠塔作为上海的标志性建筑,可以俯瞰整个城市的美景,带给游客无与伦比的视觉享受。如果你对文化感兴趣,可以前往上海博物馆,馆内珍藏了大量的中国古代艺术品,是了解中国历史和文化的好去处。而在新天地,既能体验到老上海的石库门建筑风格,又能在时尚的酒吧和餐厅中享受现代生活的乐趣。上海的美食同样令人垂涎欲滴。小笼包是当地的经典美食,薄皮包裹着鲜美的肉馅,咬一口,鲜汁四溅,令人陶醉。而生煎包则外脆内嫩,底部酥脆,配上香醇的酱油,别有风味。此外,上海的海鲜也非常新鲜,尤其是大闸蟹,肉质鲜美,是时令美食的代表。当然,去上海不能错过的还有当地的糖葫芦和桂花糕,甜而不腻,口感独特,适合在游览时随手品尝。总之,上海不仅是一座现代化的城市,更是一个汇聚了历史、文化、美食的宝地,无论是观光还是美食,都会让你流连忘返。"),
]

def pretty_print_docs(docs):
    print(
        f"\n{'-' * 100}\n".join(
            [f"Document {i+1}:\n\n" + d.page_content for i, d in enumerate(docs)]
        )
    )

if __name__ == '__main__':
    embeddings = OpenAIEmbeddings()
    retriever = FAISS.from_documents(documents, embeddings).as_retriever()

    llm = ChatOpenAI(model="gpt-3.5-turbo",temperature=0,max_tokens=512)
    compressor = LLMChainExtractor.from_llm(llm)
    compression_retriever = ContextualCompressionRetriever(
        base_compressor=compressor, base_retriever=retriever
    )

    compressed_docs = compression_retriever.invoke(
        "广州最好吃的美食是什么?"
    )
    pretty_print_docs(compressed_docs)

调用结果:

说明:

1.它能理解查询的上下文,找到广州对应的美食

2.把对应广州美食的描述进行压缩提炼

3.最后将结果返回


五、附带说明

5.1. 使用ContextualCompressionRetriever的注意事项

1. ContextualCompressionRetriever依赖于上下文信息来进行检索,因此确保提供足够的上下文数据是非常重要的。上下文的质量和相关性直接影响检索结果的效果。

2. 在使用之前,确保你的数据经过适当的预处理。包括去除噪声、标准化格式等,以提高检索的准确性。

3.选择合适的基础模型对于ContextualCompressionRetriever的效果至关重要。不同的模型在处理特定类型的数据时可能表现不同,因此需要根据具体的应用场景进行选择。

4. 根据数据集和应用需求,适当调整Retriever的参数,如检索的数量、相似度阈值等,以优化性能。

5. 在实际应用中,监控检索性能和结果的质量是必要的。通过评估模型的输出,及时调整参数和方法,以提升系统的整体表现。

Logo

科技之力与好奇之心,共建有温度的智能世界

更多推荐