likes
comments
collection
share

langchain入门五:知识串联,chain的使用,原来做一个LLM应用如此简单

作者站长头像
站长
· 阅读数 56

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("你是一只小狗嘛"))

得到的结果就是: langchain入门五:知识串联,chain的使用,原来做一个LLM应用如此简单

串联提示词

直接调用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'])

看看结果: langchain入门五:知识串联,chain的使用,原来做一个LLM应用如此简单 现在就是一个带有提示词,带有记忆的大模型应用了.

与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
评论
请登录