构建LangChain应用程序的示例代码:9、使用Anthropic API生成结构化输出的工具教程

使用Anthropic API生成结构化输出的工具

Anthropic API最近增加了工具使用功能。

这对于生成结构化输出非常有用。

! pip install -U langchain-anthropic

可选配置:

import osos.environ['LANGCHAIN_TRACING_V2'] = 'true'  # 启用追踪
os.environ['LANGCHAIN_API_KEY'] =  # 设置你的API密钥

我们如何使用工具来产生结构化输出?

函数调用/工具使用仅生成有效载荷。

有效载荷通常是JSON字符串,可以传递给API,或者在本例中,传递给解析器以产生结构化输出。

LangChain提供了llm.with_structured_output(schema),使得生成符合模式的结构化输出变得非常容易。
在这里插入图片描述

from langchain_anthropic import ChatAnthropic
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field# 数据模型
class Code(BaseModel):"""代码输出"""# LLM
llm = ChatAnthropic(model="claude-3-opus-20240229",default_headers={"anthropic-beta": "tools-2024-04-04"},
)# 结构化输出,包括原始内容将捕获原始输出和解析器错误
structured_llm = llm.with_structured_output(Code, include_raw=True)
code_output = structured_llm.invoke("Write a python program that prints the string 'hello world' and tell me how it works in a sentence"
)

初始推理阶段:

code_output["raw"].content[0]

工具调用:

code_output["raw"].content[1]

JSON字符串:

code_output["raw"].content[1]["input"]

错误:

error = code_output["parsing_error"]
error

结果:

parsed_result = code_output["parsed"]

Python:

parsed_result.prefix

Python:

parsed_result.imports

Python:

parsed_result.code

更具挑战性的例子:

动机例子,用于工具使用/结构化输出。
在这里插入图片描述

这里是我们想要回答有关代码问题的一些文档。

from bs4 import BeautifulSoup as Soup
from langchain_community.document_loaders.recursive_url_loader import RecursiveUrlLoaderLCEL文档url = "https://python.langchain.com/docs/expression_language/"
loader = RecursiveUrlLoader(url=url, max_depth=20, extractor=lambda x: Soup(x, "html.parser").text
)
docs = loader.load()根据URL对列表进行排序并获取文本d_sorted = sorted(docs, key=lambda x: x.metadata["source"])
d_reversed = list(reversed(d_sorted))
concatenated_content = "\n\n\n --- \n\n\n".join([doc.page_content for doc in d_reversed]
)

问题:

如果我们想强制使用工具怎么办?

我们可以使用回退策略。

让我们选择一个代码生成提示,根据我的一些测试,它没有正确调用工具。

我们看看是否可以纠正这个问题。

# 此代码生成提示调用工具使用
code_gen_prompt_working = ChatPromptTemplate.from_messages([("system",""" You are a coding assistant with expertise in LCEL, LangChain expression language.
Here is the LCEL documentation:-------
{context}-------
Answer the user question based on the
above provided documentation. Ensure any code you provide can be executed with all required imports and variables
defined. Structure your answer: 1) a prefix describing the code solution, 2) the imports, 3) the functioning code block.
Invoke the code tool to structure the output correctly.Here is the user question:""",),("placeholder", "{messages}"),]
)# 此代码生成提示没有调用工具使用
code_gen_prompt_bad = ChatPromptTemplate.from_messages([("system","""You are a coding assistant with expertise in LCEL, LangChain expression language.
Here is a full set of LCEL documentation:-------
{context}-------
Answer the user question based on the above provided documentation. Ensure any code you provide can be executed
with all required imports and variables defined. Structure your answer with a description of the code solution.Then list the imports. And finally list the functioning code block. Here is the user question:""",),("placeholder", "{messages}"),]
)

数据模型:

class Code(BaseModel):"""代码输出"""

LLM:

llm = ChatAnthropic(model="claude-3-opus-20240229",default_headers={"anthropic-beta": "tools-2024-04-04"},
)

结构化输出:

包括原始内容将捕获原始输出和解析器错误

structured_llm = llm.with_structured_output(Code, include_raw=True)

检查错误:

def check_claude_output(tool_output):"""检查解析错误或未能调用工具"""

带有输出检查的链:

code_chain = code_gen_prompt_bad | structured_llm | check_claude_output

让我们添加检查并重试。

def insert_errors(inputs):"""在消息中插入错误"""

这将作为回退链运行。

fallback_chain = insert_errors | code_chain
N = 3  # 最大重试次数
code_chain_re_try = code_chain.with_fallbacks(fallbacks=[fallback_chain] * N, exception_key="error"
)

测试:

messages = [("user", "How do I build a RAG chain in LCEL?")]
code_output_lcel = code_chain_re_try.invoke({"context": concatenated_content, "messages": messages}
)

Python:

parsed_result_lcel = code_output_lcel["parsed"]

Python:

parsed_result_lcel.prefix

Python:

parsed_result_lcel.imports

Python:

parsed_result_lcel.code

示例跟踪捕获错误并纠正:

跟踪链接


介绍了如何使用Anthropic API来生成结构化输出。它首先建议安装langchain-anthropic库,然后通过设置环境变量启用追踪和API密钥。文件中展示了如何定义数据模型,创建ChatAnthropic实例,并使用with_structured_output方法来生成符合特定模式的结构化输出。接着,通过示例代码演示了如何调用API、处理原始输出、捕获解析错误,并展示了如何通过回退机制和错误检查来增强工具调用的鲁棒性。最后,提供了一个测试用例,展示了如何使用构建的链来回答问题并获取结构化代码输出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/21737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

echarts-series的x,y轴的规则

series的data与x,y轴的匹配规则 如果series的data为[1,2,3,4,5,6] 1.如果x,y轴都是类目轴,且data没有与x,y轴的值匹配上,则无效。 2.如果x,y轴都为类目,data中能够跟类目轴上的字符串对应上,轴,有效。 3.如果都为value.,则按数值…

实验四:基于System-Verilog的FPGA设计与仿真

实验四:基于System-Verilog的FPGA设计与仿真 实验目的: 学习和掌握System Verilog基本语法,在DE2-115开发板上重新设计之前做过的Verilog练习,如流水灯、全加器或者VGA显示、超声波测距 等,并完成 testbench 仿真。 …

定时开放防火墙端口,并自动关闭

限时开放端口脚本 manage_port.sh 使用说明 简介 manage_port.sh 是一个用于在 Linux 系统上临时开放并随后关闭指定端口的脚本。该脚本接受端口号和时间(以分钟为单位)作为参数,并根据系统自动检测使用 ufw 或 firewalld 防火墙来管理端口…

【贪心算法·哈夫曼编码问题】从定长编码和不定长编码讲到最小化带权路径长度和

一、问题介绍 1.1:编码问题 首先,我们知道,数字字符等任何数据的底层,都是以二进制(0,1序列)的方式存储在计算机内的。 对于“编码”其实就是那些能显示在计算机屏幕上的:不同字母、汉字、字…

半导体光子电学期末笔记2: 光子晶体 Photonic crystals

光子晶体概述 光子晶体定义和分类 [P4-5] 光子晶体是一种在一维、二维或三维空间内周期性排列的多层介质。这些结构通过在光子尺度上排列的重复单元,可以对光进行调控和控制。具体来说,光子晶体是指那些在空间上具有周期性排列的介质结构,它…

C++中的‘位’操作

目录 摘要 基本位操作 1. 按位与(AND)&: 2. 按位或(OR)|: 3. 按位异或(XOR)^: 4. 按位取反(NOT)~: 5. 左移(Le…

JavaWeb学习:Vue+Element-plus实现文件上传

需求: JavaWeb的购物车系统需要实现新增商品的功能。商品的展示图片需要与商品的基础信息一同上传至服务器,图片保存路径则随基础信息异同保存至数据库。 实现: 前端: 1. 选择相应的文件上传组件: 选择点击按钮手…

【深度学习】温故而知新4-手写体识别-多层感知机+CNN网络-完整代码-可运行

多层感知机版本 import torch import torch.nn as nn import numpy as np import torch.utils from torch.utils.data import DataLoader, Dataset import torchvision from torchvision import transforms import matplotlib.pyplot as plt import matplotlib import os # 前…

wvp-gb28181-pro搭建流媒体服务器,内存占用过高问题

直接给出解决办法,端口暴露的太多了,暴露了500个端口导致从3g---->11g 遇到的问题,直接使用镜像《648540858/wvp_pro:latest》在宿主机上运行,如我下面的博客 https://blog.csdn.net/weixin_41012767/article/details/137112338?spm100…

FASTGPT:可视化开发、运营和使用的AI原生应用

近年来,随着人工智能(AI)技术的迅猛发展,AI的应用逐渐渗透到各行各业。作为一种全新的开发模式,AI原生应用正逐步成为行业的焦点。在这方面,FASTGPT无疑是一款颇具代表性的产品。本文将详细介绍FASTGPT的设…

面向对象编程高级概念详解

面向对象编程(Object-Oriented Programming, OOP)不仅是一种编程范式,更是一种思考和设计软件的方法。本文将深入探讨OOP中的几个核心概念,包括析构函数、深浅拷贝、静态成员、单例模式、操作符重载、友元以及前与后的区别&#x…

Appium自动化环境搭建保姆级教程

APP自动化测试运行环境比较复杂,稍微不注意安装就会失败。我见过不少朋友,装了1个星期,Appium 的运行环境还没有搭好的。 搭建环境本身不是一个有难度的工作,但是 Appium 安装过程中确实存在不少隐藏的比较深的坑,如果…

用友NC pagesServlet SQL注入致RCE漏洞复现(XVE-2024-13067)

0x01 产品简介 用友NC是由用友公司开发的一套面向大型企业和集团型企业的管理软件产品系列。这一系列产品基于全球最新的互联网技术、云计算技术和移动应用技术,旨在帮助企业创新管理模式、引领商业变革。 0x02 漏洞概述 用友NC /portal/pt/servlet/pagesServlet/doPost接口…

操作系统入门系列-MIT6.828(操作系统工程)学习笔记(三)---- xv6初探与实验一(Lab: Xv6 and Unix utilities)

系列文章目录 操作系统入门系列-MIT6.S081(操作系统)学习笔记(一)---- 操作系统介绍与接口示例 操作系统入门系列-MIT6.828(操作系统工程)学习笔记(二)----课程实验环境搭建&#x…

SM国密加密算法简介

国密(商密)算法算法类型是否公开技术特点应用场景SM1对称密码算法否,需要加密芯片的接口进行调用加密强度与AES相当电子政务/商务,智能IC卡、加密卡等SM2非对称密码算法是基于ECC,签名速度与密钥生成速度快于RSA&#…

Vue3 全屏组件 源码

在Vue 3中&#xff0c;实现了全屏功能的组件&#xff0c;开箱即用。 使用了screenfull依赖库&#xff0c;可以省去浏览器适配的麻烦。 代码如下&#xff1a; <template><div ref"myFullScreen" ><slot></slot></div> </template…

ResizeObserver监听画布尺寸改变动态渲染echarts

前言&#xff1a; 在日常开发中有时遇到同数据相关的业务可能会用到echarts插件。一般在封装echarts组件的时候大家可能都会通过windows对象监听浏览器窗口大小的改变动态渲染echarts,这样当echarts窗口改变导致echarts画布元素大小改变的同时&#xff0c;就能调用相关api进行重…

RocketMQ相关知识知多少

一、RocketMQ的定义 官网网址&#xff1a;领域模型概述 | RocketMQ Apache RocketMQ 自诞生以来&#xff0c;因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余年的大规模场景打磨&#xff0c;RocketMQ 已经成为业内共识的金…

Flink的简单学习二

一 Flink的核心组件 1.1 client 1.将数据流程图DataFlow发送给JobManager。 1.2 JobManager 1.收集client的DataFlow图&#xff0c;将图分解成一个个的task任务&#xff0c;并返回状态更新数据给client 2.JobManager负责作业调度&#xff0c;收集TaskManager的Heartbeat和…

方法调研:DDOS检测有哪些方法?

检测DDoS攻击的方法多种多样,主要可以归纳为以下几类:流量分析、行为分析、协议分析、分布式检测和基于机器学习的方法。每种方法都有其独特的优势和适用场景。以下是这些方法的详细介绍: 1. 流量分析 基线分析 原理:建立正常流量的基线,通过比较当前流量与基线的偏差来…