LangChain实战技巧之二:RunnablePassthrough.assign的两则妙用

323 阅读1分钟

AI菜鸟向前飞 — LangChain系列之八 - 深入浅出LCEL与Chain(下篇)

    若大家对RunnablePassthrough.assign的知识比较陌生的话,请参考上面那篇我的公众号文章,一定对你会有所帮助。

第一种:创建Agent

    很多文章告诉大家创建Agent时采用的是这种方式

agent = create_tool_calling_agent(llm=model, tools=tools, prompt=hub.pull("hwchase17/openai-tools-agent"))

        或

agent = (
            {
                "input": lambda x: x["input"],
                "agent_scratchpad": lambda x: format_to_openai_function_messages(x["intermediate_steps"])
            }
            | hub.pull("hwchase17/openai-tools-agent")
            | model.bind_tools(tools=tools)
            | parse
        )

    有个更“妙”的办法

agent = (
            RunnablePassthrough.assign(agent_scratchpad=lambda x: format_to_openai_function_messages(x["intermediate_steps"])
        )
        | hub.pull("hwchase17/openai-tools-agent")
        | model.bind_tools(tools=tools)
        | parse
)

第二种:RAG检索

    首先给你一个提示词

prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "你是一名特别棒的AI助手,这里有一些资料 {content}你可以用来解答问题。"),
        ("human","提问:{question}"),
    ]
)

    大部分人的写法

content = retriever.get_relevant_documents("Song榆钱儿的公众号的相关信息")
chain = prompt | ChatTongyi()

chain.invoke({"content": content, "question": "Song榆钱儿的公众号,今天你看了没有?"})

    更妙的写法

content = itemgetter("question") | retriever
chain_rag = RunnablePassthrough.assign(content=content) | prompt | ChatTongyi()

chain_rag.invoke({"question": "Song榆钱儿的公众号,今天你看了没有?"})

        乍一看,有些人会说这不就是在invoke时少带一个content么?其实不然,当你使用高级的用法时,你就知道它的好处了(例如:RunnableWithMessageHistory)

        不知各位发现没有,所谓的妙用都是“转成”Chain,这是一种非常重要的LangChain语法,学好它对后面的LangGraph知识非常有帮助。