终于有了!!!基于Langgraph使用本地LLM搭建agent!!!

需求

Langchain是使用闭源LLM实现agent搭建的,Langgraph官网给的例子是基于Claude,其他一些agent例子也是基于OPENAI的,但是对于很多私有化场景,使用本地LLM搭建agent是非常重要的。但是网上并没有相关的教程,捣鼓了两天,捣鼓出来Ollama+Langgraph实现的基于本地LLM的agent搭建

模型部署

具体的模型部署可以看我之前的文章,Ollama部署

inference_server_url = "http://localhost:11434/v1"
from langchain_openai import ChatOpenAI

model = ChatOpenAI(
    model="qwen2.5:14b",
    openai_api_key="none",
    openai_api_base=inference_server_url,
    max_tokens=500,
    temperature=1,
)

核心代码

from typing import Literal
from langchain_core.tools import tool
from langgraph.prebuilt import ToolNode
from langgraph.graph import StateGraph, END
from langgraph.graph import END, START, StateGraph, MessagesState

@tool
def search(query: str):
    """Call to surf the web."""
    # This is a placeholder, but don't tell the LLM that...
    if "sf" in query.lower() or "san francisco" in query.lower():
        return "It's 60 degrees and foggy."
    return "It's 90 degrees and sunny."
 
tools = [search]
tool_node = ToolNode(tools)
model_with_tools = model.bind_tools(tools)


# Define the function that determines whether to continue or not
def should_continue(state: MessagesState) -> Literal["tools", END]:
    messages = state['messages']
    last_message = messages[-1]
    # If there is no function call, then we finish
    if last_message.tool_calls:
        return "tools"
    # Otherwise, we stop (reply to the user)
    return END
    

# Define the function that calls the model
def call_model(state):
    messages = state['messages']
    response = model_with_tools.invoke(messages)
    # We return a list, because this will get added to the existing list
    return {"messages": [response]}
 
# Define a new graph
workflow = StateGraph(MessagesState)
 
# Define the two nodes we will cycle between
workflow.add_node("agent", call_model)
workflow.add_node("tools", tool_node)
workflow.add_edge(START, "agent")

# We now add a conditional edge
workflow.add_conditional_edges(
    "agent",
    should_continue,
)
workflow.add_edge('tools', 'agent')
app = workflow.compile()    

response = app.invoke(
    {"messages": ["what is the weather in sf"]},
    config={"configurable": {"thread_id": 42}}
)
print(response['messages'][-1].content)
print(response)
### 封装 Qwen 模型使用 LangGraph 的方法 为了实现 Qwen 模型在 LangGraph 中的应用,可以遵循特定的技术栈配置以及集成流程。技术栈的选择对于成功部署至关重要,其中包括前端 Vue.js 和 logicflow, 后端 Python/Django, 并利用 PostgreSQL/pgvector 作为向量数据库支持[^3]。 具体到 Qwen 模型的封装,主要涉及创建一个能够有效调用该模型的服务接口,并确保此服务能被其他组件无缝访问。下面是一个简化版的例子展示如何通过 LangChain4j 实现这一目标: #### 创建 Qwen 调用类 首先定义用于与 Qwen 大规模语言模型交互的具体逻辑。这通常涉及到设置 API 请求参数、发送请求至指定服务器地址并处理返回的数据。 ```java import com.kvenlin.springlangchaindemo.qwen.QwenClient; public class QwenService { private final QwenClient qwenClient; public QwenService(QwenClient client){ this.qwenClient = client; } /** * 使用Qwen客户端获取响应消息. */ public String getMessage(String inputText) throws Exception{ return qwenClient.sendMessage(inputText); } } ``` #### 集成 Qwen 到 LangGraph 工作流中 接下来,在应用程序的工作流里引入上述 `QwenService` 类实例,以便可以在适当时候触发对 Qwen 模型的查询操作。这里假设已经存在某种形式的任务调度机制来管理不同阶段之间的流转。 ```java // 假设有一个名为agent_executor的对象负责整体任务执行控制 String exampleQuery = "请提供关于量子计算的基础介绍"; try (var service = new QwenService(new QwenClient())) { // 初始化Qwen服务对象 var messages = List.of(("user", exampleQuery)); // 构建对话记录列表 var events = agent_executor.stream( Map.of("messages", messages), "values" ); for(var event : events){ // 迭代输出每次接收到的信息更新 System.out.println(event.getMessages().get(-1).getContent()); } } catch(Exception e){ throw new RuntimeException(e); // 错误处理 } ``` 以上代码片段展示了如何将 Qwen 模型融入基于 LangGraph 的应用框架内,从而允许开发者轻松地扩展其自然语言理解能力。需要注意的是实际项目开发过程中还需考虑更多细节如安全性验证、性能优化等方面的问题[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛右刀薛面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值