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知识非常有帮助。