LangGraph
LangGraph 是一个用于构建有状态、多参与者应用程序的库,非常适合创建 agentic 工作流。它提供了对应用程序流程和状态的精细控制,这对于创建可靠的 agent 至关重要。
您可以定义包含循环的流程,这对于大多数 agentic 架构至关重要,使其有别于基于 DAG 的解决方案。此外,LangGraph 包括内置的持久性,支持高级的人类参与循环和记忆功能。
LangGraph 与 LangChain 的所有组件无缝协作。这意味着我们可以利用 Qdrant 的 Langchain 集成 在 LangGraph 中创建检索节点,支持 Python 和 Javascript!
用法
- 安装所需的依赖项
$ pip install langgraph langchain_community langchain_qdrant fastembed
$ npm install @langchain/langgraph langchain @langchain/qdrant @langchain/openai
- 创建一个检索工具以添加到 LangGraph 工作流中。
from langchain.tools.retriever import create_retriever_tool
from langchain_community.embeddings import FastEmbedEmbeddings
from langchain_qdrant import FastEmbedSparse, QdrantVectorStore, RetrievalMode
# We'll set up Qdrant to retrieve documents using Hybrid search.
# Learn more at https://qdrant.org.cn/articles/hybrid-search/
retriever = QdrantVectorStore.from_texts(
url="http://localhost:6333/",
collection_name="langgraph-collection",
embedding=FastEmbedEmbeddings(model_name="BAAI/bge-small-en-v1.5"),
sparse_embedding=FastEmbedSparse(model_name="Qdrant/bm25"),
retrieval_mode=RetrievalMode.HYBRID,
texts=["<SOME_KNOWLEDGE_TEXT>", "<SOME_OTHER_TEXT>", ...]
).as_retriever()
retriever_tool = create_retriever_tool(
retriever,
"retrieve_my_texts",
"Retrieve texts stored in the Qdrant collection",
)
import { QdrantVectorStore } from "@langchain/qdrant";
import { OpenAIEmbeddings } from "@langchain/openai";
import { createRetrieverTool } from "langchain/tools/retriever";
const vectorStore = await QdrantVectorStore.fromTexts(
["<SOME_KNOWLEDGE_TEXT>", "<SOME_OTHER_TEXT>"],
[{ id: 2 }, { id: 1 }],
new OpenAIEmbeddings(),
{
url: "http://localhost:6333/",
collectionName: "goldel_escher_bach",
}
);
const retriever = vectorStore.asRetriever();
const tool = createRetrieverTool(
retriever,
{
name: "retrieve_my_texts",
description:
"Retrieve texts stored in the Qdrant collection",
},
);
- 在 LangGraph 中添加检索工具作为节点
from langgraph.graph import StateGraph
from langgraph.prebuilt import ToolNode
workflow = StateGraph()
# Define other the nodes which we'll cycle between.
workflow.add_node("retrieve_qdrant", ToolNode([retriever_tool]))
graph = workflow.compile()
import { StateGraph } from "@langchain/langgraph";
import { ToolNode } from "@langchain/langgraph/prebuilt";
// Define the graph
const workflow = new StateGraph(SomeGraphState)
// Define the nodes which we'll cycle between.
.addNode("retrieve", new ToolNode([tool]));
const graph = workflow.compile();