一个简单的langgraph agent系统

        本文基于langgraph的预制件 Agent Chat UI和《搭建一个本地langgraph服务》中的本地服务构建一个简单的agent系统。

        说明:Agent Chat UI需要nodejs版本18及以上,而nodejs18需要的glibc版本为2.28,本人使用操作系统为ubuntu18.04,glibc版本最高支持2.27,所以对glibc作了升级。最好使用ubuntu20.04。因为期间运行环境花了很多时间,在此一并把环境搭建内容写出来。

        一、安装node

        虽然安装方法很多,为避免版本问题,直接手动安装。

        1)从官网下载安装18.20.8版本安装包

        地址:https://nodejs.org/download/release/latest-hydrogen/node-v18.20.8-linux-x64.tar.gz 

        2)解压到指定目录

        #sudo tar cxf node-v18.20.8-linux-x64.tar.gz  -C /usr/local/node

        3)设置node和npm软链

        #sudo ln -s /usr/local/node/bin/node /usr/local/bin/node
        #sudo ln -s /usr/local/node/bin/npm /usr/local/bin/npm

         二、安装pnpm

         因github访问问题,需要手动下载安装文件,并修改安装包地址。

        1)下载install.sh文件

        #curl  https://get.pnpm.io/install.sh -o install.sh

       2)修改install.sh中的archive_url

        #vi install.sh       archive_url="https://hub.gitmirror.com/https://github.com/pnpm/pnpm/releases/download/v${version}/pnpm-${platform}-${arch}"
 

       3)执行安装

        #chmod u+x install.sh

        #./install.sh

       三、安装前端

        1)下载Agent Chat UI代码

        #git  clone   https://github.com/langchain-ai/agent-chat-ui.git

        2)修改配置文件

        进入应用主目录,并执行如下操作:

        #cp .env.example .env

        #vi .env

        #修改如下环境变量的值

        NEXT_PUBLIC_API_URL=http://{langgraph服务所在主机地址}:2024 
        NEXT_PUBLIC_ASSISTANT_ID=agent   #本地服务agent名(见本地服务config.json)

        3)启动前端服务

        #pnpm dev

        输出如下图所示:

        四、重启langgraph服务

        使用langgraph dev启动后端服务时,缺省使用地址为127.0.0.1,此时从浏览器访问不到,所以重启langgraph服务,并使用0.0.0.0地址。

#langgraph  dev  --host 0.0.0.0

        五、使用Agent  Chat  UI聊天

<think>我们正在讨论如何将RAGFlowAgent集成到LangGraphAgent中。根据引用[1]和[2],LangGraph一个用于构建复杂任务规划与执行Agent的框架,而RAGFlow则是一个专注于RAG(检索增强生成)的Agent。集成的主要目的是让LangGraphAgent能够利用RAGFlow的检索能力来获取外部知识,从而更好地完成复杂任务。步骤概述:1.**理解LangGraph和RAGFlow的架构**:-LangGraph基于状态机(statemachine)协调多个Agent或工具,通过节点(nodes)和边(edges)定义工作流[^1]。-RAGFlowAgent提供文档检索能力,通过向量库查询返回与用户问题相关的文档片段。2.**设计集成方案**:-将RAGFlowAgent封装为LangGraph一个工具(Tool)或节点(Node),使其可以被LangGraph的工作流调用。-在LangGraph的状态中设计一个字段(例如`knowledge`)来存储RAGFlow检索的结果。3.**具体步骤**:**步骤1:封装RAGFlowAgentLangGraph工具**-使用LangGraph的`ToolNode`或自定义节点,将RAGFlow的检索功能封装成一个可调用的函数。例如:```pythonfromlanggraph.prebuiltimportToolNodedefragflow_retriever(query:str)->str:#调用RAGFlow的API或SDK进行检索results=ragflow_client.query(query)returnresults[0].content#返回最相关的片段```然后将其包装为ToolNode:```pythonragflow_tool=ToolNode([ragflow_retriever])```**步骤2:在LangGraph工作流中定义节点和边**-创建两个节点:一个Agent节点(负责规划)和RAGFlow工具节点。-根据任务需求,设计边(条件边或普通边)来决定何时调用RAGFlow工具。例如,工作流可以这样设计:```mermaidgraphLRA(开始)-->B[主Agent]B-->C{是否需要知识?}C-->|是|D[RAGFlow工具节点]C-->|否|F[其他工具节点]D-->E[更新状态中的知识字段]E-->BF-->B```**步骤3:状态设计**-定义LangGraph的状态(State),其中包含当前任务信息、历史消息、以及检索到的知识。例如:```pythonfromtypingimportTypedDict,List,Annotatedfromlanggraph.graph.messageimportadd_messagesclassState(TypedDict):messages:Annotated[List[dict],add_messages]#对话消息历史knowledge:str#存储RAGFlow检索到的知识```**步骤4:主Agent的提示词设计**-在主Agent的提示词中,加入指令,使其在需要外部知识时主动调用RAGFlow工具。例如:"当你需要查询特定文档(如产品手册、技术文档)时,请调用RAGFlow检索工具。"**步骤5:处理RAGFlow返回结果**-在RAGFlow工具节点被调用后,将检索结果更新到状态中,并作为上下文传递给主Agent的下一次调用。4.**关键问题处理**:-**多跳检索**:如果任务需要多次检索(例如先查A文档再查B文档),LangGraph的状态机可以循环调用RAGFlow节点,每次根据前一次的结果调整查询。-**错误处理**:在边条件中设置超时或重试机制,避免RAGFlow服务不可用导致整个工作流中断。5.**部署与测试**:-使用LangGraph的`compile`方法编译工作流,并部署为API服务。-设计测试用例:验证简单检索任务和需要多步检索的复杂任务。注意:实际集成时,需要根据RAGFlow提供的API或SDK调整调用方式。如果RAGFlow有特定的认证或参数,需要在封装函数中处理。通过以上步骤,LangGraphAgent就可以在复杂任务执行过程中,动态调用RAGFlowAgent获取外部知识,从而增强其回答的准确性和信息量。相关问题:1.如何在LangGraph中处理RAGFlow检索失败的情况?2.LangGraphAgent如何协调多个RAGFlow实例进行并行检索?3.如何优化RAGFlow在LangGraph工作流中的调用频率以避免性能瓶颈?4.在LangGraph中如何实现RAGFlow检索结果的缓存机制?5.如何评估集成RAGFlow后LangGraphAgent的性能提升?</think>### LangGraph Agent 集成 RAGFlow Agent 的方法与步骤 #### 一、核心集成原理 通过 LangGraph 的**状态机架构**协调 RAGFlow 作为工具节点,实现: 1. **知识检索**:RAGFlow 作为专用检索节点处理文档查询 2. **任务编排**:LangGraph 控制多步骤工作流$$ \text{State} \rightarrow \text{Decision} \rightarrow \text{Action} $$ 3. **数据传递**:LangGraph 状态对象传递检索结果$ \text{state}[\text{"knowledge"}] = \text{RAGFlow\_output} $[^1] #### 二、详细集成步骤 ```mermaid graph TB A[LangGraph初始化] --> B[定义状态机] B --> C[创建RAGFlow工具节点] C --> D[构建工作流决策逻辑] D --> E[配置异常处理] E --> F[部署集成系统] ``` ##### 步骤1:环境准备 ```python # 安装核心库 pip install langgraph ragflow-sdk # 环境变量配置(RAGFlow API密钥) import os os.environ["RAGFLOW_API_KEY"] = "your_api_key" ``` ##### 步骤2:定义状态对象 ```python from typing import TypedDict, Annotated from langgraph.graph.message import add_messages class AgentState(TypedDict): user_query: str knowledge: Annotated[list, add_messages] # 存储RAGFlow检索结果 tool_calls: dict # 工具调用记录 ``` ##### 步骤3:创建RAGFlow工具节点 ```python from langgraph.prebuilt import ToolNode from ragflow import RAGClient def ragflow_retriever(query: str): client = RAGClient(endpoint="https://api.ragflow.com") return client.query( query=query, top_k=3, score_threshold=0.7 ) # 封装为LangGraph节点 ragflow_node = ToolNode([ragflow_retriever]) ``` ##### 步骤4:构建工作流 ```python from langgraph.graph import END, StateGraph # 初始化状态机 workflow = StateGraph(AgentState) # 添加节点 workflow.add_node("retriever", ragflow_node) # RAGFlow节点 workflow.add_node("llm_processor", llm_agent) # 假设已定义LLM处理节点 # 设置边条件 def should_retrieve(state): return "需要文档检索" in state["user_query"] # 基于语义判断 workflow.add_conditional_edges( "start", should_retrieve, { True: "retriever", False: "llm_processor" } ) # 连接节点 workflow.add_edge("retriever", "llm_processor") # 检索结果传递给LLM workflow.add_edge("llm_processor", END) # 编译工作流 app = workflow.compile() ``` ##### 步骤5:执行集成系统 ```python # 运行示例 inputs = {"user_query": "解析2024年Q3财报中的$EBITDA$数据"} result = app.invoke(inputs) # 输出结构 { "user_query": "...", "knowledge": [ {"document": "2024_Q3_Report.pdf", "text": "EBITDA达到$5.2B...", "score": 0.85}, ... ], "tool_calls": {"retriever_calls": 1} } ``` #### 三、关键优化点 1. **混合检索策略**: ```python # 在ragflow_retriever中增加关键词过滤 client.query(..., filter_rules={"date": "2024-07~2024-09"}) ``` 2. **结果缓存机制**: ```python from langgraph.checkpoint import MemorySaver workflow = StateGraph(AgentState, checkpoint=MemorySaver()) ``` 3. **动态分块控制**: ```python # 根据查询类型调整分块策略 if "表格" in query: chunk_mode = "TABLE" elif "公式" in query: chunk_mode = "LATEX" ``` #### 四、常见问题解决方案 | 问题类型 | 解决方案 | |---------|----------| | 检索超时 | 设置`timeout=10.0`并添加重试机制 | | 结果碎片化 | 在LLM节点添加结果聚合提示词 | | 权限控制 | 集成前校验`state["user_role"]` | | 版本冲突 | 使用容器化部署隔离环境 | #### 五、性能评估指标 $$ \text{Acc} = \frac{\text{正确检索次数}}{\text{总调用次数}} \times 100\% $$ $$ \text{Latency} = t_{\text{ragflow}} + t_{\text{langgraph}} $$ 建议基准: - 准确率 > 85% - 平均延迟 < 2.5s --- ### 相关问题 1. 如何优化 LangGraph 中 RAGFlow 节点的检索精度? 2. 在资源受限环境下如何降低 RAGFlow+LangGraph 的内存消耗? 3. LangGraph 如何协调多个 RAGFlow 实例实现负载均衡? 4. 如何设计 RAGFlow 检索结果的缓存策略以提升性能? 5. LangGraph 工作流中如何处理 RAGFlow 的增量更新需求?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值