LangChain Few-shot prompt 用法示例总结

文章介绍了如何利用Few-shotprompt技术解决实际工作中关于问题语义判断的问题,提供了代码示例和配置说明。

最近有一个工作问题需要花费太多的人工时间,就考虑是否可以用LangChain Prompt进行解决。经过对LangChain 里的几种 prompt 模板对比分析,觉得 Few-shot prompt 最符合需求,然后就着手开始搭建。因为网上对于Few-shot prompt的用法资料不多,或讲解不完整,故此在这里做一下记录;

import os
from langchain import PromptTemplate
from langchain import FewShotPromptTemplate
from langchain.chains import LLMChain
from langchain.chat_models import ChatOpenAI

from configs import openai_key

# 大模型配置初始化
os.environ['OPENAI_API_KEY'] = openai_key['api_key_2']
llm = ChatOpenAI(temperature=0.9, model_name='gpt-3.5-turbo')


def Question_classify():
    """

    :return:
    """
    examples = [
        {
            "question": """下面两个句话描述的是同一个问题吗?\n问题1:单纯疱疹病毒感染的诱因有哪些?\n问题2:单纯疱疹病毒感染的原因是什么?""",
            "answer": "是"
        },
        {
            "question": """下面两个句话描述的是同一个问题吗?\n问题1:指骨骨折需要吃什么药?\n问题2:骨折时需要用哪种药?""",
            "answer": "不是"
        },
        {
            "question": """下面两个句话描述的是同一个问题吗?\n问题1:范可尼贫血影响生育吗?\n问题2:范可尼是否会影响生育能力?""",
            "answer": "不是"
        },
        {
            "question": """下面两个句话描述的是同一个问题吗?\n问题1:霍乱能自己好吗?\n问题2:霍乱是否会自愈?""",
            "answer": "是"
        },
        {
            "question": """下面两个句话描述的是同一个问题吗?\n问题1:霍乱是否会自愈?\n问题2:霍乱能彻底治愈吗?""",
            "answer": "不是"
        },
    ]

    example_template = """Question: {question}\n{answer}"""

    example_prompt = PromptTemplate(
        input_variables=["question", "answer"],
        template=example_template
    )

    prefix = """假设你是一个中国高中语文老师,现在请你对两个问题的描述内容进行语义相似判断,如果它们表达内容含义一样,就判断为同一问题, 并回答'是',反之回答'不是'。\n下面是一些示例:"""
    suffix = """
    Question: {input}
    """

    # print(example_prompt.format(**examples[0]))

    prompt = FewShotPromptTemplate(
        examples=examples,
        example_prompt=example_prompt,
        prefix=prefix,
        suffix="Question: {input}",
        input_variables=["input"]
    )

    input2 = """下面两个句话描述的是同一个问题吗?\n问题1:结节性多动脉炎会不会影响生育?\n问题2:结节性多动脉炎对生育会有什么影响吗?"""
    input3 = """下面两个句话描述的是同一个问题吗?\n问题1:多发性硬化究竟是怎样一种疾病?\n问题2:多发性硬化会有些什么样的表现?"""
    input4 = """下面两个句话描述的是同一个问题吗?\n问题1:乙状结肠癌的发病率高吗?\n问题2:乙状结肠癌的高发人群是哪些?"""
    # print(prompt.format(input=input))
    chain = LLMChain(llm=llm, prompt=prompt)

    return chain



if __name__ == '__main__':
    input5 = """下面两个句话描述的是同一个问题吗?\n问题1:乙状结肠癌的发病率高吗?\n问题2:乙状结肠癌的高发人群是哪些?"""
    chain = Question_classfy()
    print(chain.run(input5))

### Few-shot Prompt 的概念 Few-shot prompt 是一种特定类型的提示技术,用于指导大型语言模型在仅有少量样本的情况下完成新任务。这种技术借鉴了迁移学习的思想,在自然语言处理(NLP)领域尤为有用,尤其是在标注数据有限的情境下[^1]。 通过精心设计的提示语句,few-shot prompt 能够让预训练的语言模型理解并执行新的指令或任务。这种方式不仅提高了模型对不同应用场景的适应能力,还减少了获取大量标记数据的需求。 ### 应用场景 当面对一个新的分类任务而只有少数几个例子可用时,可以构建一个包含这些示例及其标签在内的提示模板,并将其提供给预先训练好的语言模型。这样做的目的是为了让模型能够基于已有的知识库以及所提供的额外信息来推断未知情况下的正确响应。 例如,在情感分析的任务中,如果只给出了两个正面评论和两个负面评论作为输入,则可以通过创建如下所示的提示: ```plaintext Positive review examples: - I love this product! It works perfectly. - Terrible quality, do not buy it. - Waste of money. Please classify the following sentence as positive or negative sentiment: "The item exceeded all my expectations." ``` 在这个过程中,模型会尝试根据给出的例子模式识别出待测句子的情感倾向。由于已经接受了广泛的文本材料训练,因此即使是在看到极少量的新类别实例之后也能做出合理的预测。 ### 技术实现 为了更好地说明 few-shot 学习的技术细节,这里介绍了一种称为情景训练策略的方法。此方法模拟了一个少样本的学习环境,其中每次迭代都会随机抽取一定数量的支持集和支持查询来进行优化调整[^3]。 假设有一个 K-way-N-shot 任务,意味着有 K 类不同的对象每类各有 N 个样本被选作支持集合;另外还有 Q 条来自同一分布但未见过的数据点充当测试询问。对于每一个查询项 \(x_q\) ,算法计算其归属于各个可能类别 k 的概率 p(k|x_q),最终选取具有最高得分的那个选项作为输出结果。 \[p(c_k|x_q)=\frac{\exp(\alpha d(f(x_q),c_k))}{\sum_j \exp(\alpha d(f(x_q),c_j))}\] 此处 \(f()\) 表示特征提取器或者说骨干网络,\(d()\ )度量相似性距离,\(α\) 控制温度系数影响决策边界软硬度。经过多轮次这样的练习后,整个框架就能逐渐学会应对多种多样且变化莫测的真实世界挑战了。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值