【AI大模型应用开发】【LangChain系列】10. 实用技巧:如何使用已经存在的向量数据库作为 Retriever?

  • 大家好,我是同学小张,日常分享AI知识和实战案例
  • 欢迎 点赞 + 关注 👏,持续学习持续干货输出
  • +v: jasper_8017 一起交流💬,一起进步💪。
  • 微信公众号也可搜【同学小张】 🙏

本站文章一览:

在这里插入图片描述


0. 背景

我们之前做的所有RAG实践以及LangChain实践,用到向量数据库时,都是临时创建一个向量数据库,然后将加载到的数据写入这个临时的数据库中。最后将临时的数据库作为Retriever去检索。当程序运行结束后,这个数据就被消灭了,下一次运行该程序,又得去拉一遍数据,切分一遍,创建一遍,灌入一遍数据。

类似这篇文章(【AI大模型应用开发】【LangChain系列】实战案例5:用LangChain实现灵活的Agents+RAG,该查时查,不该查时就别查)中的实现,每次运行程序,以下代码都得重新算一遍:

在这里插入图片描述

这种方式在学习阶段是挺方便的,但正常的工程化项目,知识库一般是需要持久化存在的。这样不用重复地去处理数据,保存数据,节省大量的计算资源。

本文来学习下如何将向量数据库持久化存储,并且如何在一个新的工程项目中使用上该向量数据库。

1. 向量数据库持久化存储

我们之前实现的向量数据库代码如下:

vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())
# Retrieve and generate using the relevant snippets of the blog.
retriever = vectorstore.as_retriever()

要想将其持久化,只需要传入持久化目录:

vectorstore = Chroma(embedding_function=OpenAIEmbeddings(), persist_directory="./chroma.db")

修改后的完整代码如下:

from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import Chroma
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter

# Load, chunk and index the contents of the blog.
loader = WebBaseLoader(
    web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",),
    bs_kwargs=dict(
        parse_only=bs4.SoupStrainer(
            class_=("post-content", "post-title", "post-header")
        )
    ),
)
docs = loader.load()

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings(), persist_directory="./chroma.db")

运行后,在持久化目录下,会看到对应的数据库文件:

在这里插入图片描述

2. 使用已有的向量数据库

现在来看下下次运行,如何使用这个已有的向量数据库。

上面我们第一次创建向量数据库,往里面灌入数据时,使用的是 from_documents,这是创建 + 灌入数据。

现在我们不需要灌入数据,那直接用 Chroma 实例化一个对象即可,实例化时传入其所在的路径,同时也要传入 embedding 参数,毕竟在查询时,也要将问题向量化,需要使用这个参数。实例化代码如下:

vectorstore = Chroma(embedding_function=OpenAIEmbeddings(), persist_directory="./chroma.db")

然后在代码中就可以直接用了。使用的示例代码如下:

import bs4
from langchain import hub
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

vectorstore = Chroma(embedding_function=OpenAIEmbeddings(), persist_directory="./chroma.db")

# Retrieve and generate using the relevant snippets of the blog.
retriever = vectorstore.as_retriever()

from langchain.tools.retriever import create_retriever_tool

tool = create_retriever_tool(
    retriever,
    "search_agents_answer",
    "Searches and returns context from LLM Powered Autonomous Agents. Answering questions about the agents.",
)
tools = [tool]

from langchain import hub

prompt = hub.pull("hwchase17/openai-tools-agent")

prompt.pretty_print()

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(temperature=0)

from langchain.agents import AgentExecutor, create_openai_tools_agent

agent = create_openai_tools_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

result = agent_executor.invoke({"input": "hi, 我是【同学小张】"})

print(result["output"])

result = agent_executor.invoke(
    {
        "input": "What is Task Decomposition?"
    }
)

print("output2: ", result["output"])

运行结果:

在这里插入图片描述
这样,我们只需要加载一次网址,灌入一次数据,后面无论运行多少次项目,都不用再重复加载网页数据和灌入向量数据库了。

如果觉得本文对你有帮助,麻烦点个赞和关注呗 ~~~


  • 大家好,我是 同学小张,日常分享AI知识和实战案例
  • 欢迎 点赞 + 关注 👏,持续学习持续干货输出
  • +v: jasper_8017 一起交流💬,一起进步💪。
  • 微信公众号也可搜同学小张 🙏

本站文章一览:

在这里插入图片描述

  • 28
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

同学小张

如果觉得有帮助,欢迎给我鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值