当前位置: 首页 > news >正文

开源模型应用落地-LangChain实用小技巧-MessagesPlaceholder使用(二)

一、前言

    在当今的自然语言处理领域,LangChain 框架因其强大的功能和灵活性而备受关注。掌握一些实用的小技巧,能够让您在使用 LangChain 框架时更加得心应手,从而更高效地开发出优质的自然语言处理应用。


二、术语

2.1.LangChain

    是一个全方位的、基于大语言模型这种预测能力的应用开发工具。LangChain的预构建链功能,就像乐高积木一样,无论你是新手还是经验丰富的开发者,都可以选择适合自己的部分快速构建项目。对于希望进行更深入工作的开发者,LangChain 提供的模块化组件则允许你根据自己的需求定制和创建应用中的功能链条。

    LangChain本质上就是对各种大模型提供的API的套壳,是为了方便我们使用这些 API,搭建起来的一些框架、模块和接口。

   LangChain的主要特性:
        1.可以连接多种数据源,比如网页链接、本地PDF文件、向量数据库等
        2.允许语言模型与其环境交互
        3.封装了Model I/O(输入/输出)、Retrieval(检索器)、Memory(记忆)、Agents(决策和调度)等核心组件
        4.可以使用链的方式组装这些组件,以便最好地完成特定用例。
        5.围绕以上设计原则,LangChain解决了现在开发人工智能应用的一些切实痛点。

2.2.MessagesPlaceholder

    用于在格式化期间完全控制要呈现的消息。它在 LangChain 框架中主要用于聊天提示模板(ChatPromptTemplate)的场景。

    当不确定应该使用哪个角色来生成消息提示模板,或者希望在格式化过程中动态插入一系列消息时,MessagesPlaceholder 会非常有用。例如,你可以使用 MessagesPlaceholder 来插入之前的聊天历史记录,以便聊天模型在生成响应时能够参考这些上下文信息。


三、前提条件 

3.1. 基础环境

  1.  操作系统:不限

3.2. 安装虚拟环境

conda create --name langchain python=3.10
conda activate langchain
pip install langchain langchain-openai langchain-community

四、技术实现

4.1.MessagesPlaceholder示例一

import osfrom langchain.chains.llm import LLMChain
from langchain_core.messages import SystemMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai import ChatOpenAIos.environ["OPENAI_API_KEY"] = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"if __name__ == '__main__':chat_prompt = ChatPromptTemplate.from_messages([MessagesPlaceholder(variable_name="context"),("human", "{input}"),])context = '现在是2024年7月28日11时17分,广州的实时天气是中雨,温度为29℃,东南风1级,湿度95%。'system_message = [SystemMessage(context)]print(chat_prompt.format(context=system_message,input = "2024-7-28日出门需要带伞吗?"))llm = ChatOpenAI(model_name='gpt-3.5-turbo-1106', temperature=0.1, max_tokens=512)# 创建一个对话链chain = LLMChain(llm=llm,prompt=chat_prompt,verbose=True)print(chain.predict(input="2024-7-28日出门需要带伞吗?",context = system_message))


调用结果:

说明:

1. 在ChatPromptTemplate中,插入了context占位符

2. 初始化一条SystemMessage,并填充至ChatPromptTemplate占位符中

4.2.MessagesPlaceholder示例二

    format方法则用于将提示模板中的占位符替换为具体的变量值,以得到完整的提示字符串。它需要传入所有未被部分格式化的变量的值。

import osfrom langchain.chains.conversation.base import ConversationChain
from langchain.memory import ConversationBufferMemory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai import ChatOpenAIos.environ["OPENAI_API_KEY"] = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"if __name__ == '__main__':memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)memory.save_context({"input": "你好,我叫蜘蛛侠"}, {"output": "很高兴认识你,蜘蛛侠!作为一名人工助理,我会尽我所能为你提供帮助。你有什么需要我协助的吗?"})variables = memory.load_memory_variables({})print(variables)chat_prompt = ChatPromptTemplate.from_messages([("system", "你是一个乐于助人的助手。"),MessagesPlaceholder(variable_name="chat_history"),("human", "{input}"),])print('-------------------------------------------------------------')print(chat_prompt.format(chat_history=variables["chat_history"],input = "Hi, 你还记得我叫什么名字吗?"))llm = ChatOpenAI(model_name='gpt-3.5-turbo-1106', temperature=0.7, max_tokens=512)# 创建一个对话链conversation = ConversationChain(llm=llm,memory=memory,prompt=chat_prompt,verbose=True)print(conversation.predict(input="Hi, 你还记得我叫什么名字吗?",chat_history = variables['chat_history']))

调用结果:

说明:

1. 在ChatPromptTemplate中,插入了chat_history占位符

2. 在ConversationBufferMemory中,添加历史对话内容,并指定缓存在chat_history的key下面

3. 根据上述两步,将记忆组件中的历史对话内容填充至ChatPromptTemplate占位符中


五、附带说明

5.1. MessagesPlaceholder使用总结

  通过使用 MessagesPlaceholder,可以简化构建提示的过程,避免手动处理历史消息的添加和管理,让开发者更专注于业务逻辑的实现。例如,在一个客服聊天机器人中,它可以记住之前与用户的对话历史,从而更好地理解用户的问题和需求,提供更准确和相关的回答。

  除了 MessagesPlaceholder 外,LangChain 框架中还有一些其他常用的占位符,例如:

  • 模板字符串中的占位符:在提示模板(Prompt Template)的模板字符串中,可以使用各种占位符来插入变量值或执行特定的文本格式化操作。常见的占位符形式可能类似于 {变量名},在格式化时,这些占位符会被相应的变量值替换。
  • 部分变量(Partial Variables):部分变量是模板的一部分,可以在生成文本时被预先填充为特定的值。例如,如果模板中需要包含当前日期,那么可以使用部分变量将日期预先填充进模板中。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 昇思MindSpore 应用学习-RNN实现情感分类-CSDN
  • Python 百题(实战快速掌握语法)_2(链表)
  • 全国区块链职业技能大赛样题第9套智能合约+数据库表设计
  • Linux网络-netstat命令
  • C++和R穿刺针吸活检肿瘤算法模型模拟和进化动力学量化差异模型
  • 面对AI伦理挑战:共筑稳固安全的未来发展之路
  • vue项目启动报错 vue与vue-template-compiler版本不一致
  • 玄机 第一章 应急响应-linux日志分析
  • unity3d:TabView,UGUI多标签页组件,TreeView树状展开菜单
  • 【初阶数据结构篇】实现顺序结构二叉树(堆的实现方法)
  • 面试题:简单介绍一下快速失败和安全失败。简单介绍一下快速失败和安全失败和集合类的关联。
  • 模糊逻辑——模糊模型预测
  • MSPM0G3507学习笔记1:开发环境_引脚认识与点灯
  • 国内NAT服务器docker方式搭建rustdesk服务
  • Bat windows 的脚本文件
  • AWS实战 - 利用IAM对S3做访问控制
  • docker-consul
  • Intervention/image 图片处理扩展包的安装和使用
  • Java深入 - 深入理解Java集合
  • MySQL QA
  • Protobuf3语言指南
  • scala基础语法(二)
  • 从0到1:PostCSS 插件开发最佳实践
  • 从0实现一个tiny react(三)生命周期
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 从伪并行的 Python 多线程说起
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 问题之ssh中Host key verification failed的解决
  • 学习笔记:对象,原型和继承(1)
  • 正则表达式
  • hi-nginx-1.3.4编译安装
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #图像处理
  • (1)虚拟机的安装与使用,linux系统安装
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (4)STL算法之比较
  • (pycharm)安装python库函数Matplotlib步骤
  • (补)B+树一些思想
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十六)Flask之蓝图
  • (算法)硬币问题
  • (一)、python程序--模拟电脑鼠走迷宫
  • (转)Google的Objective-C编码规范
  • .apk文件,IIS不支持下载解决
  • .bat批处理出现中文乱码的情况
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET 表达式计算:Expression Evaluator
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NetCore发布到IIS