- 大家好,我是同学小张,日常分享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 一起交流💬,一起进步💪。
- 微信公众号也可搜【同学小张】 🙏
本站文章一览: