langchain入门五:知识串联,chain的使用,原来做一个LLM应用如此简单
Chain的意义
Chain,翻译成链的意思,顾名思义将其他东西链接起来,串联起来,链式链接. 在langchain中,单独使用llm进行问答是没有问题的,但是对于llm大模型,prompt提示词,memory记忆组件,agent代理等单独得模块如何串联起来需要一个解决办法.langchain中Chain的意义就在于将这些模块串联起来,实现一个完善的大模型应用.
如何使用chain将模块进行串联
对于单独使用llm,非常简单,但是局限性很大,没有记忆,没有提示词的限制.得到的结果往往也达不到需求.
#举个例子
llm=ChatOpenAI(temperature=0, model="gpt-3.5-turbo")
print("第一次对话:",llm.invoke("你是一只小狗,只会汪汪叫"),"\n\n第二次对话:",llm.invoke("你是一只小狗嘛"))
得到的结果就是:
串联提示词
直接调用llm回答是生硬的,而且只根据模型原本的回答规则进行响应,我要是想给它加点提示词呢,我希望它的角色是一只小猫,每次回答结束都要加上一个'喵',首先想到的肯定是需要使用提示词prompt,然后用chain把prompt与llm串联起来.
#提示词
template='''你是一只小猫,你的任务是回答人类的问题,并且每次回答结束都要加上一个'喵'。
human:{question}
'''
prompt=PromptTemplate(
template=template,
input_variables=["question"]
)
#使用链将它们串联起来
chain = LLMChain(
llm=llm,
prompt=prompt
)
现在就这个程序就是一个带有提示词的大模型应用了可以使用chian.invoke()
调用程序.
串联记忆
直接使用llm或是使用带有prompt的llm应用,都是没有记忆的,她们的记忆范围只有程序开始执行,到程序执行结束.当第二次执行时,就访问不到第一次的内容了.如何让llm有记忆呢,那肯定必不可少的使用memory组件.
from langchain.memory import ConversationBufferMemory
#创建一个记忆组件
memory = ConversationBufferMemory(memory_key="chat_memory",return_messages=False)
#给提示词中加入记忆
template='''你是一只会回答问题的小猫,你的任务是用温柔的语气回答人类的问题,并且回答结尾都加上一个'喵'。
{chat_memory}
human:{question}
'''
prompt=PromptTemplate(
template=template,
input_variables=["question"]
)
# 使用chain将他们串联起来
chain = LLMChain(
llm=llm,
prompt=prompt,
memory=memory,
verbose=True
)
#给他几个问题看看结果
chain.invoke("我分手了,我好难过,呜呜呜")
chain.invoke("你是谁?")
chain.invoke("今天的天气真好啊")
res = chain.invoke("我最开始跟你聊的什么呢?")
print(res['text'])
看看结果:
现在就是一个带有提示词,带有记忆的大模型应用了.
与agent串联
agent的使用似乎也起到了链接提示词与记忆组件的作用.但是代理的提示词是从hub中拉取的,没办法自定义,早期的langchain版本中创建agent的方式也无法使用提示词,甚至连记忆组件都无法使用.而agent中唯一能够自定义的似乎只有为他配备的工具包tools,工具包正是代理与链串联的那个'链'.将一个串联了提示词与记忆的chain作为工具配备给agent,代理能够将人类输入的问题作为参数传递给这个chain,而chain的回答将作为返回结果返回去,而agent将根据返回结果进行回答或是调用其他工具.
@tool
def llm_chain_tool(text):
'''这是一个适用于回答问题的工具...'''
memory = ConversationBufferMemory(memory_key="chat_memory",return_messages=False)
#给提示词中加入记忆
template='''你是一只会回答问题的小猫,你的任务是用温柔的语气回答人类的问题,并且回答结尾都加上一个'喵'。
{chat_memory}
human:{question}
'''
prompt=PromptTemplate(
template=template,
input_variables=["question"]
)
# 使用chain将他们串联起来
chain = LLMChain(
llm=llm,
prompt=prompt,
memory=memory,
verbose=True
)
#给他几个问题看看结果
return chain.invoke("text")
总结
chain在langchain应用中是一个不可缺少的重要工具,是各个模块联系的纽带.将各种模块链接起来就可以实现一个个更加有趣的大模型应用.对于agent将chain作为工具使用将在后期进阶内容中介绍.
参考资料:LangChain
转载自:https://juejin.cn/post/7350924978679742514