Langchain2 - Build a Chatbot 官方文档
概述
介绍一个如何设计和实现基于llm的聊天机器人的示例。这个聊天机器人将能够进行对话,并记住以前与聊天模型的交互。
请注意,我们构建的这个聊天机器人将只使用语言模型进行对话。还有其他几个相关的概念,你可能会寻找:
会话RAG:在外部数据源上启用聊天机器人体验
代理:建立一个可以采取行动的聊天机器人
import os
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv())
快速入门
首先,让我们学习如何单独使用语言模型。LangChain支持许多不同的语言模型,您可以互换使用-选择您想要使用的下面的一个!
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4o-mini")
from langchain_core.messages import HumanMessage
model.invoke([HumanMessage(content="Hi! I'm Bob")])
AIMessage(content='Hi Bob! How can I assist you today?', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 10, 'prompt_tokens': 11, 'total_tokens': 21, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'gpt-4o-mini-2024-07-18', 'system_fingerprint': 'fp_5154047bf2', 'finish_reason': 'stop', 'logprobs': None}, id='run-1b12bdd2-e2d4-4d83-96d6-6438199ade45-0', usage_metadata={'input_tokens': 11, 'output_tokens': 10, 'total_tokens': 21, 'input_token_details': {}, 'output_token_details': {}})
model.invoke([HumanMessage(content="What's my name?")])
AIMessage(content="I'm sorry, but I don't have access to personal information about you. I can only provide information based on the context of our conversation. How can I assist you today?", additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 34, 'prompt_tokens': 11, 'total_tokens': 45, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'gpt-4o-mini-2024-07-18', 'system_fingerprint': 'fp_5154047bf2', 'finish_reason': 'stop', 'logprobs': None}, id='run-c31102a8-dedb-4b1b-941f-1d199600c63b-0', usage_metadata={'input_tokens': 11, 'output_tokens': 34, 'total_tokens': 45, 'input_token_details': {}, 'output_token_details': {}})
from langchain_core.messages import AIMessage
model.invoke(
[
HumanMessage(content="Hi! I'm Bob"),
AIMessage(content="Hello Bob! How can I assist you today?"),
HumanMessage(content="What's my name?"),
]
)
AIMessage(content='Your name is Bob! How can I help you today?', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 12, 'prompt_tokens': 33, 'total_tokens': 45, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'gpt-4o-mini-2024-07-18', 'system_fingerprint': 'fp_5154047bf2', 'finish_reason': 'stop', 'logprobs': None}, id='run-0e83d1f9-c38e-48f3-a6d9-c9cb033f5517-0', usage_metadata={'input_tokens': 33, 'output_tokens': 12, 'total_tokens': 45, 'input_token_details': {}, 'output_token_details': {}})
消息持久性
LangGraph实现了一个内置的持久化层,使其成为支持多个会话回合的聊天应用程序的理想选择。
将聊天模型封装在最小的LangGraph应用程序中允许我们自动保存消息历史记录,从而简化了多回合应用程序的开发。
LangGraph附带了一个简单的内存检查指针,我们将在下面使用它。请参阅其文档了解更多细节,包括如何使用不同的持久性后端(例如,SQLite或Postgres)。
from langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import START, MessagesState, StateGraph
# Define a new graph
workflow = StateGraph(state_schema=MessagesState)
# Define the function that calls the model
def call_model(state: MessagesState):
response = model.invoke(state["messages"])
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)
对于异步支持,将call_model节点更新为async函数,并在调用应用程序时使用.ainvoke:
Async function for node:
async def call_model(state: MessagesState):
response = await model.ainvoke(state[“messages”])
return {“messages”: response}
Define graph as before:
workflow = StateGraph(state_schema=MessagesState)
workflow.add_edge(START, “model”)
workflow.add_node(“model”, call_model)
app = workflow.compile(checkpointer=MemorySaver())
Async invocation:
output = await app.ainvoke({“messages”: input_messages}, config)
output[“messages”][-1].pretty_print()
现在,我们需要创建一个配置,每次都将其传递给可运行对象。该配置包含的信息不是直接输入的一部分,但仍然很有用。在本例中,我们希望包含一个thread_id。这应该看起来像:
config

最低0.47元/天 解锁文章
1131

被折叠的 条评论
为什么被折叠?



