03LangChain初学者指南:从零开始实现高效数据检索

news/2024/11/13 14:32:57/文章来源:https://www.cnblogs.com/onecyl/p/18543849

LangChain初学者指南:从零开始实现高效数据检索

https://python.langchain.com/v0.2/docs/tutorials/retrievers/

这个文档,我们将熟悉LangChain的向量存储和抽象检索器。支持从(向量)数据库和其他来源检索数据,并与大模型的工作流集成。这对于需要检索数据以进行推理的应用程序非常重要,例如检索增强生成(retrieval-augmented generation)的情况,或者RAG(请参阅我们的RAG教程在这里)。

概念

这个指南着重于文本数据的检索。涵盖以下主要概念:

  • Documents:文本
  • Vector stores:向量存储
  • Retrievers:检索

Setup

Jupyter Notebook

这些教程和其他教程可能最方便在Jupyter笔记本中运行。请参阅此处有关安装方法的说明。

Installation

这个教程需要使用 langchainlangchain-chromalangchain-openai包。

  • Pip
pip install langchain langchain-chroma langchain-openai

Installation guide.

LangSmith

设置环境变量

export LANGCHAIN_TRACING_V2="true"
export LANGCHAIN_API_KEY="..."

如果在 notebook中,可以这样设置:

import getpass
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()

Documents

LangChain 实现了一个提取的文档,文档包括文本单元和相关元数据。它具有两个属性:

  • page_content :字符串格式的内容
  • metadata :包含任意元数据的字典。

元数据属性可以包含关于文档来源、与其他文档的关系以及其他信息。请注意,单个文档对象通常代表更大文档的一部分。

生成一些 documents 例子:

from langchain_core.documents import Document
documents = [Document(page_content="Dogs are great companions, known for their loyalty and friendliness.",metadata={"source": "mammal-pets-doc"},
),Document(page_content="Cats are independent pets that often enjoy their own space.",metadata={"source": "mammal-pets-doc"},
),Document(page_content="Goldfish are popular pets for beginners, requiring relatively simple care.",metadata={"source": "fish-pets-doc"},
),Document(page_content="Parrots are intelligent birds capable of mimicking human speech.",metadata={"source": "bird-pets-doc"},
),Document(page_content="Rabbits are social animals that need plenty of space to hop around.",metadata={"source": "mammal-pets-doc"},
),
]

API 调用:

  • Document

这里我们生成了五个包含元数据的文档,其中显示了三个不同的“来源”。

向量存储

向量搜索是一种常见的存储和搜索非结构化数据(如非结构化文本)的方法。其思想是存储与文本相关联的数值向量。给定一个查询,我们可以将其嵌入为相同维度的向量,并使用向量相似度度量来识别存储中相关的数据。

LangChain的VectorStore对象定义了用于将文本和文档对象添加到存储,和使用各种相似度度量进行查询的方法。通常使用嵌入模型进行初始化,这些模型确定了文本数据如何被转化为数字向量。

LangChain包括一套与不同矢量存储技术集成的解决方案。一些矢量存储由提供者(如各种云服务提供商)托管,并需要特定的凭据才能使用;一些(例如Postgres)在独立的基础设施中运行,可以在本地或通过第三方运行;其他一些可以运行在内存中,用于轻量级工作负载。在这里,我们将演示使用Chroma的LangChain向量存储的用法,是一个基于内存的实现。

实例化一个向量存储的时候,通常需要提供一个嵌入模型来指定文本应该如何转换为数字向量。在这里,我们将使用 OpenAI 的嵌入模型。

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
vectorstore = Chroma.from_documents(documents,embedding=OpenAIEmbeddings(),
)

API 调用:

  • OpenAIEmbeddings

调用 .from_documents 把文档添加到向量存储中。VectorStore实现了用于添加文档的方法,这些方法可以在对象实例化之后调用。大多数实现都允许您连接到现有的向量存储,例如,通过提供客户端、索引名称或其他信息。有关特定集成的更多详细信息,请参阅文档。

一旦我们实例化了一个包含文档的 VectorStore,我们就可以对其进行查询。VectorStore 包括以下查询方法:

  • 同步和异步查询;
  • 通过字符串查询和通过向量查询;
  • 带有和不带有返回相似度分数的查询;
  • 通过相似度和最大边际相关性(在检索结果中平衡相似度和多样性的查询)进行查询。

这些方法会输出一个Document对象的列表。

例子

返回与字符串查询相似的文档:

vectorstore.similarity_search("cat")
[Document(page_content='Cats are independent pets that often enjoy their own space.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Dogs are great companions, known for their loyalty and friendliness.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Rabbits are social animals that need plenty of space to hop around.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Parrots are intelligent birds capable of mimicking human speech.', metadata={'source': 'bird-pets-doc'})]

异步查询:

await vectorstore.asimilarity_search("cat")
[Document(page_content='Cats are independent pets that often enjoy their own space.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Dogs are great companions, known for their loyalty and friendliness.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Rabbits are social animals that need plenty of space to hop around.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Parrots are intelligent birds capable of mimicking human speech.', metadata={'source': 'bird-pets-doc'})]

返回分数查询:

# Note that providers implement different scores; Chroma here
# returns a distance metric that should vary inversely with
# similarity.
vectorstore.similarity_search_with_score("cat")
[(Document(page_content='Cats are independent pets that often enjoy their own space.', metadata={'source': 'mammal-pets-doc'}),0.3751849830150604),(Document(page_content='Dogs are great companions, known for their loyalty and friendliness.', metadata={'source': 'mammal-pets-doc'}),0.48316916823387146),(Document(page_content='Rabbits are social animals that need plenty of space to hop around.', metadata={'source': 'mammal-pets-doc'}),0.49601367115974426),(Document(page_content='Parrots are intelligent birds capable of mimicking human speech.', metadata={'source': 'bird-pets-doc'}),0.4972994923591614)]

根据嵌入的查询返回类似文档的查询:

embedding = OpenAIEmbeddings().embed_query("cat")
vectorstore.similarity_search_by_vector(embedding)
[Document(page_content='Cats are independent pets that often enjoy their own space.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Dogs are great companions, known for their loyalty and friendliness.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Rabbits are social animals that need plenty of space to hop around.', metadata={'source': 'mammal-pets-doc'}),Document(page_content='Parrots are intelligent birds capable of mimicking human speech.', metadata={'source': 'bird-pets-doc'})]

学习更多:

  • API reference
  • How-to guide
  • Integration-specific docs

Retrievers

LangChain VectorStore 对象不继承 Runnable,因此无法直接集成到 LangChain 表达式语言 chains 中。

Retrievers 继承了 Runnables,实现了一套标准方法(例如同步和异步的 invokebatch操作),并且设计为纳入LCEL链中。

我们可以自己创建一个简单的可运行对象,而无需继承 Runnables。下面我们将围绕相似性搜索方法构建一个示例:

from typing import List
from langchain_core.documents import Document
from langchain_core.runnables import RunnableLambda
retriever = RunnableLambda(vectorstore.similarity_search).bind(k=1)  # select top result
retriever.batch(["cat", "shark"])

API 调用:

  • Document
  • RunnableLambda
[[Document(page_content='Cats are independent pets that often enjoy their own space.', metadata={'source': 'mammal-pets-doc'})],[Document(page_content='Goldfish are popular pets for beginners, requiring relatively simple care.', metadata={'source': 'fish-pets-doc'})]]

Vectorstores 实现一个 as_retriever 方法,该方法将生成一个 VectorStoreRetriever。这些 retriever 包括特定的 search_typesearch_kwargs 属性,用于识别调用底层向量存储的方法以及如何给它们参数化。例如,我们可以使用以下方法复制上述操作:

retriever = vectorstore.as_retriever(search_type="similarity",search_kwargs={"k": 1},
)
retriever.batch(["cat", "shark"])
[[Document(page_content='Cats are independent pets that often enjoy their own space.', metadata={'source': 'mammal-pets-doc'})],[Document(page_content='Goldfish are popular pets for beginners, requiring relatively simple care.', metadata={'source': 'fish-pets-doc'})]]

VectorStoreRetriever 支持相似度(默认)、mmr(最大边际相关性)和 similarity_score_threshold 可以对输出的相似文档,设定相似度分数阈值。

Retrievers 可以很容易地整合到更复杂的应用中,比如检索增强生成(RAG)应用程序,它将给定的问题与检索到的上下文结合组成 LLM 的提示。下面我们展示一个最简单的例子。

  • OpenAI
pip install -qU langchain-openai
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass()
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo-0125")
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
message = """
Answer this question using the provided context only.
{question}
Context:
{context}
"""
prompt = ChatPromptTemplate.from_messages([("human", message)])
rag_chain = {"context": retriever, "question": RunnablePassthrough()} | prompt | llm

API 调用:

  • ChatPromptTemplate
  • RunnablePassthrough
response = rag_chain.invoke("tell me about cats")
print(response.content)
Cats are independent pets that often enjoy their own space.

总结:

本文档提供了向量存储和检索的示例代码。介绍了LangChain的向量存储和抽象检索器,包括向量存储和检索器的概念和使用。向量存储是存储和搜索非结构化数据的一种方法,LangChain的VectorStore对象定义了用于将文本和文档对象添加到存储,和使用各种相似度度量进行查询的方法。检索器继承了Runnables,实现了一套标准方法,并且可以加入LCEL链中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/832962.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitLab 如何降级?

本分分享 GitLab 降级的流程和注意事项。极狐GitLab 为 GitLab 的中文发行版,本文以私有化部署的极狐GitLab 为例来演示整个过程。 【极狐GitLab 推出 GitLab 老旧版本的专业升级服务,可以让 12.x、13.x、14.x、15.x 等老旧版本的升级平滑不出问题】 首先确定当前的版本信息,…

希音面试:亿级用户 日活 月活,如何统计?(史上最强 HyperLogLog 解读)

本文原文链接 文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 …

【JetBrains CLion 2024软件下载与安装教程】

1、安装包 CLion2024: 链接:https://pan.quark.cn/s/ed93e8cb245e 提取码:fhwc CLion Pro 2021: 链接:https://pan.quark.cn/s/30927a3da509 提取码:1t2w CLion Pro 2018: 链接:https://pan.quark.cn/s/f3a7af5e8ca6 提取码:PW1E 2、安装教程(建议关闭杀毒软件) 1) …

团队项目Scrum冲刺-day2

一、每天举行站立式会议 站立式会议照片一张昨天已完成的工作成员 任务陈国金 用户模块的部分接口开发凌枫 登录页面陈卓恒 管理题目页面的部分代码谭立业 题目搜索页面的部分代码廖俊龙 接口测试曾平凡 前端页面测试曾俊涛 题目模块的部分接口开发薛秋昊 题目提交模块的部分接…

33 张高清大图,带你玩转 KubeSphere 4.1.2 部署与扩展组件安装

备受瞩目的 KubeSphere 4.1.2 已经正式官宣发布,该版本带来了一个重大优化:增加默认的扩展组件仓库。 这一优化改进,让采用全新的 KubeSphere LuBan 架构的 KubeSphere,真正实现了自由打造高度可扩展和可配置的云原生底座。 KubeSphere 用户仅需要在 K8s 之上,默认安装清爽…

cmu15545-数据访问方式:B+树(B+Tree)

目录基本概念基于磁盘的B+树查询与索引设计选择结点大小(Node Size)合并阈值(Merge Thredshold)变长键(Variable-length Keys)结点内部搜索(Intra-Node Search)优化手段Pointer SwizzlingBε-treesBulk InsertPrefix CompressionDeduplicationSuffix Truncation 基本概…

正向代理理解

正向代理(由客户端代理)

冲刺Day1

Day1 当天站立式会议照片姓名 学号 昨天已完成的工作 今天计划完成的工作 工作中遇到的困难林涛(组长) 3122004618 null 开发登录管理员api 如何进行password保密杨森 3122004629 null 后台文件上传开发 如何进行前后端文件上传协调钟礼骏 3122006504 null 查询家长感兴趣模块…

关于电线平方数(截面积)与功率之间关系的对比表格。该表格主要基于电流承载能力(导线的截面积)与相应的功率传输能力。

关于电线平方数(截面积)与功率之间关系的对比表格。该表格主要基于电流承载能力(导线的截面积)与相应的功率传输能力。电线截面积 (mm) 额定电流 (A) 适用功率 (W) (220V 电压) 适用功率 (W) (380V 电压)0.5 mm 5 A 1100 W 1900 W0.75 mm 8 A 1760 W 3040 W1.0 mm 10 A 220…

在线性坐标系中绘制对数函数图象

本文记述了用 Matplotlib 在线性坐标系中绘制对数函数图象的例子。 代码主体内容如下: ...def main():fig, ax = plt.subplots(figsize=(8,8)) #1ax = configure_axes(ax, Logarithmic Function, 8, 3, 1, 0.25, 1, 0.25) #2x = np.linspace(0.125, 8, 100) …

【JetBrains Rider 2024软件下载与安装教程】

1、安装包Rider2024: 链接:https://pan.quark.cn/s/f3b3360dccc0 提取码:Z8gA Rider-2023.3.2: 链接:https://pan.quark.cn/s/82b63a1e0df3 提取码:XdA8 2、安装教程(建议关闭杀毒软件) 1) 双击下载安装包exe文件安装,弹窗安装对话框2) 点击下一步3) …