🚀 LangChain 星际之旅:构建你的向量存储与检索系统
🌟 介绍
欢迎来到LangChain的奇妙世界!在这个星际旅程中,我们将一起探索如何构建一个强大的向量存储和检索系统,支持从(向量)数据库和其他来源检索数据,以便与 LLM工作流集成。它们对于获取数据作为模型推理的一部分进行推理的应用程序非常重要。 🔍💨
📚 概念概览
- 文档:表示文本单元和相关元数据的基本单元。
- 向量存储:一种存储和搜索非结构化文本数据的方法。
- 检索:从存储中检索与查询最相关的数据。
🛠️ 设置你的LangChain
-
工具:Jupyter笔记本
-
安装:
langchain
,langchain-chroma
,langchain-openai
pip install langchain langchain-chroma langchain-openai
📝 文档:星际信息的基本单元
在LangChain中,每个Document
对象都是一个包含内容和元数据的包裹。就像每个星星携带着宇宙的秘密,每个文档都携带着信息和它的来源。它有两个属性:
page_content
: 表示内容的字符串metadata
: 包含任意元数据的字典
from langchain_core.documents import Document
# 创建一些示例文档
documents = [
Document(page_content="Dogs are great companions...", metadata={"source": "mammal-pets-doc"}),
# ...其他文档示例
]
在这里,source
就是“来源”的元数据。
🌌 向量存储:星际图书馆
向量存储就像一个星际图书馆,将每个文档转换成向量形式,以便在广阔的信息宇宙中快速检索。
原理?:这个想法是存储与文本关联的数字向量。给定一个查询,我们可以将其嵌入为相同维度的向量,并使用向量相似度量来识别存储中的相关数据。
🛠️ 设置你的探索工具
为了进行向量检索,我们首先需要准备一些工具:
- OpenAI Embeddings:一个强大的魔法棒,可以将文本转换为向量。
- Chroma:LangChain中的一个向量存储库,能够存储和索引这些向量。
实现?:在这里,我们将演示使用 Chroma
和 LangChain VectorStores
,其中包括内存实现。 为了实例化向量存储,我们通常需要提供一个嵌入模型来指定如何将文本转换为数字向量。在这里,我们将使用 OpenAI
嵌入。
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
# 使用OpenAI嵌入创建Chroma实例
vectorstore = Chroma.from_documents(
documents,
embedding=OpenAIEmbeddings(),
)
在此处调用.from_documents
会将文档添加到矢量存储中。VectorStore
实现用于添加文档的方法,这些文档也可以在实例化对象后调用。大多数实现都允许您连接到现有的向量存储。
🔎 检索:寻找失落的星际信息
一旦你的图书馆建立起来,就可以通过各种方法检索信息,就像使用星际地图寻找失落的星球。
# 根据相似性检索文档
vectorstore.similarity_search("cat")
🌐 流式检索:实时星际新闻
在LangChain中,检索可以是异步的,就像实时接收来自遥远星系的新闻。
# 异步检索示例
await vectorstore.asimilarity_search("cat")
🔎 根据与嵌入查询的相似性检索:
embedding = OpenAIEmbeddings().embed_query("cat")
vectorstore.similarity_search_by_vector(embedding)
🤖 检索器:你的个人星际导航员
LangChain的检索器是你的个人导航员,它可以轻松地集成到你的LangChain表达式语言链中,引导你找到正确的信息。
from langchain_core.runnables import RunnableLambda
# 创建一个简单的检索器
retriever = RunnableLambda(vectorstore.similarity_search).bind(k=1)
🧭 整合检索与生成:星际故事编织者
最后,我们将检索与生成结合起来。
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
# 定义了一个字符串模板,其中包含两个占位符: {question} 和 {context}。
message = """
Answer this question using the provided context only.
{question}
Context:
{context}
"""
# 创建一个提示模板,包含一个元组,其中 "human" 表示角色,message 字符串表示提示内容。
prompt = ChatPromptTemplate.from_messages([("human", message)])
# 创建一个RAG(检索增强生成)链
rag_chain = {"context": retriever, "question": RunnablePassthrough()} | prompt | llm
response = rag_chain.invoke("tell me about cats")
print(response.content)
# 猫是独立的宠物,经常享受自己的空间。
🎉 结语
恭喜,你已经成功构建了你的LangChain向量存储与检索系统!现在,你可以在这个星际旅程中自由探索,发现新知识,创造新故事。🚀🌌