0

0

如何在 LangChain 中将自定义工具与 Llama 2 模型无缝集成

碧海醫心

碧海醫心

发布时间:2025-12-27 13:40:28

|

212人浏览过

|

来源于php中文网

原创

如何在 LangChain 中将自定义工具与 Llama 2 模型无缝集成

本文详解如何解决 llama 2 与 langchain 自定义工具(如计算器)集成时常见的“could not parse llm output”错误,核心在于适配 llama 2 的非结构化文本输出——通过定制 outputparser 实现 json 格式指令解析,并推荐更兼容的 agent 类型。

Llama 2(尤其是 llama-2-70b-chat 等开源大模型)默认以自由文本形式生成响应,而 LangChain 的 STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION Agent 严格依赖结构化 JSON 输出(如 {"action": "Calculator", "action_input": "2 + 3"})来识别并调用工具。当 Llama 2 返回自然语言描述(例如:“我将使用计算器计算 2 加 3”)时,Agent 内置的 ReActJsonOutputParser 无法解析,从而抛出 Could not parse LLM output 错误。

✅ 正确做法是:绕过默认 parser,改用支持自由文本推理的 Agent + 自定义 OutputParser。推荐以下组合:

墨刀AIPPT
墨刀AIPPT

排版/配图/美化一键优化,3分钟产出专业级PPT

下载
  1. 选用 OpenAIFunctionsAgent 或 ToolCallingAgent(LangChain v0.1+)
    这些 Agent 原生支持函数调用协议(即使后端非 OpenAI),可配合 Llama 2 的函数调用微调版本(如 llama-2-70b-chat-function-calling)或通过 prompt engineering 模拟函数调用格式。

  2. 若使用基础 Llama 2(无函数调用微调),必须自定义 OutputParser
    示例代码(基于 llama-cpp-python 或 transformers 加载模型):

from langchain_core.output_parsers import BaseOutputParser
from langchain_core.agents import AgentAction, AgentFinish
import re
import json

class Llama2ReActOutputParser(BaseOutputParser):
    def parse(self, text: str) -> AgentAction | AgentFinish:
        # 匹配 Llama 2 常见的 ReAct 风格输出(支持中文/英文混合)
        if "Final Answer:" in text:
            return AgentFinish(return_values={"output": text.split("Final Answer:")[-1].strip()}, log=text)

        # 尝试提取 action 和 action_input(兼容多种格式)
        action_match = re.search(r"Action:\s*(\w+)", text)
        input_match = re.search(r"Action Input:\s*(.*)", text, re.DOTALL)

        if action_match and input_match:
            action = action_match.group(1).strip()
            action_input = input_match.group(1).strip().strip('"\'')
            try:
                # 尝试 JSON 解析 action_input(如为 JSON 字符串)
                parsed_input = json.loads(action_input)
                return AgentAction(tool=action, tool_input=parsed_input, log=text)
            except (json.JSONDecodeError, ValueError):
                return AgentAction(tool=action, tool_input=action_input, log=text)

        raise ValueError(f"Could not parse LLM output: {text}")

# 使用示例
from langchain_community.llms import LlamaCpp
from langchain.agents import AgentExecutor, create_structured_chat_agent

llm = LlamaCpp(
    model_path="./models/llama-2-70b-chat.Q4_K_M.gguf",
    temperature=0.1,
    max_tokens=512,
    top_p=1,
    verbose=False,
)

# 自定义工具(如 Calculator)
from langchain.tools import StructuredTool
def calculate(expression: str) -> str:
    try:
        return str(eval(expression))
    except:
        return "Invalid expression"

calculator = StructuredTool.from_function(
    func=calculate,
    name="Calculator",
    description="Useful for performing arithmetic calculations. Input must be a valid Python expression (e.g., '2 + 3 * 4')."
)

prompt = hub.pull("hwchase17/structured-chat-agent")
agent = create_structured_chat_agent(
    llm=llm,
    tools=[calculator],
    prompt=prompt,
    output_parser=Llama2ReActOutputParser()  # 关键:注入自定义 parser
)

agent_executor = AgentExecutor(agent=agent, tools=[calculator], verbose=True)

⚠️ 注意事项:

  • Prompt 工程至关重要:确保使用的 Prompt 模板(如 hwchase17/structured-chat-agent)明确要求 Llama 2 以 Action: / Action Input: / Final Answer: 格式输出,避免自由发挥。
  • 避免 STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION 直接搭配原生 Llama 2:该 Agent 对输出格式容错性极低,建议优先尝试 create_openai_functions_agent(配合 llm.bind_tools())或升级至 LangChain 0.1.20+ 的 create_tool_calling_agent。
  • 多输入工具支持:StructuredTool 天然支持 Pydantic 模型定义多参数(如 def search(query: str, site: str, timeout: int = 5)),无需额外配置;Agent 会自动解析结构化输入。

总结:Llama 2 与 LangChain 工具链集成失败,本质是“LLM 输出格式”与“Agent 解析协议”不匹配。解决方案不是更换模型,而是精准定制 OutputParser + 选择语义兼容的 Agent 类型 + 强化 Prompt 约束。参考 Pinecone 官方 Llama 2 Agent 示例 可快速验证完整流程。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

453

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

331

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

950

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

604

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

212

2025.08.29

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

1

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.8万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号