在生产中,问答应用程序通常会将聊天记录保存到数据库中,并能够适当地读取和更新它。Langchain非常周到,它已经实现了内置持久层,使其成为支持多轮对话的聊天应用程序的理想选择。为了管理多个对话轮次和线程,我们要做的就是在编译应用程序时指定一个checkpoint。因为我们graph中的node不断地将messages appends到state,因此我们将在调用之间保留一致的聊天历史记录。这里简单示例,就直接使用了 memory saver,可选地,可以使用关系型数据库比如 postgresql ,langchain也是直接支持的。from langgraph.checkpoint.memory import MemorySaver
memory = MemorySaver()
graph = graph_builder.compile(checkpointer=memory)
# 指定线程id作为关联
config = {"configurable": {"thread_id": "abc123"}}
然后我们invoke的时候也要加上这个config:for step in graph.stream(
{"messages": [{"role": "user", "content": input_message}]},
stream_mode="values",
config=config,
):
step["messages"][-1].pretty_print()
最后我们可以从tools message 的列表中看到它携带了多轮的历史message记录。
agent利用 LLM 的推理能力在执行过程中做出决策。使用agent可以让我们在检索过程中减轻额外的判断力。尽管它们的行为不如上述“chain”的方式可预测,但它们能够执行多个检索步骤以完成query,或者在单个搜索中进行loop执行。下面我们组装一个最小的 RAG 代理。使用 LangGraph 预构建的 ReAct 代理构造函数,我们可以在一行中完成此操作。from langgraph.prebuilt import create_react_agent
from component import llm_model, vector_store
from langchain_core.tools import tool
@tool(response_format="content_and_artifact")
def question_process(question: str):
"""所有为什么的问题都会走这个工具"""
retrieved_docs = vector_store.similarity_search(question, k=2)
serialized = "\n\n".join(
f"Source: {doc.metadata}\n" f"Content: {doc.page_content}"
for doc in retrieved_docs
)
return serialized, retrieved_docs
from langgraph.checkpoint.memory import MemorySaver
memory = MemorySaver()
agent_executor = create_react_agent(llm_model, [question_process], checkpointer=memory)
config = {"configurable": {"thread_id": "def234"}}
input_message = (
"为什么着急给猫洗澡?"
)
for event in agent_executor.stream(
{"messages": [{"role": "user", "content": input_message}]},
stream_mode="values",
config=config,
):
event["messages"][-1].pretty_print()
这个预购的 graph agent的流程如下图所示:可以看到,agent和tools形成了一个环,这是非常有用的。比如,我们可以在提示词的时候对其进行step规划,先查询什么,然后根据查询的结果再查询什么...因为是LLM和tool的环,这是能够做的,而不是由人去手动编写这些流程。这是最重要的思路,也就是大模型中常常提到的 链式思维,这可以提高Agent的回复效果。RAG 入门案例到此为止,后面会有更加深入的完善示例更新。
- https://python.langchain.com/docs/tutorials/qa_chat_history/
- https://langchain-ai.github.io/langgraph/how-tos/persistence_postgres/