Program LLMs,不只是Prompt LLMs

news2024/11/16 22:36:53

前言

随着大模型的使用和应用越来越频繁,也越来越广泛,大家有没有陷入到无限制的研究、调优自己的prompt。

随之,市面上也出现了提示词工程师,更有专门的提示工程一说。

现在网上搜一搜,有各种各样的写提示词的技巧,包括我自己也专门写过相关的文章。

再聊prompt

不知道大家有没有感受,prompt的技巧和调优效果很明显,但是没有什么提示词策略是可以解决所有类型的问题的。

LLMs本身对提示词是非常敏感的,这意味着,在实际实验过程中,除了要求大模型输出某个内容,还需要约束它按照某种格式,各种条件约束下输出,以确保整体的稳定性。你稍微改变条件或者数据,都会导致结果的返回发生变化,甚至有时候天差地别,你又需要重新调整或者优化prompt。

关于prompt我有两个问题:

  1. 根据OpenAI的工程师自述,起先在开发大模型的过程中,并没有提示工程这一说,而是后来在使用过程中大家发现通过一些技巧可以提高大模型的涌现能力。实际上就是大量的玩家在试玩大模型之后总结出的技巧。

我什么时候能不费劲巴拉的写各种各样的prompt。

  1. 都说我们看待LLM要像对待“人”一样,什么时候我真正能像和一个“人”沟通,能理解我在说什么和我需要什么 。

Hello Programming-DSPy

在这个过程中,DSPy一种program的全新的大模型应用方式出现了。

在这里我们不讨论两者的好与坏,随着LLM的多模态能力的发展和Multil Agents的发展,没准哪天就可以傻瓜式的提问了。

DSPy是什么

DSPy [1] 是斯坦福大学 NLP 研究人员开发的 "基础模型编程 "框架, 是一个旨在解决基于语言模型(LM)的应用程序脆弱性问题的框架,它优先考虑编程而不是提示。它允许您重新编译整个流水线,以便根据您的特定任务进行优化,而不是每当您更改一个组件时,就重复一轮人工提示工程。

DSPy 还将程序的信息流与每一步的参数(提示和 LM 权重)分离开来,为构建基于 LM 的应用程序提供了更系统的方法。然后,DSPy 将根据您的程序,自动优化如何针对您的特定任务提示(或微调)LM。

DSPy的核心思想

  • Signatures:手动设计的提示 -> 用签名取代

是我们告诉DSPY需要做什么,而不是告诉他应该如何做。例如:输入是文档,输出是摘要;输入是上下文+问题,输出是问题回复。

  • Modules:提示技巧 -> 转变为模块化

在DSPY是一些模块化的组件,比如说:dspy.ChainOfThought、dspy.ProgramOfThought,类似于一些可调用的函数

  • Optimizers:复杂的提示工程 -> 通过提词器和DSPy编译器自动完成

根据某个指标对整个流程自动优化。

DSPy是如何工作的

image.png

使用DSPy构建基于LM的应用的工作流程如上图所示,与训练神经网络的工作流程类似。

  1. 收集数据集:收集一些程序输入和输出的示例(例如,问答对),这些示例将用于优化pipeline。
  2. 编写DSPy程序:用签名(signature)和模块(module)以及组件之间的信息流定义程序的逻辑,以解决你的任务。
  3. 定义验证逻辑:使用验证度量和优化器(teleprompter)定义优化程序的逻辑。
  4. 编译DSPy程序:DSPy编译器考虑训练数据、编写程序、优化器和验证度量,以优化程序(例如,提示或微调)。
  5. 迭代:通过改进数据、编写程序或验证来重复该过程,直到对pipeline的性能感到满意为止。

进一步了解DSPy请参考以下链接:

  • DSPy Paper: DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines
  • DSPy GitHub: github.com/stanfordnlp…

举个例子

可能理解起来还有点抽象,我们再举一个例子:

比如说,我们想解决“姚明的妻子的出生年龄?”这个问题。看到这个问题,大家脑子里肯定蹦出了一堆的解决方案。这是个多跳问题,几乎不可能通过单轮搜索来解决这个问题,大多数系统可以得出“姚明的妻子是谁?”,但是无法回答后续的年龄问题。多轮搜索的系统,通过生成额外的搜索,收集必要的信息,可以得出最终答案,整体上还是蛮复杂的。但是这里举个例子,如何用DSPY只需要几行代码来实现并优化这个问题。

原文链接:blog.csdn.net/weixin_5875… ,如有侵权请联系删除

python

import dspy      

turbo = dspy.OpenAI(model='gpt-3.5-turbo')   
colbertv2 = dspy.ColBERTv2(url='http://20.102.90.50:2017/wiki17_abstracts')      
dspy.settings.configure(lm=turbo, rm=colbertv2 )   

加载测试数据,多跳问题,可以使用HotPotQA测试

python

from dspy.datasets import HotPotQA      

dataset = HotPotQA(train_seed=1, train_size=20, eval_seed=2023, dev_size=50, test_size=0)      trainset = [x.with_inputs('question') for x in dataset.train]   
devset = [x.with_inputs('question') for x in dataset.dev]      
len(trainset), 
len(devset)   
#(20, 50)   

设置Signatures

签名是最小形式的输入和输出字段的元组。下面,您可以看到一些简写语法签名的示例。

与手写提示相比,签名可以通过为每个签名引导示例编译成自完善和自适应管道的prompt或fine-tune。

arduino

"question -> answer"

"long-document -> summary"

"context, question -> answer"
python

class GenerateAnswer(dspy.Signature):       
context = dspy.InputField()       
question = dspy.InputField()       
answer = dspy.OutputField()         

class GenerateSearchQuery(dspy.Signature):          
context = dspy.InputField()       
question = dspy.InputField()       
query = dspy.OutputField()   

构建DSPY pipeline

您可能熟悉几种不同的提示技巧,例如添加Your task is to …之类的句子。或“You are a …”在提示开头,思维链(“让我们一步一步地思考”),或者在提示结尾添加 “Don’t make anything up” 或“Only use the provided context”这样的句子。

对DSPy中的模块进行模板化和参数化,以抽象这些提示技术。这意味着它们用于通过应用提示、微调、增强和推理技术使DSPy签名适应任务。

将签名传递给ChainOfThought模块,然后使用输入字段contextquestion的值进行调用。

使用ChainOfThought初步实施签名“context, question -> answer”

在撰写本文时,DSPy实现了以下六个Module:

  • dspy.Predict:处理输入和输出字段,生成指令,并为指定的signature创建模板。
  • dspy.ChainOfThought:继承了Predict模块,并增加了“ Chain of Thought “处理的功能。
  • dspy.ChainOfThoughtWithHint:继承了Predict模块,并增强了ChainOfThought模块,增加了提供推理提示的选项。
  • dspy.MultiChainComparison:继承了Predict模块,并增加了多链比较的功能。
  • dspy.Retrieve:从检索器模块检索段落。
  • dspy.ReAct:旨在组成思想,行动和观察的交错步骤。
python

from dsp.utils import deduplicate      

class SimplifiedBaleen(dspy.Module):       
def __init__(self, passages_per_hop=3, max_hops=2):           
super().__init__()              
self.generate_query = [dspy.ChainOfThought(GenerateSearchQuery) for _ in range(max_hops)]  
# 多跳,每一跳都使用一个dspy.ChainOfThought           
self.retrieve = dspy.Retrieve(k=passages_per_hop)           
self.generate_answer = dspy.ChainOfThought(GenerateAnswer)           
self.max_hops = max_hops          

def forward(self, question):           
context = []                      
for hop in range(self.max_hops):               
query = self.generate_query[hop](context=context, question=question).query       
passages = self.retrieve(query).passages               
context = deduplicate(context + passages)              
pred = self.generate_answer(context=context, question=question)           
return dspy.Prediction(context=context, answer=pred.answer)   

测试

python

my_question = "How many storeys are in the castle that David Gregory inherited?"  
uncompiled_baleen = SimplifiedBaleen()     
pred = uncompiled_baleen(my_question)      
print(f"Question: {my_question}")   
print(f"Predicted Answer: {pred.answer}")   
print(f"Retrieved Contexts (truncated): {[c[:200] + '...' for c in pred.context]}")   

优化

上面提到过,可以用某个打分来优化DSPY的结果,定义一个评估函数

  • 预测答案与真实答案相符。
  • 检索到的上下文包含真实答案
  • 生成的搜索查询不能太杂乱,小于100个字符
  • 生成的搜索查询尽量不要重复(跟历史的相比,不能超过0.8)。
python

def validate_context_and_answer_and_hops(example, pred, trace=None):       
if not dspy.evaluate.answer_exact_match(example, pred): return False       
if not dspy.evaluate.answer_passage_match(example, pred): return False          
hops = [example.question] + [outputs.query for *_, outputs in trace if 'query' in outputs]          
if max([len(h) for h in hops]) > 100: return False       
if any(dspy.evaluate.answer_exact_match_str(hops[idx], hops[:idx], frac=0.8) for idx in range(2, len(hops))): return False          
return True   

使用 DSPy 中的BootstrapFewShot,通过少量示例来优化流程的预测器。 在撰写本文时,DSPy实现了以下五个提词器:

  • dspy.LabeledFewShot:定义预测器使用的k个样本数。
  • dspy.BootstrapFewShot:引导Few-Shot。
  • dspy.BootstrapFewShotWithRandomSearch:继承了BootstrapFewShot提词器,并为随机搜索过程引入了额外的属性。
  • dspy.BootstrapFinetune:t将提词器定义为用于微调编译的BootstrapFewShot实例。
  • dspy.Ensemble:创建多个程序的集成版本,将不同程序的各种输出减少到单个输出。 还有SignatureOptimizer和BayesianSignatureOptimizer,它们在zero/few-shot 设置中改善模块中签名的输出前缀和指令。

不同的提词器在优化成本和质量等方面提供了不同的权衡。

python

from dspy.teleprompt import BootstrapFewShot      
teleprompter = BootstrapFewShot(metric=validate_context_and_answer_and_hops)   
compiled_baleen = teleprompter.compile(SimplifiedBaleen(), teacher=SimplifiedBaleen(passages_per_hop=2), trainset=trainset)   

评估

python

from dspy.evaluate.evaluate import Evaluate         
def gold_passages_retrieved(example, pred, trace=None):       
gold_titles = set(map(dspy.evaluate.normalize_text, example["gold_titles"]))       
found_titles = set(           
map(dspy.evaluate.normalize_text, [c.split(" | ")[0] for c in pred.context])       
)       
return gold_titles.issubset(found_titles)      
evaluate_on_hotpotqa = Evaluate(devset=devset, num_threads=1, display_progress=True, display_table=5)      
uncompiled_baleen_retrieval_score = evaluate_on_hotpotqa(uncompiled_baleen, metric=gold_passages_retrieved, display=False)      
compiled_baleen_retrieval_score = evaluate_on_hotpotqa(compiled_baleen, metric=gold_passages_retrieved)      
print(f"## Retrieval Score for uncompiled Baleen: {uncompiled_baleen_retrieval_score}")   
print(f"## Retrieval Score for compiled Baleen: {compiled_baleen_retrieval_score}")         
#Output   
## Retrieval Score for uncompiled Baleen: 36.0   
## Retrieval Score for compiled Baleen: 60.0   

DSPy与LangChain或LlamaIndex有何不同?

LangChain、LlamaIndex和DSPy都是帮助开发人员轻松构建基于LM的应用的框架。使用LangChain和LlamaIndex的典型pipeline通常使用prompt template来实现,这使得整个pipeline对组件更改非常敏感。相比之下,DSPy将构建基于LM的管道从操作prompt 转移到更贴近编程。

DSPy中新引入的编译器在更改基于LM的应用程序(如LM或数据)中的部件时,消除了任何额外的Prompt工程或微调工作。相反,开发人员可以简单地重新编译程序,以优化pipeline适应新添加的更改。因此,与LangChain或LlamaIndex相比,DSPy可以帮助开发人员以更少的努力获得pipeline的性能。

总结

本文我们一是回顾了prompt使用过程中的痛点和问题,同时介绍了DSPy一种program的全新的大模型应用方式,并通过一个例子初步了解了DSPy是如何工作的,目前生成式人工智能社区对该框架非常感兴趣。DSPy 框架引入了一系列概念,将构建基于 LM 的应用程序从手动提示工程转向编程。

如何系统的去学习AI大模型LLM ?

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料 包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来

😝有需要的小伙伴,可以V扫描下方二维码免费领取🆓

在这里插入图片描述

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

在这里插入图片描述

四、AI大模型商业化落地方案

img

阶段1:AI大模型时代的基础理解

  • 目标:了解AI大模型的基本概念、发展历程和核心原理。
  • 内容
    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
      - L1.4.1 知识大模型
      - L1.4.2 生产大模型
      - L1.4.3 模型工程方法论
      - L1.4.4 模型工程实践
    • L1.5 GPT应用案例

阶段2:AI大模型API应用开发工程

  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。
  • 内容
    • L2.1 API接口
      - L2.1.1 OpenAI API接口
      - L2.1.2 Python接口接入
      - L2.1.3 BOT工具类框架
      - L2.1.4 代码示例
    • L2.2 Prompt框架
      - L2.2.1 什么是Prompt
      - L2.2.2 Prompt框架应用现状
      - L2.2.3 基于GPTAS的Prompt框架
      - L2.2.4 Prompt框架与Thought
      - L2.2.5 Prompt框架与提示词
    • L2.3 流水线工程
      - L2.3.1 流水线工程的概念
      - L2.3.2 流水线工程的优点
      - L2.3.3 流水线工程的应用
    • L2.4 总结与展望

阶段3:AI大模型应用架构实践

  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。
  • 内容
    • L3.1 Agent模型框架
      - L3.1.1 Agent模型框架的设计理念
      - L3.1.2 Agent模型框架的核心组件
      - L3.1.3 Agent模型框架的实现细节
    • L3.2 MetaGPT
      - L3.2.1 MetaGPT的基本概念
      - L3.2.2 MetaGPT的工作原理
      - L3.2.3 MetaGPT的应用场景
    • L3.3 ChatGLM
      - L3.3.1 ChatGLM的特点
      - L3.3.2 ChatGLM的开发环境
      - L3.3.3 ChatGLM的使用示例
    • L3.4 LLAMA
      - L3.4.1 LLAMA的特点
      - L3.4.2 LLAMA的开发环境
      - L3.4.3 LLAMA的使用示例
    • L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。
  • 内容
    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景

学习计划:

  • 阶段1:1-2个月,建立AI大模型的基础知识体系。
  • 阶段2:2-3个月,专注于API应用开发能力的提升。
  • 阶段3:3-4个月,深入实践AI大模型的应用架构和私有化部署。
  • 阶段4:4-5个月,专注于高级模型的应用和部署。
这份完整版的大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓

在这里插入图片描述

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

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

相关文章

Python多线程技巧心得详解

概要 多线程是一种能够并发执行代码的方法,可以提高程序的执行效率和响应速度。本文将详细介绍 Python 中多线程的概念、使用场景、基本用法以及实际应用,可以更好地掌握多线程编程。 什么是多线程? 多线程是一种在单个进程内并发执行多个线程的技术。每个线程共享相同的内…

电脑CPU速度很快,为什么3dMax还会出现卡顿的情况?

我们在使用3dmax时会经常遇到电脑变得很缓慢甚至卡顿的情况(多发生于新手群体),即使我们的电脑CPU已经足够快, 也会出现滞后或性能延迟。包括但不限于 Intel i9 和 AMD“Ryzen Threadrippers”。 例如单击用户界面的任何区域或移…

红酒舞动,运动风采,品味力与美

当夜幕降临,城市的灯火渐次亮起,忙碌了一天的人们开始寻找那份属于自己的宁静与愉悦。在这个时刻,红酒与运动,这两个看似截然不同的元素,却能以它们不同的魅力,为我们带来一场视觉与感官的盛宴。 红酒&…

如何轻松获取 GitLab 指定分支特定路径下的文件夹内容

第一步: 获取 accessToken 及你的 项目 id : 获取 accessToken ,点击用户头像进入setting 按图示操作,第 3 步 填写你发起请求的域名。 获取项目 id , 简单粗暴方案 进入 你项目仓库页面后 直接 源码搜索 project_id, value 就…

ApolloClient GraphQL 与 ReactNative

要在 React Native 应用程序中设置使用 GraphQL 的简单示例,您需要遵循以下步骤: 设置一个 React Native 项目。安装 GraphQL 必要的依赖项。创建一个基本的 GraphQL 服务器(或使用公共 GraphQL 端点)。从 React Native 应用中的…

零基础STM32单片机编程入门(三)中断详解及按键中断实战含源码视频

文章目录 一.概要二.可嵌套的向量中断控制器 (NVIC)三.中断向量表四.中断优先级详解五.STM32外部中断控制器(EXTI)1.EXTI简介2.EXTI在中断向量表的位置3.EXTI外部中断产生的信号流向4.EXTI中断产生后的中断服务程序 六.CubeMX配置一个GPIO输入中断的例程七.CubeMX工程源代码下载…

Alibaba Cloud Linux详解_操作系统兼容性_alinux稳定性全解析

Alibaba Cloud Linux是阿里云自研的稳定、安全、高性能的服务器Linux操作系统,完全兼容CentOS/RHEL生态和操作方式,又阿里云提供免费提供长期支持和维护LTS。Alibaba Cloud Linux是目前阿里云服务器最大规模使用的操作系统之一,可部署在Web网…

Appium+python自动化(二十六)- 烟花一瞬,昙花一现 -Toast提示(超详解)

简介  今天宏哥在这里首先给小伙伴们和童鞋们分享一个有关昙花的小典故:话说昙花原是一位花神,她每天都开花,四季都灿烂。她还爱上了每天给她浇水除草的年轻人。后来,此事给玉帝得知。于是,玉帝大发雷霆,要…

DHT11

第一个传感----DHT11 通过前面的学习,你已经学会了控制IO口、延时函数、串口的收发。接下来,你就可以借助以上的知识点完成自己的第一个传感器--DHT11啦! DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。应用非常广…

《Three.JS零基础入门教程》第九篇:环境详解

往期回顾: 《Three.JS零基础入门教程》第一篇:搭建开发环境 《Three.JS零基础入门教程》第二篇:起步案例 《Three.JS零基础入门教程》第三篇:开发辅助 《Three.JS零基础入门教程》第四篇:基础变换 《Three.JS零基…

数据处理神器Elasticsearch_Pipeline:原理、配置与实战指南

文章目录 📑引言一、Elasticsearch Pipeline的原理二、Elasticsearch Pipeline的使用2.1 创建 Pipeline2.2 使用 Pipeline 进行索引2.3 常用的 Processor 三、实际应用场景3.1 日志数据处理3.2 数据清洗和标准化3.3 数据增强 四、最佳实践4.1 性能优化4.2 错误处理4…

【CPP】类 -- class 使用思想

目录 3 类 -- class3.1 什么是类3.2 类的定义3.3 类内参数的使用3.4 类与结构体 -- class VS struct3.5 类的实操 -- log类(日志类)3.6 类定义 与 static 3 类 – class 3.1 什么是类 类是面向对象的一种设计,其中封装了我们对对象的"描述",或者说对象的"特征…

生命在于学习——Python人工智能原理(4.6)

在这里插一句话,我有两个好兄弟的github项目,感兴趣的可以去看一下,star一下,谢谢。 https://github.com/fliggyaa/fscanpoc https://github.com/R0A1NG/Botgate_bypass 四、Python的程序结构与函数 4.1 Python的分支结构 &…

C语言——链表专题

乐观学习,乐观生活,才能不断前进啊!!! 我的主页:optimistic_chen 我的专栏:c语言 点击主页:optimistic_chen和专栏:c语言, 创作不易,大佬们点赞鼓…

国产操作系统上多种压缩和解压命令详解 _ 统信 _ 麒麟 _ 中科方德

原文链接:国产操作系统上多种压缩和解压命令详解 | 统信 | 麒麟 | 中科方德 Hello,大家好啊!今天给大家带来一篇在国产操作系统上多种压缩和解压命令详解的文章。压缩和解压缩是我们在日常工作中经常需要进行的操作,尤其是在处理大…

49-2 内网渗透 - 使用UACME Bypass UAC

靶场准备: 1. 使用已有的 Windows 2012 虚拟机 确保你的虚拟机正在运行,并且可以正常访问。2. 添加 test 用户到管理员组(如上篇文件添加过了就跳过这一步) 具体命令如下: net localgroup administrators test /add 3. 切换用户登录 注销当前会话,并使用 test 用户登录。…

理解MySQL索引:提升查询性能的关键

一、前言 在众多数据库中,MySQL以其高效、稳定和跨平台的特点成为许多开发者的首选。然而,随着数据量的不断增加,查询性能可能会成为一个瓶颈。这时,索引(Index)便成为了提升查询速度的关键工具。本篇文章…

ajax请求接口不设置请求头可以请求成功,但是设置请求头之后就跨域,已解决

遇到这个问题我们不要着急找后端,先通过控制台看看有没有报错,控制台的列表是不会有这个红色报错的,所以我们要看下图: 点击这个红色,然后在下面会出现一些信息 很明显是这个请求头timestamp的请求头被屏蔽了&#xff…

网约车停运损失费:1、事故经过

目录 🍅点击这里查看所有博文 随着自己工作的进行,接触到的技术栈也越来越多。给我一个很直观的感受就是,某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了,只有经常会用到的东西才有可能真正记…

IT入门知识第八部分《云计算》(8/10)

目录 云计算:现代技术的新篇章 1. 云计算基础 1.1 云计算的起源和发展 云计算的早期概念 云计算的发展历程 1.2 云计算的核心特点 按需自助服务 广泛的网络访问 资源池化 快速弹性 按使用量付费 1.3 云计算的优势和挑战 成本效益 灵活性和可扩展性 维…