用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

相关文章

nvm如何切换与管理node版本

《nvm如何切换与管理node版本》:本文主要介绍nvm如何切换与管理node版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录nvm切换与管理node版本nvm安装nvm常用命令总结nvm切换与管理node版本nvm适用于多项目同时开发,然后项目适配no

Redis实现RBAC权限管理

《Redis实现RBAC权限管理》本文主要介绍了Redis实现RBAC权限管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1. 什么是 RBAC?2. 为什么使用 Redis 实现 RBAC?3. 设计 RBAC 数据结构

使用Python实现表格字段智能去重

《使用Python实现表格字段智能去重》在数据分析和处理过程中,数据清洗是一个至关重要的步骤,其中字段去重是一个常见且关键的任务,下面我们看看如何使用Python进行表格字段智能去重吧... 目录一、引言二、数据重复问题的常见场景与影响三、python在数据清洗中的优势四、基于Python的表格字段智能去重

Spring AI集成DeepSeek三步搞定Java智能应用的详细过程

《SpringAI集成DeepSeek三步搞定Java智能应用的详细过程》本文介绍了如何使用SpringAI集成DeepSeek,一个国内顶尖的多模态大模型,SpringAI提供了一套统一的接口,简... 目录DeepSeek 介绍Spring AI 是什么?Spring AI 的主要功能包括1、环境准备2

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

Python3脚本实现Excel与TXT的智能转换

《Python3脚本实现Excel与TXT的智能转换》在数据处理的日常工作中,我们经常需要将Excel中的结构化数据转换为其他格式,本文将使用Python3实现Excel与TXT的智能转换,需要的可以... 目录场景应用:为什么需要这种转换技术解析:代码实现详解核心代码展示改进点说明实战演练:从Excel到

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用