langchain实现大模型结构化输出

news2024/12/23 17:09:19

文章目录

  • 前言
  • 大模型对话函数
  • 返回列表格式
  • 返回对象类型
  • 返回对象格式(信息抽取)
  • 返回json格式
  • 做选择题(在给定答案中选一个答案)

前言

这里大模型使用GLM4。
结构化输出的稳定性与大模型的能力挂钩
听话的就容易出
不听话的就容易报错
langchain实现大模型结构化输出,实际上就帮助我们构建一套提示词
对模型的约束也是十分有限的
但是仍然可以用

大模型对话函数

import requests
import json
from typing import *

from openai import OpenAI

base_url = "http://127.0.0.1:8023/v1/"
client = OpenAI(api_key="EMPTY", base_url=base_url)

def simple_chat(use_stream=False, query=None):
    messages = []
    messages.append(
        {
            "role": "user",
            "content": query
        }
    )
    response = client.chat.completions.create(
        model="glm-4",
        messages=messages,
        stream=use_stream,
        max_tokens=256,
        temperature=0.4,
        presence_penalty=1.2,
        top_p=0.8,
    )

    # 检查响应是否存在并且有 'choices' 键
    if response and hasattr(response, 'choices'):
        # 打印出所有的选择(回答)
        for choice in response.choices:
            # 检查 'message' 键是否存在于选择中
            if hasattr(choice, 'message'):
                # 打印回答的内容
                print(choice.message.content)   
                return choice.message.content
    else:
        print("Error:", response.status_code if response else "No response received.")

首先GLM4使用openai的方式启动,然后配置好端口号就行了。
输入一句回答一句
代码参考GLM4官方的代码修改而来。

返回列表格式

# 返回列表格式
from langchain_core.output_parsers.list import CommaSeparatedListOutputParser
from langchain_core.prompts import PromptTemplate

output_parser = CommaSeparatedListOutputParser()

format_instructions = output_parser.get_format_instructions()
prompt = PromptTemplate(
    template="列出几种{subject}.\n{format_instructions}",
    input_variables=["subject"],
    partial_variables={"format_instructions": format_instructions + "用中文回答"}
)
prompt = prompt.format(subject="水果")

print("prompt"+"*"*10)
print(prompt)
print("prompt"+"*"*10)
prompt = str(prompt)
output = simple_chat(query=prompt)
print("output"+"*"*10)
print(output)
print("output_parser"+"*"*10)
print(output_parser.parse(output))
print("output_parser"+"*"*10)

output_parser就是一个结构化输出的提示词模板
prompt就是使用langchain模板构建的提示词
提示词输入大模型即可生成结果
结果由output_parser解析,就能得到我们需要的结构化输出结果
上述代码运行结果为:
在这里插入图片描述
也就是说langchain的工具帮助我们进行结构化输出,就是帮助我们构建结构化提示词和对结果进行结构化解析。

所以说,这里最重要的就是提示词的构建。

下面的讲述都只放出提示词,因为大模型喂入那部分都是相同的。

返回对象类型

from typing import Optional

from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_core.output_parsers.pydantic import PydanticOutputParser
from langchain_core.prompts import PromptTemplate

class Student(BaseModel):
    name: str = Field(description="学生的姓名")
    age: str = Field(description="学生的年龄")

student_query = "告诉我一个学生的信息"

output_parser = PydanticOutputParser(pydantic_object=Student)

prompt = PromptTemplate(
    template="回答下面问题.\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": output_parser.get_format_instructions()+"用中文回答"},
)

prompt = prompt.format_prompt(query=student_query)

返回对象格式(信息抽取)

from typing import Optional

from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_core.output_parsers.pydantic import PydanticOutputParser
from langchain_core.prompts import PromptTemplate

class Person(BaseModel):
    name: Optional[str] = Field(default=None, description="The name of the person")
    hair_color: Optional[str] = Field(
        default=None, description="The color of the peron's hair if known"
    )
    height_in_meters: Optional[str] = Field(
        default=None, description="Height measured in meters"
    )
text = "Alan Smith is 1.65m tall.\n"
query = text

output_parser = PydanticOutputParser(pydantic_object=Person)

prompt = PromptTemplate(
    template='''system:\nYou are an expert extraction algorithm.\nOnly extract relevant information from the text.\nIf you do not know the value of an attribute asked to extract\nreturn null for the attribute's value.\n{format_instructions}\nhuman:{query}\n''',
    input_variables=["query"],
    partial_variables={"format_instructions": output_parser.get_format_instructions()},
)

prompt = prompt.format_prompt(query=query)

返回json格式

# 返回json格式
# case1
from langchain.output_parsers import ResponseSchema, StructuredOutputParser
from langchain_core.prompts import PromptTemplate
response_schemas = [
    ResponseSchema(name="name", description="学生的姓名"),
    ResponseSchema(name="age", description="学生的年龄")
]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)

format_instructions = output_parser.get_format_instructions()
prompt = PromptTemplate(
    template="回答下面问题.\n{format_instructions}\n{question}",
    input_variables=["question"],
    partial_variables={"format_instructions": format_instructions}
)
prompt = prompt.format_prompt(question="给我一个女孩的信息")



# case2
from langchain.output_parsers import ResponseSchema, StructuredOutputParser
from langchain_core.prompts import PromptTemplate
response_schemas = [
    ResponseSchema(name="answer", description="地名"),
    ResponseSchema(
        name="source",
        description="答案的网址",
    ),
]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)

format_instructions = output_parser.get_format_instructions()
prompt = PromptTemplate(
    template="answer the users question as best as possible.\n{format_instructions}\n{question}",
    input_variables=["question"],
    partial_variables={"format_instructions": format_instructions},
)
prompt = prompt.format_prompt(question="华为公司的总部在哪里?")

# 据说弱点的模型用上面的方式来返回json效果会好点
# case3
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field


# Define your desired data structure.
class Joke(BaseModel):
    setup: str = Field(description="question to set up a joke")
    punchline: str = Field(description="answer to resolve the joke")


# And a query intented to prompt a language model to populate the data structure.
query = "讲一个笑话"

# Set up a parser + inject instructions into the prompt template.
output_parser = JsonOutputParser(pydantic_object=Joke)

prompt = PromptTemplate(
    template="Answer the user query.\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": output_parser.get_format_instructions()},
)
prompt = prompt.format_prompt(query=query)

做选择题(在给定答案中选一个答案)

from langchain.output_parsers.enum import EnumOutputParser

from enum import Enum


class Colors(Enum):
    RED = "red"
    GREEN = "green"
    BLUE = "blue"
    BLACK = "black"
    OTHER = "other"

output_parser = EnumOutputParser(enum=Colors)

from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI

prompt = PromptTemplate.from_template(
    """这个人的眼睛可能是什么颜色的?你只需要说出答案就行了

> Person: {person}

Instructions: {instructions}"""
).partial(instructions=output_parser.get_format_instructions())
prompt = prompt.format_prompt(person="在中国的小明有一双水汪汪的眼睛")

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

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

相关文章

SQL布尔盲注

目录 1 布尔盲注 2布尔盲注流程 2.1输入id进行测试 2.2判断注入类型 2.3爆数据库名 2.4爆表名 2.5爆字段名 2.6查询数据 1 布尔盲注 布尔盲注就是在SQL注入过程中,SQL语句执行后,查询到的数据不能回显到前端页面,如果正确执行了构造的…

连接一切:Web3如何重塑物联网的未来

传统物联网的挑战 物联网(IoT)正在迅速改变我们的世界,通过将各种设备连接到互联网,它使得设备能够相互交流,提供智能化的服务和解决方案。然而,随着物联网的迅猛发展,安全性、隐私保护和设备互…

C++ primer plus 第17 章 输入、输出和文件:文件输入和输出05:文件模式:内核格式化

C primer plus 第17 章 输入、输出和文件:文件输入和输出05:文件模式:内核格式化 C primer plus 第17 章 输入、输出和文件:文件输入和输出05:文件模式:内核格式化 17.5 内核格式化 程序清单 17.21 strout.cpp 文章目录 C primer plus 第17 章 输入、输…

第41届CCF

第41届CCF中国数据库学术会议 NDBC2024中国乌鲁木齐 《电信领域数据库新需求与挑战》分论坛介绍 2024年08月09日上午09:00-12:30 电信领域进入算力网络时代,数据库国产化需求迫切,对数据库可用性、扩展性、一体化、多模、跨域传输和调度等提出新的要求。基于此,本论坛重点讨…

UE5 右键菜单缺少Generate Visual Studio project files

前言 在安装完毕 ue5 后,看到别人右键菜单有 多出来的三个选项 ,但是我却没有,如下图: 解决方式 1、在 “C:\Program Files (x86)\Epic Games\Launcher\Engine\Binaries\Win64” 路径下有 UnrealVersionSelector.exe 文件。 …

fme从json中提取位置到kml中

fme从json中提取位置到kml中 简单参考,我自己要用的,越弄越复杂。 概述-模板总体结构 数据就是官方提供的数据,模板的基本节结构是读模块+转换器+写模块,最近爬取一些json文件,用到了。 1.使用json读模块读取数据 首先检查一下源数据 使用文本打开数据集,可以看到非缩…

压电雨量传感器的工作原理

型号推荐:云境天合TH-Y1】压电动能式雨量计通过雨滴撞击传感器产生的微小形变,将机械能转化为电能。这种转化过程基于压电效应,即某些材料在受到压力作用时会产生电荷,从而产生电信号。雨滴撞击传感器时,传感器发生形变…

写给大模型新人的经验,刷到少走三年弯路!

这篇文章,我将结合自己在大模型领域的经验,给大家详细聊聊新人应该如何转行大模型赛道? 比如大模型都有哪些方向?各方向的能力要求和岗位匹配?新手转行大模型常踩的坑和常见的误区?以及入行大模型最顺滑的…

扩散模型系列笔记(一)——DDPM

直观理解 扩散模型分为前向过程(扩散过程,Data → \to →Noise)和后向过程(生成过程或逆扩散过程,Noise → \to →Data)。在前向过程中,对于每一个观测样本,不断向样本中添加少量噪…

智能编程新纪元:腾讯AI代码助手的高效编程体验

智能编程新纪元:腾讯AI代码助手的高效编程体验 智能编程新纪元:腾讯AI代码助手的高效编程体验引言一、配置开发环境二、AI助手实现高效编程2.1 AI助手自动补全2.2 AI助手实现编程思维2.3 AI助手高效注解2.4 AI助手打破语言壁垒 三、帮助和提升四、优化和…

【CSS入门】第一课 - CSS内容都可以写在哪里?

从这一小节开始,我们开始学习CSS的内容。之前都是学习的HTML标签,还用几节课的时间做了纯HTML标签的实战。 但是只用纯HTML标签做出来的东西呢,不是那么好看,而且你看那么多网站,没有哪个网站只用纯HTML标签做东西的&…

游戏加速器推荐

游戏加速器推荐,玩游戏用什么加速器!我得给你推荐一款我常用的。 首先呢,就是深度加速器,它针对目前手游网游的游戏加速效果特别棒,而且界面也很友好。 另外,还有深度加速器,这款加速器不仅支持…

springboot青少年科普平台-计算机毕业设计源码76194

摘 要 对于搭建一个青少年科普平台,您可以考虑使用Spring Boot作为后端框架。Spring Boot是一个能够简化Spring应用开发的框架,能够帮助您快速搭建稳定、高效的后端服务。您可以利用Spring Boot的特性来构建一个可靠的数据服务,用于展示和传播…

为什么稳定的开关电源仍可能振荡

开关模式调节器 开关模式调节器的功能是尽可能高效地将输入电压转换为稳定的恒定输出电压。 此过程会有一些损失,其效率可衡量为 ηPOUTPIN?PINPOUTη→VINIIN(1)VOUTIOUTη?IINVOUTIOUTη/VIN 图 1. 输入电流与输入电压的关系。 图 2. 添加了 12 V 处的切线。…

C++-类与对象基础

一,类的定义 1.1类定义格式 class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为mian类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者…

【麒麟】多种方法修改MAC地址

原文链接:【麒麟】多种方法修改MAC地址 Hello,大家好啊!今天给大家带来一篇关于在麒麟桌面操作系统上多种方法修改MAC地址的文章。MAC地址是网络接口卡的物理地址,有时我们需要修改它以实现特定的网络配置需求。本文将详细介绍几种…

VS2022中打印中文乱码

我们在使用VS编写C语言代码的时候,我们可能遇见用printf打印中文出现乱码的情况,如下: 下面我们来讲一下怎么解决这种问题: 出现这种现象是因为你使用的编码设置不对; 1.我们首先打开文件标签,看看是否有…

为什么我要从测试经理转行到产品经理?

本文来聊一下我转产品经理的心路历程。 我从大学毕业做的就是软件测试,简单点说就是把别人设计的产品别人码的代码 我们或手工或自动化 的方式检查是否有逻辑问题,是否符合需求设计。某一天我突然对自己的工作不那么热爱,难道一辈子就干这个…

C4D学习笔记

C4D学习笔记 技巧使用对称面的两边会有问题,很生硬洗面奶瓶盖凹槽洗面奶瓶子尾部接缝 常用功能在一个线创建一个平面在圆面内家一圈线(KL循环切割)在某个面向内加一圈线某个模式切换,选中所有(按着Ctrl键)焊接&#xf…

Apache OFBiz系统ProgramExport接口存在远程命令执行漏洞CVE-2024-38856 附POC

@[toc] 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. Apache OFBiz系统简介 微信公众号搜索:南…