一、前言
在当今的自然语言处理领域,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. 基础环境
- 操作系统:不限
3.2. 安装虚拟环境
conda create --name langchain python=3.10
conda activate langchain
pip install langchain langchain-openai langchain-community
四、技术实现
4.1.MessagesPlaceholder示例一
import os
from langchain.chains.llm import LLMChain
from langchain_core.messages import SystemMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai import ChatOpenAI
os.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 os
from langchain.chains.conversation.base import ConversationChain
from langchain.memory import ConversationBufferMemory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai import ChatOpenAI
os.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):部分变量是模板的一部分,可以在生成文本时被预先填充为特定的值。例如,如果模板中需要包含当前日期,那么可以使用部分变量将日期预先填充进模板中。