使用LangServe、LangGraph和Milvus构建智能RAG应用

2024-12-03

By Stephen Batifol

使用LangServe、LangGraph和Milvus构建智能RAG应用

这篇文章是我的上一篇关于“使用LangGraph和Llama 3构建本地代理RAG”的文章的后续。在这篇文章中,我们将探索如何使用LangChain生态系统中的两个强大工具LangServe和LangGraph来构建应用程序。我们还将使用Milvus作为向量数据库。我们将向您展示如何设置FastAPI应用程序,配置LangServe和LangGraph,并使用Milvus进行高效的数据检索。

您将学到什么

  • 设置带有LangServe和LangGraph的FastAPI应用程序。
  • 集成Milvus进行向量存储和检索。
  • 使用LangGraph构建LLM代理。

前提条件

在我们开始之前,请确保您已经安装了以下依赖项:

  • Python 3.9+
  • Docker
  • 对FastAPI和Docker有基本了解

LangServe和Milvus简介

LangServe是FastAPI的扩展,旨在简化利用LangChain创建动态且功能强大的端点的过程。它允许您定义可以作为API端点公开的复杂处理工作流。

LangGraph是Langchain的扩展,旨在通过将步骤建模为图中的边和节点,构建具有LLMs的健壮且有状态的多代理应用程序。

Milvus是一个为扩展而构建的高性能开源向量数据库。Milvus Lite是Milvus的轻量级和本地版本,可以在您的个人设备上运行,无需Docker或Kubernetes。

使用LangGraph构建工具调用代理

在我们的上一篇博客文章中,我们讨论了LangGraph如何通过启用工具调用显著增强语言模型的能力。在这里,我们将展示如何使用LangServe构建这样的代理,并使用Docker在各种基础设施上部署它们。

代理RAG简介

代理可以将语言模型转变为强大的推理引擎,确定行动,执行它们,并评估结果。这个过程被称为代理RAG(检索增强生成)。代理可以:

  • 执行网络搜索
  • 浏览电子邮件
  • 对检索到的文档进行自我反思或自我评分
  • 执行自定义的用户定义功能
  • 等等…

设置事项

  • LangGraph:LangChain的扩展,用于使用图来建模步骤和决策,构建具有LLMs的状态应用程序。
  • Ollama & Llama 3:Ollama允许本地运行开源语言模型,如Llama 3,允许离线使用并提供更大的控制权。
  • Milvus Lite:Milvus的本地版本,适用于在个人设备上运行的高效向量存储和检索。

使用LangServe和Milvus

LangServe允许您将复杂的处理工作流作为API端点公开。我们在这里展示了一个名为analyze_text的函数示例,我们向我们的FastAPI应用程序添加了/analyze端点,使其可以被查询。

定义您的FastAPI应用程序

import uvicorn

from fastapi import FastAPI
from pydantic import BaseModel
from langchain_core.runnables import RunnableLambda
from langserve import add_routes


# Define Pydantic model for request body
class QuestionRequest(BaseModel):
    question: str

fastapi_app = FastAPI()

# Define LangServe route for text analysis
@fastapi_app.post("/analyze")
async def analyze_text(request: QuestionRequest):
    # Simulate text analysis (replace with your actual LangServe logic)
    entities = ["entity1", "entity2"]
    processed_data = f"Processed entities: {entities}"
    return {"entities": entities, "processed_data": processed_data}
add_routes(fastapi_app, RunnableLambda(analyze_text))

if __name__ == "__main__":
    uvicorn.run(fastapi_app, host="0.0.0.0", port=5001)

集成LangGraph进行工作流管理

使用LangGraph构建自定义的Llama3驱动的RAG代理,它可以处理各种任务,如将用户查询路由到最合适的检索方法或执行自我纠正以提高答案质量。请随意查看我们关于LangGraph的博客,看看如何做到这一点。

利用Milvus进行高效的数据检索

集成Milvus以高效地存储和检索向量数据。这一步将使您能够快速访问相关信息并提高应用程序的性能。

from langchain_core.documents import Document

def load_and_split_documents(urls: list[str]) -> list[Document]:
    docs = [WebBaseLoader(url).load() for url in urls]
    docs_list = [item for sublist in docs for item in sublist]
    text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(chunk_size=250, chunk_overlap=0)
    return text_splitter.split_documents(docs_list)

def add_documents_to_milvus(doc_splits: list[Document], embedding_model: Embeddings, connection_args: Any):
    vectorstore = Milvus.from_documents(documents=doc_splits, collection_name="rag_milvus", embedding=embedding_model, connection_args=connection_args)
    return vectorstore.as_retriever()

urls = [
"https://lilianweng.github.io/posts/2023-06-23-agent/",
"https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/",
"https://lilianweng.github.io/posts/2023-10-25-adv-attack-llm/",
]

doc_splits = load_and_split_documents(urls)
embedding_model = HuggingFaceEmbeddings()
connection_args = {"uri": "./milvus_rag.db"}
retriever = add_documents_to_milvus(doc_splits, embedding_model, connection_args)

#Function that the Agent will call when needed.
def retrieve(state: Dict[str, Any]) -> Dict[str, Any]:
    print("---RETRIEVE---")
    question = state["question"]
    documents = retriever.invoke(question)
    return {"documents": [doc.page_content for doc in documents], "question": question}

请随意查看我GitHub上的代码

结论

在这篇博客文章中,我们已经展示了如何使用LangServe、LangGraph、Llama 3和Milvus构建RAG系统。这些代理通过整合规划、记忆和工具使用,增强了LLM的能力,从而产生更健壮和信息丰富的响应。通过集成LangServe,您可以将这些复杂的工作流作为API端点公开,使构建和部署智能应用程序变得更加容易。

如果您喜欢这篇博客文章,请考虑在Github上给我们一个星标,并加入我们的Discord,与社区分享您的经历。

注:本文为AI翻译,查看原文

  • Stephen Batifol

    Stephen Batifol

    Developer Advocate

    准备好开始了吗?

    立刻创建 Zilliz Cloud 集群,存储和检索您的向量。

    免费试用 Zilliz Cloud