用LangChain打造一个可以管理日程的智能助手

2024-05-05 05:52

本文主要是介绍用LangChain打造一个可以管理日程的智能助手,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 存储设计
  • 定义工具
  • 创建llm
  • 提示词模板
  • 创建Agent
  • 执行
  • 总结

  众所周知,GPT可以认为是一个离线的软件的,对于一些实时性有要求的功能是完全不行,比如实时信息检索,再比如我们今天要实现个一个日程管理的功能,这个功能你纯依赖于ChatGPT或者其他大语言模型(后文简称llm),是完全实现不了的,比如你这次让他帮你记录个日程,你要是和他聊的内容过多,历史聊天记录滚动覆盖了就找不回来了。 你要是换个聊天窗口,之前的日程信息你就更找不回来了,其根本原因是目前所有的llm都是无状态的,每轮对话必须携带所有历史聊天记录才能实现多轮对话,而所有的llm都有输入长度限制,比如gpt4目前是128k。

存储设计

  所以,如果要实现日程记录永不丢失我们就需要用第三方存储来记录所有的日程信息,这里为了简单,我直接使用了sqlite3(用mysql或者其他存储都是可以的),我创建了一个非常简单的日程表,只有一个时间和描述,整体代码如下:

# 连接到 SQLite 数据库
# 如果文件不存在,会自动在当前目录创建一个名为 'langchain.db' 的数据库文件
import sqlite3
conn = sqlite3.connect('langchain.db')# 创建一个 Cursor 对象并通过它执行 SQL 语句
c = conn.cursor()
# 创建表
c.execute('''
create table if not exists schedules 
(id          INTEGER    primary key autoincrement,start_time  TEXT default (strftime('%Y-%m-%d %H:%M:%S', 'now', 'localtime')) not null,description text default ''                                                  not null
);
''')conn.commit()
conn.close()
print("数据库和表已成功创建!")

定义工具

  那么接下来的问题就是如何让GPT能够查询和操作这个表了。这里我们直接使用了LangChain的@tool装饰器,讲schedules表的基本操作设置为GPT可以识别的接口,当然使用OpenAI的纯原始接口也是可以实现的(参加我之前的文章OpenAI的多函数调用),就是代码量相对会多很多。具体的代码如下,这里我定义了对schedules表的增、删、查的功能。


def connect_db():""" 连接到数据库 """conn = sqlite3.connect('langchain.db')return conn@tool
def add_schedule(start_time : str, description : str) -> str: """ 新增日程,比如2024-05-03 20:00:00, 周会 """conn = connect_db()cursor = conn.cursor()cursor.execute("""INSERT INTO schedules (start_time, description) VALUES (?, ?);""", (start_time, description,))conn.commit()conn.close()return "true"@tool
def delete_schedule_by_time(start_time : str) -> str:""" 根据时间删除日程 """conn = connect_db()cursor = conn.cursor()cursor.execute("""DELETE FROM schedules WHERE start_time = ?;""", (start_time,))conn.commit()conn.close()return "true"@tool
def get_schedules_by_date(query_date : str) -> str:""" 根据日期查询日程,比如 获取2024-05-03的所有日程 """conn = connect_db()cursor = conn.cursor()cursor.execute("""SELECT start_time, description FROM schedules WHERE start_time LIKE ?;""", (f"{query_date}%",))schedules = cursor.fetchall()conn.close()return str(schedules)

创建llm

  到这里,所以依赖的逻辑就已经完成了,接下来就是创建agent了,首先就是想定义好llm,这里我还是选用了OpenAI的gpt3.5,(个人认为这是目前性价比最高的模型),注意llm必须要调用bind_tools方法绑定好我们上面声明好的工具

## 创建llm
llm = ChatOpenAI(model="gpt-3.5-turbo", max_tokens=4096)
tools = [add_schedule, delete_schedule_by_time, get_schedules_by_date]
llm_with_tools = llm.bind_tools(tools)

提示词模板

  然后就是创建提示词模板,这里额外提一下,因为目前所有的llm都不具备对时间的感知能力,所以这里必须在模板里将当前时间传给llm,方便llm去做时间的计算

## 创建提示词模板  
prompt = ChatPromptTemplate.from_messages([("system","你是一个日程管理助手",),("placeholder", "{chat_history}"),("user", "{input} \n\n 当前时间为:{current_time}"),("placeholder", "{agent_scratchpad}"),]
)

创建Agent

  之后就是创建agent和执行器了,这里自己创建一个一遍,又直接使用了LangChain封装好的方法创建了一遍,二者功能上没有区别,区别就是直接用别人的方法,自己可以少写两行代码。


## agent创建方式1 
from langchain.agents.format_scratchpad.openai_tools import (format_to_openai_tool_messages,
)
agent = ({"current_time": lambda x: x["current_time"],"input": lambda x: x["input"],"agent_scratchpad": lambda x: format_to_openai_tool_messages(x["intermediate_steps"]),}| prompt| llm_with_tools| OpenAIToolsAgentOutputParser()
)## agent创建方式2
agent = create_tool_calling_agent(llm_with_tools, tools, prompt)  
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=False)

执行

  用如下的方式就可以执行agent验证功能是否可以正常了。

invoke({"input": "查询下我明天有啥安排?","current_time": datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')  # 当前时间必须传})

  这里我简单实现了一个多轮对话用来验证各功能是否正常。


def ask(question):res = agent_executor.invoke({"input": question,"current_time": datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')})return res["output"]while True:question = input(">")if question.lower() == '退出':breakprint(ask(question))
> 删除今天所有的日程
已成功删除今天所有的日程。
> 创建一套明天晚上6点的日程,开周会
日程已成功创建,明天晚上6点有周会安排。
> 我明天第一条日程是啥?
您明天的第一条日程是沟通会,时间为2024-05-05 09:00:00。祝您顺利!
> 看下我明天早上10点有没有安排?
明天早上10点没有安排,您的日程是:
- 09:00:00 沟通会
- 18:00:00 周会
> 把我明天早上9点的会议改到10点
已成功将您明天早上9点的会议改到10点。

总结

  日程管理的能力本质上还是建立在llm的函数调用能力,说白了其实你告诉llm有什么样的函数可以调用,然后让llm自行决策是否需要调用,这也是当下llm智能的体现。使用LangChain其实也只是将函数的定义、调用以及结果返回的流程简化而已。这里额外说下,上面代码中,我并未给llm提供修改日程的方法,但后续测试工程中我让它修改某个日程,它居然修改成功了,你猜它是怎么实现的?

备注:本文完整示例代码已放在Github https://github.com/xindoo/langchain-examples/blob/main/schedules.ipynb。

在这里插入图片描述

这篇关于用LangChain打造一个可以管理日程的智能助手的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/960926

相关文章

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

智能交通(二)——Spinger特刊推荐

特刊征稿 01  期刊名称: Autonomous Intelligent Systems  特刊名称: Understanding the Policy Shift  with the Digital Twins in Smart  Transportation and Mobility 截止时间: 开放提交:2024年1月20日 提交截止日

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动