- 大家好,我是同学小张,日常分享AI知识和实战案例
- 欢迎 点赞 + 关注 👏,持续学习,持续干货输出。
- 一起交流💬,一起进步💪。
- 微信公众号也可搜【同学小张】 🙏
本站文章一览:
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知识和实战案例
- 欢迎 点赞 + 关注 👏,持续学习,持续干货输出。
- 一起交流💬,一起进步💪。
- 微信公众号也可搜【同学小张】 🙏
本站文章一览: