我们把 Prompt 函数和类更进一步了

前言

上次我们发了一篇文章,很好的解决了 Prompt 的使用问题:

最好的Prompt管理和使用依然是 Class 和 Function - 继续让LLM和编程语言融合

相比其他方案,具有非常大的优势,完全融入到了现有的编程语言里,而不是大段的文本变量或者文件来做管理。

阅读本文前,建议大家先阅读上面的文章获得一个基础认知,再来看看我们如何进一步简化其使用。

问题

我们来看下面一段代码:

import ray
import functools
import inspect
import byzerllm
import pydantic
from byzerllm.utils.client import ByzerLLMray.init(address="auto",namespace="default",ignore_reinit_error=True)  data = {'name': 'Jane Doe','task_count': 3,'tasks': [{'name': 'Submit report', 'due_date': '2024-03-10'},{'name': 'Finish project', 'due_date': '2024-03-15'},{'name': 'Reply to emails', 'due_date': '2024-03-08'}]
}class RAG():def __init__(self):        self.llm = ByzerLLM()self.llm.setup_template(model="sparkdesk_chat",template="auto")self.llm.setup_default_model_name("sparkdesk_chat")        @byzerllm.prompt(lambda self:self.llm,render="jinja2")def generate_answer(self,name,task_count,tasks)->str:'''Hello {{ name }},This is a reminder that you have {{ task_count }} pending tasks:{% for task in tasks %}- Task: {{ task.name }} | Due: {{ task.due_date }}{% endfor %}Best regards,Your Reminder System'''t = RAG()response = t.generate_answer(**data)
print(response)## output:Hello! Is there anything else I can assist you with?

RAG 是一个 prompt class, 里面有个 prompt function generate_answer, 

可以看到这个方法是一个传统意义上的空方法,但是里面的 doc 则是一段jinja 模板代码。prompt function 的执行器实际上是大模型,所以这段doc 会作为代码给到大模型,然后返回一个结果。

但是这个prompt 函数有两个地方比较复杂:

  1. prompt 注解需要传一个 lambada 表达式,这个是为了获得 llm 实例。

  2. 我们用到了jinja2 的for循环等

实际用起来,我们往往还是希望能够对会绑定到 doc 里的参数做一些处理的,这样可以使得模板更简单一些。

解决方案

现在你可以这么做:

@byzerllm.prompt(lambda self:self.llm,render="jinja2")def generate_answer(self,name,task_count,tasks)->str:'''Hello {{ name }},This is a reminder that you have {{ task_count }} pending tasks:{{ tasks }}Best regards,Your Reminder System'''tasks_str = "\n".join([f"- Task: {task['name']} | Due: { task['due_date'] }" for task in tasks])return {"tasks": tasks_str}

这次,我们提供了方法体,这个方法体实际上是对参数做一次预处理,然后再返回一个字典,这个新的字典会覆盖方法的参数的值,比如此时 tasks 值从原来的一个对象变成了一个字符串,可以直接放到 jinja2 doc 里渲染了。

此外,这也意味着你可以可能还可以做一些逻辑判断,来决定实际渲染到doc里的值是什么样子的,而不是在代码里做模板拼接。

这是第一个变化,prompt function 也允许有方法体,可以对入参做一些二次处理。只是你的方法体返回的值必须是一个字典。

其次,

@byzerllm.prompt(llm=lambda self:self.llm,render="jinja2")

中的 llm 目前可以接受三种值了:

  1.  lambda 表达式,获取当前对象的llm 实例。

  2. 字符串,也就是模型的名字,系统会自动构建一个llm实例用于某次调用。

  3. llm 实例, 你可以直接传递一个llm实例。

比如:

@byzerllm.prompt(llm="kimi_chat")

系统会自动寻找名字为 kimi_chat的模型。

此外,在这次新版本(0.1.58)我们将 render 默认值改成 jinja2 而非simple。

总结

Byzer-LLM 是一个比较特殊的存在,它的终极愿景是让大家更好的使用大模型,而实现这一愿景主要是通过让变成语言和大模型更好的做融合,为此我们提供了非常多的能力,包括大模型无关的function calling, response class 和 function impl 等功能,也包括 prompt function 和prompt class。 

为了能够让这些能力变得好用,Byzer-LLM 还支持主流的开源模型和SaaS模型的对接,并且能够很好的适应生产环境,可以让大家只引入一个库就解决主要问题。

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

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

相关文章

SpringBoot-如何设计优秀的后端接口?

在实际工作中,我们需要经常跟第三方平台打交道,可能会对接第三方平台API接口,或者提供API接口给第三方平台调用。 那么问题来了,如果设计一个优雅的API接口,能够满足:安全性、可重复调用、稳定性、好定位问…

Java快速入门系列-6(数据库编程与JDBC)

第六章:数据库编程与JDBC 6.1 SQL基础6.1.1 SQL基本结构与命令6.1.2 SQL高级查询6.1.3 SQL子查询与联接6.2 JDBC原理与使用6.2.1 JDBC驱动程序与URL6.2.2 Statement、PreparedStatement与CallableStatement6.2.3 数据库事务处理6.3 数据库连接池6.4 事务管理6.1 SQL基础 SQL(…

2. Spring的创建和Bean的存取

经过前面的学习我们已经大体明白了 IOC 思想以及它的实现方式 DI ,本节要讲的是如何Spring框架实现实现DI。 本节目标: Spring(Core) 项目创建将对象存储到 Spring 中将对象(bean)从 Spring 中取出 1. 创建 Spring 项目 与开篇演示的 Spring Boot 项目不…

TiDB MVCC 版本堆积相关原理及排查手段

导读 本文介绍了 TiDB 中 MVCC(多版本并发控制)机制的原理和相关排查手段。 TiDB 使用 MVCC 机制实现事务,在写入新数据时不会直接替换旧数据,而是保留旧数据的同时以时间戳区分版本。 当历史版本堆积过多时,会导致读…

在Linux终端查找指定类型的文件并统计数量

下面举例说明: find /path/to/directory -type f -exec file {} \; | grep "MIDI"它的作用是在指定的目录(/path/to/directory)中搜索所有的文件(-type f),然后使用file命令检查每个文件的类型&a…

【C++学习】C++11新特性(第二节)—— 右值引用与移动语义超详解

文章目录 文章简介二.右值引用1.什么是左值,什么是右值?什么是左值引用,什么是右值引用?2.左值引用与右值引用比较 三.右值引用使用场景和意义1.左值引用的使用场景:2.左值引用的短板:3.右值引用与移动构造…

Axure RP中的相关概念及高保真原型构建方法

1 Axure RP中概念介绍 对于构建高保真原型来说,需要知道事件(Event)、Case、Action等概念。Axure RP中给出这些概念,是为了方便原型的构建,尤其是高保真原型的构建。 事件(Event)是附着于控件…

2024年万字长文-数据仓库面试题及参考答案全解析

数据仓库作为大数据分析的基石,对于大数据架构师而言,掌握其核心概念和技能至关重要。本文将深入探讨数据仓库相关的面试题,并提供详尽的参考答案,旨在帮助读者全面理解数据仓库的构建、管理和优化,以及如何在实际工作中应用相关知识。 目录 1. 数据仓库的定义及其与数据…

独孤思维:副业没做起来,要退钱

01 有些人,纯粹得可爱。 问我,项目没做起来,是不是该退钱? 那我反过来问你,你赚了钱,是不是该分我点? 02 昨天周一,是独孤最忙的时候。 因为各种大会小会,开了4个会…

PHP自助建站系统,小白也能自己搭建网站

无需懂代码,用 自助建站 做企业官网就像做PPT一样简单,您可以亲自操刀做想要的效果! 自助建站是一款简单、快捷、高效的工具,可以帮助您制作响应式网站。我们的自助建站系统,将传统的编码工作转化为直观的拖拽操作和文…

buuctf之jarvisoj_level2

一、查看属性 首先还是必要的查看属性环节: 可以知道该文件是一个x86架构下的32位小段ELF程序,开启了栈不可执行(NX)保护,ret2shellcode是不行的 简单执行可以看到有一个简单的输入后输出hello world 二、静态分析 …

程序员学CFA——数量分析方法(二)

数量分析方法(二) 数理统计基础统计学的基本概念描述性统计学与推断性统计学总体与样本四种度量尺度名义尺度排序尺度区间尺度比率尺度 数据的展现频率分布直方图与频数多边形 中心趋势均值算术平均几何平均调和平均数加权平均 中位数众数 离散程度绝对离…

Vue2(十五):replace属性、编程式路由导航、缓存路由组件、路由组件独有钩子、路由守卫、history与hash

一、router-link的replace属性 1、作用:控制路由跳转时操作浏览器历史记录的模式 2、浏览器的历史记录有两种写入方式:分别为push和replace,push是追加历史记录,replace是替换当前记录。路由跳转时候默认为push 3、如何开启repla…

【40分钟速成智能风控8】智能反欺诈模型2

目录 ​编辑 智能反欺诈模型 图计算 智能信用风险模型 专家模型 逻辑回归 决策树 集成树 深度神经网络 循环神经网络 智能反欺诈模型 图计算 图计算(Graph Computing)是以关联图谱为基础引申出来的一类算法的统称,主要解决了图数…

vue动态绑定style样式之动态添加style样式的多种写法

项目中会需要动态添加 style 行内样式,现指出常用的几种方式。 注意: 1、凡是有 - 的style属性名都要变成驼峰式,比如font-size要变成fontSize。 2、除了绑定值,其他的属性名的值要用引号括起来,比如fontSize:14px而不是 fontSize…

设计模式,模板方法模式、原型模式

模板方法模式 模板方法模式,就是将一些具体层都会有重复的内容,都放在抽象层作为具体层的模板,让具体层的代码能更简洁,也更好地实现代码复用。 代码实现 若有一套试卷,有A和B两个学生来作答,其中的题目…

windows linux服务器 以及Azure平台 密码策略配置

密码策略配置 windows 服务器Ubuntu 服务器安装libpam-pwquality密码质量检查库设置密码过期的天数密码策略限制使用过去使用过的密码 centos 7 服务器设置密码过期的天数设置最小密码长度限制使用过去使用过的密码 Azure云默认密码策略 windows 服务器 WinR或右键开始—运行—…

保持清醒!

hell,我是小索奇,今天读了几篇文章,聊一下清醒这个话题 其实生活真的需要长远的清醒,意味着我们不仅要看到眼前的快乐和挑战,还要有足够的远见和智慧去规划未来。比如你今天可繁忙,就很容易被眼前的琐事所迷…

Java工具类:对比两个集合并返回差异

在实际的软件开发过程中,经常会遇到需要对比两个集合并找出它们之间的差异的情况。为了解决这个问题,我们可以编写一个Java工具类来完成这个任务。本文将介绍如何编写这样一个工具类,并提供详细的代码解释和使用示例。 问题描述 假设我们有两…