LangChain+Llama.cpp 本地模型与Agent工具调用

本地大模型开发已经变得十分便捷,llama.cpp 作为轻量高效的 GGUF 模型推理引擎,可以在普通 PC 上运行 Qwen、Llama 系列量化模型。LangChain 作为大模型应用编排框架,除了对接云端 OpenAI,还能对接 llama‑server 的 OpenAI 兼容接口,不仅可以实现基础对话,还能开发具备工具调用能力的 Agent 智能代理。本文将依次演示LangChain框架的安装、基础对话调用、自定义工具 Agent 开发等功能实现。

1、承接《Windows 环境下 llama.cpp 编译运行指南》部分内容,通过命令工具llama‑server启动服务,端口监听127.0.0.1:11433,并加载 qwen2.5‑1.5b‑instruct‑q4_k_m.gguf 模型,确保本地服务已经启动。

C:> llama-server.exe -m qwen2.5-1.5b-instruct-q4_k_m.gguf --host 127.0.0.1 --port 11433 -c 4096
C:> 
init: llama threadpool init, n_threads = 12
load_model: initializing, n_slots = 4, n_ctx_slot = 4096, kv_unified = 'true'
llama_server: model loaded
llama_server: listening on http://127.0.0.1:11433

2、使用清华PyPI镜像加速安装langchainlangchain‑openailangchain‑openai不只是调用 OpenAI 官方接口,也可以对接任意兼容 OpenAI 协议的本地推理服务,包括 llama‑server、vLLM 等。

C:> pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple langchain langchain_openai
C:> 
C:> pip list
-------------------- -----------
Package              Version
-------------------- -----------
langchain            1.3.15
langchain-core       1.5.5
langchain-openai     1.5.1
langchain-protocol   0.0.18
langgraph            1.2.11
langgraph-checkpoint 4.2.0
langgraph-prebuilt   1.1.0
langgraph-sdk        0.4.2
langsmith            0.11.0

3、通过LangChain调用本地llama.cpp实现简单的对话功能,使用ChatOpenAI类,修改base_url指向本地 llama‑server 的/v1地址;本地服务不需要真实密钥,api_key随便填一个字符串例如dummymodel参数填写 llama‑server 正在加载的 GGUF 模型文件名。

完整基础对话代码:

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage

if __name__ == "__main__":
    llm = ChatOpenAI(
        model="qwen2.5-1.5b-instruct-q4_k_m.gguf",
        base_url="http://127.0.0.1:11433/v1",
        api_key="dummy",
        temperature=0.7,
        max_tokens=512,
    )

    resp = llm.invoke([
        SystemMessage(content="你是简短回答助手,你的名字是小张"),
        HumanMessage(content="你好,请简单介绍一下自己?")
    ])

    print(resp.content)

4、构建具备工具调用能力的Agent代理,使用代理调用功能,大模型可以根据用户问题,自主判断是否调用外部工具函数,获取外部信息,再整理答案返回用户。

示例实现两个自定义工具:

  • get_weather(city) 模拟查询城市天气
  • get_current_time() 获取系统当前时间

通过@tool装饰器封装普通 Python 函数为 LangChain 工具;create_agent创建代理,wrap_tool_call中间件捕获工具执行异常,统一错误处理。

完整 Agent 代码:

import os,sys,time,datetime
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain.agents import create_agent
from langchain.agents.middleware import wrap_tool_call

# 定义系统提示
SYSTEM_PROMPT = '''
    你是一个助手,请简洁准确。

    你可以使用两个工具:
    - get_weather:获取给定城市的天气
    - get_current_time:获取当前系统中的日期与时间
'''

basic_model = ChatOpenAI(
    model="qwen2.5-1.5b-instruct-q4_k_m.gguf",
    base_url="http://127.0.0.1:11433/v1",
    api_key="dummy",
    temperature=0.1,
    max_tokens=512,
)

@tool
def get_weather(city: str) -> str:
    """
    获取给定城市的天气
    Args:
        city: 需要查询天气的城市名称,例如:泰安、济南
    """
    return f"城市 {city} 空气良好!"

@tool
def get_current_time():
    '''
    获取当前系统中的日期与时间
    '''
    return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

# 错误提示信息
@wrap_tool_call
def handle_tool_errors(request, handler):
    """使用自定义消息处理工具执行错误。"""
    try:
        return handler(request)
    except Exception as e:
        return ToolMessage(
            content=f"工具错误:请检查您的输入并重试。({str(e)})",
            tool_call_id=request.tool_call["id"]
        )

if __name__ == "__main__":
    agent = create_agent(
        basic_model,
        tools=[get_weather,get_current_time],
        middleware=[handle_tool_errors],
        system_prompt=SYSTEM_PROMPT
        )

    result = agent.invoke(
        {"messages": [("user", "查询当前日期与时间?")]}
    )

    for msg in result["messages"]:
        print(f"{msg.type}: {msg.content}")

利用 llama‑server 提供 OpenAI 兼容接口,几乎不用修改 LangChain 业务代码,仅更换base_url就可以无缝切换本地 GGUF 大模型。从普通对话到具备工具调用的 Agent,整套流程完全本地化,无需调用云端 API,非常适合私有化 AI 原型开发及验证。

posted @ 2026-08-17 16:52  lyshark  阅读(30)  评论(0)    收藏  举报