用Python编写的带有消息历史记录的简单LangChain聊天机器人。

该指南遵循langchain内部文档:

https://python.langchain.com/docs/how_to/message_history/ https://python.langchain.com/zh/docs/how_to/message_history/

什么是Langchain?

LangChain 就像一个工具包,帮助您构建智能聊天机器人。 想象一下,您正在与一台机器人对话。 通常,在您问问题并获得答复后,机器人会忘记一切。 但是使用 LangChain,机器人可以记得您之前说过的话,使对话更加自然,就像与记得事情的人交谈一样。

它的工作方式是通过连接不同的部件:

  1. 留言:您或AI说的话。
  2. 记忆:聊天机器人储存过去对话的地方,以便稍后能够回忆起来。
  3. 状态管理:这有助于聊天机器人了解对话中发生的事情并跟踪一切。

如何将消息历史记录添加到 langchain 聊天机器人?

让我们开始安装正确的库

pip install -qU langchain-openai
pip install python-dotenv

在.env文件中保存你的OPENAI_API_KEY

OPENAI_API_KEY = 'your-api-key'

现在创建一个main.py文件,并导入您的密钥,作为第一步,我们将导入正确的库并定义一个新的Llm模型。

from langchain_core.messages import  HumanMessage
from langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import START, MessagesState, StateGraph
from langchain_openai import ChatOpenAI
import os
from dotenv import load_dotenv


load_dotenv()
# Create a ChatOpenAI model
llm = ChatOpenAI(model="gpt-4o-mini", api_key=os.environ["OPENAI_API_KEY"])

LangChain 使用一种称为“状态图”的技术来管理对话的流程。在这里,我们定义了一个名为workflow的新StateGraph,它将处理用户和人工智能之间的消息。对话的状态(包括过去的消息)由MessagesState来管理。

workflow = StateGraph(state_schema=MessagesState)

这个函数,call_model,是聊天机器人的大脑。它接收对话状态(到目前为止的消息)并调用GPT模型生成回复。该函数然后返回更新的消息列表,包括来自人工智能的新回复。

def call_model(state: MessagesState):
response = llm.invoke(state["messages"])
return {"messages": response}

在这里,我们为对话定义了一个简单的流程:

  1. add_edge(START, “model”): 这告诉LangChain通过调用模型开始对话。
  2. add_node(“model”, call_model): 我们添加一个单节点,其中调用模型以生成响应。此节点使用我们之前定义的call_model函数。
  3. workflow.add_edge(START, "model")
    workflow.add_node("model", call_model)

聊天机器人使用记忆来保留过去的对话。我们添加了一个记忆组件(MemorySaver)来保存对话历史。然后,我们将工作流程编译成一个包含这个记忆的应用程序。

配置允许我们将特定设置传递到工作流程中,例如一个 thread_id,这可能对跟踪对话很有用。

memory = MemorySaver()
app = workflow.compile(checkpointer=memory)
config = {"configurable": {"thread_id": "abc123"}}

注意,如果您更改“thread_id”,聊天机器人将不会了解当前对话的任何内容。

这是聊天机器人运行的主循环:

  1. > “): 该程序等待用户输入消息。
  2. HumanMessage(query):用户的消息被包装在一个HumanMessage对象中。
  3. app.invoke(): 应用程序(编译后的工作流程)处理用户的消息,GPT模型生成响应。
  4. pretty_print():用户将看到打印的最后一条消息(AI的回应)。
  5. while True:
    query = input(">> ")
    input_messages = [HumanMessage(query)]
    output = app.invoke({"messages": input_messages}, config)
    output["messages"][-1].pretty_print()

完整代码

from langchain_core.messages import  HumanMessage
from langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import START, MessagesState, StateGraph
from langchain_openai import ChatOpenAI
import os
from dotenv import load_dotenv


load_dotenv()
# Create a ChatOpenAI model
llm = ChatOpenAI(model="gpt-4o-mini", api_key=os.environ["OPENAI_API_KEY"])


# Define a new graph
workflow = StateGraph(state_schema=MessagesState)


# Define the function that calls the model
def call_model(state: MessagesState):
response = llm.invoke(state["messages"])
# Update message history with response:
return {"messages": response}

# Define the (single) node in the graph
workflow.add_edge(START, "model")
workflow.add_node("model", call_model)

# Add memory
memory = MemorySaver()
app = workflow.compile(checkpointer=memory)

config = {"configurable": {"thread_id": "abc123"}}

while True:
query = input(">> ")
input_messages = [HumanMessage(query)]
output = app.invoke({"messages": input_messages}, config)
output["messages"][-1].pretty_print() # output contains all messages in state

工作原理

这个机器人会通过MemorySaver不断与您进行互动,并记住您说的每句话。每次新的用户输入都会被添加到记忆中,并且随着每次新的互动,状态也会更新。这个工作流程确保了流畅的对话,AI利用记忆来给出具有上下文意识的回复。

这个指南应该帮助您理解代码的关键部分以及LangChain如何构建一个智能的、具有记忆功能的聊天机器人。

https://santiago-marquez.com/ https://santiago-marquez.com/

2024-10-18 04:15:39 AI中文站翻译自原文