前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >求求你别学了:从 Prompt 到 RAG,从 RAG 到 DSPy

求求你别学了:从 Prompt 到 RAG,从 RAG 到 DSPy

作者头像
掘金安东尼
发布2024-06-19 12:43:02
5460
发布2024-06-19 12:43:02
举报
文章被收录于专栏:掘金安东尼掘金安东尼

如本瓜在此前的文章中提到过,Prompt 工程已经不中用了,没有人愿意废那么大的劲来学习如何结构化提问,大家想要的就是傻瓜式提问,但是大模型的回答还是精准的、合意的;

后来,大兴 RAG 技术,做专业化的本地知识库,但是这个本地库的成本只能说是更高,如果有专业的库直接来用还行,要不然自建库、清洗数据等等,费了九牛二虎之力,那还要大模型啥事?

所以有人才说2023年大模型百模大战是原子弹,2024年大模型真的就让人一度怀疑,这不就是个茶叶蛋?

看到最近新闻说:研发出著名的Stable Diffusion模型,估值近300亿美元的明星企业Stability AI,资金链竟然要断裂了?!Crazy...

其实,大家的诉求很简单,就是“怎么简单方便怎么来”,不要 Prompt 工程、不要 RAG 本地库,只要我问了,你就直接给到我想要的答案,不能出现车轱辘话!

所以,本篇要提的新技术—— DSPy , 它来了!

编程式提问

先问一句:你觉得截止目前,谁是大模型最大的受益者?

除了炒作的、卖课的,或许目前真正能从大模型技术中获益的,莫过于程序员群体了。很多程序员都不同程度的利用上了大模型来辅助编程,大模型在编程方面表现往往比其他专业领域都好的多得多。

这是为什么?

因为 LLMs 对 prompts 的方式很敏感,它不喜欢提示词,它就喜欢编程,或者说是它更擅长编程!

DSPy,就是让提示词 Prompt 变成编程语言的一个框架。

一句话定性:它是一个旨在通过优先编程而不是 prompt 来解决基于语言模型(LM)的应用程序中的脆弱性问题的框架。

DSPy 展开是:“D declarative S self - improved Language P programs (in Python)”,读“迪斯屁儿”,它强调编程而不是提示,使构建基于 LM 的管道远离操作提示而更接近编程。

DSPy VS LangChain

一波未平、一波又起,LangChain 还没学明白,这个“屁儿”怎么又来了?区别在哪?

说白了 LangChain 的 RAG 技术是让提示词更详细、丰富,形成一个标准的提问模板,而 DSPy 则是原理提示模板,从编程的角度去跟大模型交流。

DSPy 引入编译器,更改基于 LLM 的应用程序(如 LLM 或数据)时,消除额外的 prompt 工程 或 fine-tuning 微调;发人员可以简单地重新编译程序来优化 pipelines(模型的组件构成流程) 以适应新添加的更改。

具体它是怎么做的呢?

签名

在 DSPy 程序中,每次调用语言模型时,都必须采用自然语言签名(signature),而不是传统的手写提示。

签名是一个简短的函数,用来明确说明转换的目标,而不是指导 LM 的提示方式,和我们以往命令大模型 “利用XXX回答XXX问题” 不一样。

签名包含 LLM 要解决的子任务的最小描述,输入字段的描述、输出字段的描述;结构一般类似这样:

代码语言:javascript
复制
class GenerateAnswer(dspy.Signature):
    """Answer questions with short factoid answers."""
    context = dspy.InputField(desc="may contain relevant facts")
    question = dspy.InputField()
    answer = dspy.OutputField(desc="often between 1 and 5 words")

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

模块

有过提示经验的同学知道我们往往会引导大模型的回答,比如说:你要用 XXX 风格回答 XXX,你是 XXX 角色有 XXX 经验,不要回答 XXX ......

在 DSPy 中,则通过模板化和参数化来抽象这些提示技术;通过应用提示、微调、增强和推理技术,使 DSPy 签名适应特定任务。

代码语言:javascript
复制
 # Option 1 : Pass minimal signature to ChainOfThought module
generate_answer = dspy.ChainOfThought("context, question -> answer")

# Option 2 : Or pass full notation signature to ChainOfThought module
generate_answer = dspy.ChainOfThought(GenerateAnswer)

# Call the module on a particular input.
pred = generate_answer(context = "Which meant learning Lisp, since in those days Lisp was regarded as the language of AI.",
                       question = "What programming language did the author learn in college?")

从以上代码看,DSPy 签名传递给ChainOfThought模块,然后使用输入字段 contextquestion 的值进行调用。

DSPy 内置如下几个模块,分别有不同的作用:

  • dspy.Predict :基本预测变量
  • dspy.ChainOfThought:教LM在对Signatures响应之前逐步思考
  • dspy.ProgramOfThought:教LM 输出代码
  • dspy.ReAct:能够实现某个Signatures功能的代理(利用工具)
  • dspy.MultiChainComparison:可以比较多个 ChainOfThought 输出以产生最终预测

模块的优势在于它灵活的集成在管道之中,是参数化的,包括提示细节等,模块根据签名处理输入,返回输出。

提词器

DSPy 还有另一个武器,就是 Teleprompters 提词器。提词器使用特定度量,与编译器协同工作,学习和引导有效提示,从而优化 DSPy 程序的各个模块。

DSPy 内置5个提词器:

  • dspy.LabeledFewShot
  • dspy.BootstrapFewShot
  • dspy.BootstrapFewShotWithRandomSearch
  • dspy.BootstrapFinetune
  • dspy.Ensemble

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

小结

以上对 DSPy 有了一个基本的认识:它把传统的提示词工程通过一些语法糖进行了优雅的封装。

它可以解决基于语言模型的应用程序脆弱性问题的框架;优先考虑编程而不是提示,允许重新编译整个流水线以优化任务。

实现原理是前文提到的:引入了签名、模块和提词器等概念来抽象提示和微调;编译器可以自动优化程序,根据任务需求生成高质量的提示。

如果感兴趣的同学可以点点关注,后续继续了解 DSPy 的 RAG 管道示例实践。

参考

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 编程式提问
  • DSPy VS LangChain
  • 签名
  • 模块
  • 提词器
  • 小结
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档