LangChain入门学习笔记(三)—— Model I/O之Prompts

news2025/4/25 9:33:16

如果说LCEL是粘合剂,那么它需要粘合起来的要素就是各种组件。其中最核心的要素就是LangChain官方文档中定义的Model I/O:Prompts、Chat Models、LLMs和Output Parsers。这4个基本组件,可以处理基本的用户输入并通过大模型处理后按要求输出。

这一章主要介绍第一个组件:Prompts,即用户输入的提示语。

使用示例模板

简单str.format语法

在实际应用中,LLM应用并不直接处理用户的输入,这是因为用户的输入大多数情况并不全面,或者并不规范。所以在实际开发中会使用提示语模板(Prompt Templates),将用户的输入作为其中的一部分填入模板产生最终的提示语后再输入给大模型进行处理。

最简单的用法就像Python中str的format方法:

PromptTemplate.from_template("Write a short poem about {topic}").format(topic="bear")

模板"Write a short poem about {topic}"将用户的输入("bear")作为topic的替换,最终结果是:

局部Prompt模板(Partial Prompt Templates)

有时候提示语模板中的变量不是同时获得的,所以无法一并将模板中的变量进行赋值。LangChain提供了分步给模板进行赋值的方法,通过多次赋值获得最终的提示语。

prompt = PromptTemplate.from_template("{var1}{var2}{var3}")
partial_prompt1 = prompt.partial(var1="foo")
partial_prompt2 = partial_prompt1.partial(var2="baz")
print(partial_prompt2.format(var3="Zzz"))

上面代码中先定义了模板"{var1}{var2}{var3}",然后第一步通过partial()方法给"{var1}"赋值了"foo",这个中间变量再次通过partial()方法给"{var2}"赋值了"baz",最后通过format给第3个变量"{var3}"赋值"Zzz"后产生最终的提示语字符串输出:

给Prompt提供样例

为了生成更加精准的结果,在输入的时候可以提供样例(examples),提示大模型按照样例形式给出相应内容。FewShotPromptTemplate用于进行带样例提示语的封装,主要参数有:

  • examples: 提供样例。
  • example_prompt:样例提示语的模板,该模板中的input_variables定义了template中使用的变量。
  • prefix:在样例提示语之前的自定义内容。
  • suffix:在样例提示语后的自定义内容。
  • input_variables:该带样例的提示语中用到的变量。

来看下面代码示例:

from langchain_community.llms.ollama import Ollama
from langchain_core.prompts.few_shot import FewShotPromptTemplate
from langchain_core.prompts.prompt import PromptTemplate

# template参数提供样例模板, input_variables指定模板中期望的变量名称列表
example_prompt = PromptTemplate(
    input_variables=["question", "answer"], template="Question: {question}\n{answer}"
)

# 提供的样例列表
examples = [
    {
        "question": "Who lived longer, Muhammad Ali or Alan Turing?",
        "answer": """
Are follow up questions needed here: Yes.
Follow up: How old was Muhammad Ali when he died?
Intermediate answer: Muhammad Ali was 74 years old when he died.
Follow up: How old was Alan Turing when he died?
Intermediate answer: Alan Turing was 41 years old when he died.
So the final answer is: Muhammad Ali
""",
    },
    {
        "question": "When was the founder of craigslist born?",
        "answer": """
Are follow up questions needed here: Yes.
Follow up: Who was the founder of craigslist?
Intermediate answer: Craigslist was founded by Craig Newmark.
Follow up: When was Craig Newmark born?
Intermediate answer: Craig Newmark was born on December 6, 1952.
So the final answer is: December 6, 1952
""",
    },
    {
        "question": "Who was the maternal grandfather of George Washington?",
        "answer": """
Are follow up questions needed here: Yes.
Follow up: Who was the mother of George Washington?
Intermediate answer: The mother of George Washington was Mary Ball Washington.
Follow up: Who was the father of Mary Ball Washington?
Intermediate answer: The father of Mary Ball Washington was Joseph Ball.
So the final answer is: Joseph Ball
""",
    },
    {
        "question": "Are both the directors of Jaws and Casino Royale from the same country?",
        "answer": """
Are follow up questions needed here: Yes.
Follow up: Who is the director of Jaws?
Intermediate Answer: The director of Jaws is Steven Spielberg.
Follow up: Where is Steven Spielberg from?
Intermediate Answer: The United States.
Follow up: Who is the director of Casino Royale?
Intermediate Answer: The director of Casino Royale is Martin Campbell.
Follow up: Where is Martin Campbell from?
Intermediate Answer: New Zealand.
So the final answer is: No
""",
    },
]

# 定义带少样例(few-shot)的提示语模板
prompt = FewShotPromptTemplate(
    examples=examples,  # 提供样例
    example_prompt=example_prompt,  # 提示语模板
    prefix="Answer questions like examples below:",  # 提示语之前的自定义内容
    suffix="Question: {input}",  # 提示语最后的输入内容模板
    input_variables=["input"],
)

# 初始化打模型
model = Ollama(model="llama3", temperature=0)

chain = prompt | model

# 传入input生成最终的提示语并调用chain
print(chain.invoke({"input": "Who was the father of Mary Ball Washington?"}))

当输入"input"的内容后,调用llama3大模型的chain,得到下面输出:

可以看出回复是根据样例中的内容给出。

挑选需要的样例

由于各种原因,我们可能需要从提供的样例中挑选合适的部分内容填入提示语。LangChain提供了样例选择器(Example Selector)用来选择合乎要求的内容,BaseExampleSelector主要定义了两个抽象方法:

  • add_example:添加字典类型的候选样例。
  • select_examples:通过定义的规则选择合适的样例。
class BaseExampleSelector(ABC):
    """Interface for selecting examples to include in prompts."""

    @abstractmethod
    def select_examples(self, input_variables: Dict[str, str]) -> List[dict]:
        """Select which examples to use based on the inputs."""
        
    @abstractmethod
    def add_example(self, example: Dict[str, str]) -> Any:
        """Add new example to store."""

LangChain提供了一些常用的选择类:

  • LengthBasedExampleSelector:根据样例的长度选择样例,确保所选样例的总长度不超过指定的最大长度限制。
  • SemanticSimilarityExampleSelector:根据样例与输入的语义相似度选择最相关的样例。它使用向量存储(如Chroma)来存储样例的嵌入向量,并基于余弦相似度进行匹配。
  • MaxMarginalRelevanceExampleSelector:根据样例与输入的语义相似度选择最相关的样例,同时还考虑了样例之间的多样性。与SemanticSimilarityExampleSelector不同的地方是MaxMarginalRelevanceExampleSelector通过最大边际相关性(MMR)算法惩罚与已选择样例过于相似的样例来达到所选样例多样性的目的。
  • NGramOverlapExampleSelector:根据样例与输入的n-gram重叠分数(0-1之间的相似度分数)选择和排序样例。

开发者也可以自定义样例选择类,只要继承BaseExampleSelector类,并重写select_examples方法和add_example方法即可。

class CustomExampleSelector(BaseExampleSelector):
    def __init__(self, examples):
        self.examples = examples

    def add_example(self, example):
        self.examples.append(example)

    def select_examples(self, input_variables):
        ...

以长度挑选样例的LengthBasedExampleSelector举例来说,代码如下:

from langchain_core.example_selectors import LengthBasedExampleSelector
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate

# 提供输入的样例
examples = [
    {"input": "happy", "output": "sad"},
    {"input": "tall", "output": "short"},
    {"input": "energetic", "output": "lethargic"},
    {"input": "sunny", "output": "gloomy"},
    {"input": "windy", "output": "calm"},
]

example_prompt = PromptTemplate(
    input_variables=["input", "output"],
    template="Input: {input}\nOutput: {output}",
)
example_selector = LengthBasedExampleSelector(
    # 传入样例
    examples=examples,
    # 传入样例模板
    example_prompt=example_prompt,
    # 样例的最大长度,由LengthBasedExampleSelector的get_text_length计算长度。不超过max_length长度情况下,用例被选入。
    max_length=20,
)

# FewShotPromptTemplate中传入example_selector进行样例过滤
dynamic_prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    example_prompt=example_prompt,
    prefix="Give the antonym of every input",
    suffix="Input: {adjective}\nOutput:",
    input_variables=["adjective"],
)

print(dynamic_prompt.format(adjective="big"))

与直接使用FewShotPromptTemplate不同的是,这里传入了example_selector,而这里的example_selector正是基于长度进行样例选择的LengthBasedExampleSelector。经过最大长度过滤后的结果如下截图:

 

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

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

相关文章

SpringBoot的Mybatis-plus实战之核心功能

文章目录 一、条件构造器二、自定义SQL第一步、基于wrapper构建where条件第二步、在mapper中声明变量名称第三步、自定义SQL 本篇继续MybatisPlus核心功能 一、条件构造器 MybatisPlus 支持各种复杂的where条件,可满足日常开发的所有需求。 使用到wrapper构造器&am…

代理服务

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在爬取网页的过程中,经常会出现不久前可以爬取的网页现在无法爬取了,这是因为您的IP被爬取网站的服务器所屏蔽了。此时代理服…

银河麒麟系统安装

新建虚拟机 选择典型下一步: 稍后安装操作系统 下一步 : 选择Linux Ubuntu 64位 下一步: 设置名称 选择一个虚拟机的位置进行下一步: 磁盘大小默认给20G 下一步: 点击完成 编辑虚拟机设置 点击CD/DVD(SATA) 使用IS…

27.设计注入功能界面

上一个内容:26.入口点注入项目搭建 使用 26.入口点注入项目搭建 它的代码为基础进行修改 效果图: 首先设置一些主窗口的边框属性 然后在IDD_PAGE_0里添加一个List Control 再给List Control设置调整大小类型属性 然后再给它添加一个变量 然后在拖入一个…

Linux 线程控制

💓博主CSDN主页:麻辣韭菜💓   ⏩专栏分类:Linux初窥门径⏪   🚚代码仓库:Linux代码练习🚚   🌹关注我🫵带你学习更多Linux知识   🔝 目录 前言 1.线程现象 2.线程等待 3.线程…

AutoCAD 2025 ObjectARX(C++)二次开发环境搭建

(原文:https://blog.iyatt.com/?p16480) 基本环境 AutoCAD 机械版 2025 Visual Studio 2022(需要安装“C 桌面开发”) 开发环境 下载 (1)ObjectARX SDK 下载(提供开发使用的 …

MacOS下如何使用Tomcat

提示:宝子们,希望文章对你们有所帮助, 请一键三连支持博主下吧~ 文章目录 前言一、Tomcat 压缩版二、Tomcat可执行文件版本最后 前言 电脑环境: MacOS Monterey 版本 12.6.8 Apple M1 Tomcat 9.0.83 Java 1.8.0_171 …

(三十)Flask之wtforms库【剖析源码上篇】

每篇前言: 🏆🏆作者介绍:【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 🔥🔥本文已收录于Flask框架从入门到实战专栏:《Flask框架从入…

收银系统源码-千呼新零售2.0【连锁店财务管理】

千呼新零售2.0系统是零售行业连锁店一体化收银系统,包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体,线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货等连锁店使用。 详细介绍请查看下…

金融与大模型:引领行业未来的创新融合

前言 在数字化浪潮席卷全球的今天,金融与大模型的结合正成为行业发展的新引擎。这种融合不仅为金融机构带来了前所未有的效率和准确性,也为金融市场的稳定与发展注入了新的活力。本文将基于当前的市场现状,结合金融环境的发展,深…

探索大数据在信用评估中的独特价值

随着我国的信用体系越来越完善,信用将影响越来越多的人。现在新兴的大数据信用和传统信用,形成了互补的优势,大数据信用变得越来越重要,那大数据信用风险检测的重要性主要体现在什么地方呢?本文将详细为大家介绍一下,…

【ETABS】Main phrases of ETABS .e2k file and parameter roughly study

文章目录 $ STORIES - IN SEQUENCE FROM TOP$ GRIDS$ MATERIAL PROPERTIESTYPE "Steel"TYPE "Concrete" $ REBAR DEFINITIONS$ FRAME SECTIONS$ CONCRETE SECTIONS$ SLAB PROPERTIES$ WALL PROPERTIES$ POINT COORDINATES$ LINE CONNECTIVITIES$ AREA CONN…

【Python/Pytorch - 网络模型】-- 手把手搭建E3D LSTM网络

文章目录 文章目录 00 写在前面01 基于Pytorch版本的E3D LSTM代码02 论文下载 00 写在前面 测试代码,比较重要,它可以大概判断tensor维度在网络传播过程中,各个维度的变化情况,方便改成适合自己的数据集。 需要github上的数据集…

Vue37-非单文件组件

一、组件的两种编写形式: 非单文件组件;单文件组件。 二、创建一个组件 2-1、组件中的el 组件中不写el,不说为谁服务。 2-2、组件中的data 因为对象形式,多处复用的话,有引用关系,改一处,另一…

6月14日 Qtday2

#include "widget.h" #include "ui_widget.h" #include <QTimer> using namespace std; Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), lab1(new QLabel(this)) //初始化一个标签显示登录状态 {//设置华清远见的标签图…

基于Django、Bootstrap的电影推荐系统,算法基于用户的协同过滤算法,有爬虫有可视化后台

背景 基于Django和Bootstrap的电影推荐系统结合了用户协同过滤算法&#xff0c;通过爬虫技术获取电影数据&#xff0c;并在可视化后台展示推荐结果。该系统旨在提供个性化的电影推荐服务&#xff0c;帮助用户发现符合其喜好的电影。 用户协同过滤算法是一种常用的推荐算法&am…

JavaSE---类和对象(上)

1. 面向对象的初步认知 1.1 什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。 面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。用面向对象…

linux的UDP广播测试:C语言代码

测试代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h>#…

信息系统架构风格-系统架构师(十)

1、信息系统架构风格是描述特定应用领域中系统组织方式的惯用模式。架构风格定义了一个系统家族&#xff0c;即一个架构定义&#xff08;&#xff09;。 A一组设计原则 B一组模式 C一个词汇表和一组约束 D一组最佳实践 解析&#xff1a; 信息系统架构风格是描述某一特定 应…

014基于SSM+Jsp的网络视频播放器

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…