04|提示工程(上):用少样本FewShotTemplate和ExampleSelector创建应景文案
- 深入了解
- 翻译
- 解释
- 总结
LangChain中的提示模板技术为读者提供了一种创造应景文案的方法。文章首先解释了加入partial_variables后,模型能够生成结构化输出的原因,然后介绍了吴恩达老师和Open AI官方文档中提出的提示工程的原则和策略。接着详细介绍了LangChain中的提示模板的类型和使用方法,包括PromptTemplate和ChatPromptTemplate等。文章通过示例代码展示了如何利用LangChain中的提示模板来生成具体的提示,以及如何根据不同的角色来设计聊天消息。此外,还介绍了FewShotPromptTemplate的使用方法,通过创建示例样本和提示模板,读者可以了解如何构建出最合适的鲜花文案。整体而言,本文深入浅出地介绍了LangChain中的提示模板的使用方法,对读者快速了解和应用该技术具有很好的指导意义。文章内容详实,对LangChain中的提示模板有很好的介绍和示范。
《LangChain 实战课》,新⼈⾸单¥59
全部留言(10)
- 最新
- 精选
- 黄振宇我使用prompt遇到的一些问题 1. 最常见的initial_agent方法直接传入prompt参数,好像无效。只能通过agent_kwargs的PREFIX和SUFFIX等传入。 2. 先定义个LLMChain传入prompt参数,在定义一个agent(single action或者multi action) 3. 有时候传值进去,最后打印agent的prompt,发现好像也没有成功。 4. openAI的模型还好,没怎么管输入输出的prompt的格式。但llama2的模型更难伺候,同样的代码只是换了LLM模型就运行不了,不是报没有input_variables就是输出无法parse,很困惑。 以上希望在老师的课程里都能得到解答。 另外,最近想去解决上述问题,看了langchain的源码,一头雾水,感觉东西太多了,不知从何开始,如果花大量时间在研究langchain上面又担心本末倒置了,毕竟它只是一个工具,还有好多的应用层的东西需要学习和研究,但是不吃透langchain只能做一些简单chatbot的应用。所以也比较迷茫,希望老师也能给出解答,如何做好二者的平衡。
作者回复: 同学的前面几个问题,非常非常的细节。 我使用prompt遇到的一些问题 1. 最常见的initial_agent方法直接传入prompt参数,好像无效。只能通过agent_kwargs的PREFIX和SUFFIX等传入。 2. 先定义个LLMChain传入prompt参数,在定义一个agent(single action或者multi action) 3. 有时候传值进去,最后打印agent的prompt,发现好像也没有成功。 4. openAI的模型还好,没怎么管输入输出的prompt的格式。但llama2的模型更难伺候,同样的代码只是换了LLM模型就运行不了,不是报没有input_variables就是输出无法parse,很困惑。 这几个问题,我觉得同学可以加我的微信或者加群,然后把具体代码传给我,我们看看代码来解决。 后面一个问题,我的想法是,把课程学完,我想你应该理解LangChain的六大组件的精髓和核心思想了。可能学到一半就可以知道 —— LangChain能干什么,不能干什么了。我认为最重要的是学Agent的思想,以及学LangChain是怎么做提示工程的。 我认为你仍然应该以自己日常业务为工作学习的中心,LangChain只是工具,它可能能够应用再你的日常业务中,也可能不能。但是,它的思想,在未来几年的开发过程中,你肯定用得上。 所以,不必苦钻细节了。了解思想精髓为主。LangChain太新,调试起来太耗费你的精力。 把课程学完,我们了解LangChain的思想,以及它未来的可能性。等将来有了具体项目需求,你根据项目需求再来深入学那一块。这样效率比较高,你的成就感也高。
2023-09-13归属地:浙江37 - 悟尘我发现有时候不指定 .prompts,直接从 LangChain 包也能导入模板。 会有告警信息: langchain/__init__.py:34: UserWarning: Importing PromptTemplate from langchain root module is no longer supported. Please use langchain.prompts.PromptTemplate instead. warnings.warn( 所以,建议还是指定 .prompts,即from langchain.prompts.prompt import PromptTemplate
作者回复: 新版本会要求从更具体的包中导入,而不是LangChain主包。
2023-11-08归属地:北京1 - 高源老师有个问题问下,例如大模型知道你提出问题后,是如何输出满意的答案呢,例如一道算法编程题目,大模型知道你的问题后,是根据自己以前存储类似答案输出的吗,我提个新的特殊问题,他是怎么思考输出的呢
作者回复: 这是OpenAI和其它厂子用海量数据训练大模型,用代码训练,指令微调和对齐之后,大模型自己拥有的神奇能力啊。 大模型见多识广,能够举一反三。因此称得上是“智能”。它绝对不是对之前见过的东西的简单存储。如果是那样,它和搜索引擎不就没区别了?
2023-10-29归属地:吉林1 - 抽象派老师,请问“模型思考的时间”这个怎么理解啊?可以举个例子吗?
作者回复: “给模型思考的时间”。就是,让模型一步一步的推理,慢慢的推理,慢慢思考的意思。背后的哲学是,把模型当成“人”来对待。 这个哲学有多大用,值得商榷。需要论文,实验,来验证,这样指导模型是否有用,或者对什么类型的问题有用。
2023-10-18归属地:广东1 - D.L黄老师,请教一下: 课程中有段代码 ``` # 初始化示例选择器 example_selector = SemanticSimilarityExampleSelector.from_examples( samples, OpenAIEmbeddings(), Chroma, k=1) ``` 将`Chroma`换成`Qdrant`,则会报错,报错信息如下(报错太长,省略部分) ``` Traceback (most recent call last): File "/python3.10/site-packages/langchain/vectorstores/qdrant.py", line 1584, in construct_instance collection_info = client.get_collection(collection_name=collection_name) ... ... ... ... ... ... File "/python3.10/site-packages/qdrant_client/http/api_client.py", line 97, in send raise UnexpectedResponse.for_response(response) qdrant_client.http.exceptions.UnexpectedResponse: Unexpected Response: 502 (Bad Gateway) Raw response content: b'' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/langchan_learning/05-demo.py", line 43, in <module> example_selector = SemanticSimilarityExampleSelector.from_examples( File "/python3.10/site-packages/langchain_core/example_selectors/semantic_similarity.py", line 97, in from_examples vectorstore = vectorstore_cls.from_texts( File "/python3.10/site-packages/langchain/vectorstores/qdrant.py", line 1301, in from_texts qdrant = cls.construct_instance( ... ... ... ... ... ... File "/python3.10/site-packages/qdrant_client/http/api_client.py", line 97, in send raise UnexpectedResponse.for_response(response) qdrant_client.http.exceptions.UnexpectedResponse: Unexpected Response: 502 (Bad Gateway) Raw response content: b'' ```
作者回复: 有的时候我也遇到这样情况,有时候我的Windows系统跑不了,同样的环境Linux可以。
2023-12-05归属地:湖北 - 一面湖水# 初始化示例选择器example_selector = SemanticSimilarityExampleSelector.from_examples( samples, OpenAIEmbeddings(), Chroma, k=1) 这里改成:Qdrant会报错呢?
作者回复: 具体错误同学贴一下?
2023-10-13归属地:四川 - 杨松老师您好,请教个问题,文中代码: # 创建一个使用示例选择器的FewShotPromptTemplate对象 prompt = FewShotPromptTemplate( example_selector=example_selector, example_prompt=prompt_sample, suffix="鲜花类型: {flower_type}\n场合: {occasion}", input_variables=["flower_type", "occasion"]) print(prompt.format(flower_type="红玫瑰", occasion="爱情")) 的打印结果为: 鲜花类型: 玫瑰 场合: 爱情 文案: 玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。 鲜花类型: 红玫瑰 场合: 爱情 我的问题是 玫瑰的那个文字是example_selector生成的,还是example_prompt生成的,或者是两者同事生成后去重了?
作者回复: 你好,让我们逐步解析代码来回答你的问题。 在我们的代码中,FewShotPromptTemplate 对象是基于给定示例和示例提示来生成提示的。这个对象的目标是,根据给定的输入变量,选择一个或多个最相关的示例,并结合示例提示来生成一个完整的提示。 example_selector 的作用是从所有的示例中选择最相关的示例。代码中,example_selector 使用了语义相似度来选择最相关的示例,只选择一个最相关的示例(k=1)。 example_prompt 的作用是为选择的示例提供一个格式,将它们转换为一个可读的提示部分。 回到你的问题:玫瑰的那个文字是example_selector生成的,还是example_prompt生成的,或者是两者同事生成后去重了? 玫瑰的那个文字(以及关于玫瑰的整个描述)是由 example_selector 从 samples 中选择出来的。具体来说,example_selector 认为“玫瑰”是与“红玫瑰”最相关的示例。然后,这个选出的示例被传递给 example_prompt 来格式化,产生“鲜花类型: 玫瑰\n场合: 爱情\n文案: 玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。”这部分的输出。 接下来,suffix 提供了一个方式来结合输入变量(在这里是 "红玫瑰" 和 "爱情")与选择的示例描述,从而得到最终的完整提示。这个过程没有去重操作。只是 example_selector 选择了最相关的示例,然后 example_prompt 将其格式化,再结合 suffix 生成最终的提示。
2023-10-10归属地:辽宁2 - Yimmytemplate="鲜花类型: {flower_type}\n场合: {occasion}\n文案: {ad_copy}")--这里多了括号)
作者回复: 谢谢同学的细心,我们已调整代码!
2023-09-19归属地:北京 - 阿斯蒂芬假设做一个垂直领域的对话机器人,是否可以将用户的query通过一定的转换方式,比如embedding去“匹配”一些 Prompt,且增加Few or One example 的参考示例,相当于将query加工后,形成更加“指令化”的请求,便于让模型往更清晰地“理解”用户的说法,并按照更“步骤化”的方式去思考并给出答案。 也就是说,实际上用户与模型的交互,中间还是隐藏了很多“工程师加工”细节~ 另外 ExampleSelector 的意义看起来是将 example 的匹配进行高层抽象,屏蔽细节,应该除了 Embbdings 方式,还有其他种种获取 example 的方式。使用Selector还有好处就是可以通过examples的瘦身节省tokens。
作者回复: 嗯,对啊。做垂直领域的对话机器人,工程上的东西是很多的。Prompt Engineering是必须的。
2023-09-17归属地:广东 - 骨汤鸡蛋面langchain 的很多提示都是针对chatgpt的,是不是可以理解为,chatgpt在进行sft的时候,数据集就用上了langchain很多prompt的措辞方式,所以chatgpt对这些prompt的效果也很好。
作者回复: 这个猜测很有意思哦。也很可能。 当然OpenAI 在训练 GPT-3 和之前版本的 GPT 时使用了多种数据源和技术,但具体的细节并没有公开。 关于 GPT-3 或 ChatGPT 对特定提示 (prompt) 的表现,确实,如果模型在训练数据中遇到了类似的措辞或结构,它在对此类提示做出回应时通常会有更好的效果。 不过,我想,LangChain的愿景可能是对各种LLM都能够用通用的、一致的、清晰的标准提示词搞定所有模型。
2023-09-13归属地:上海