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

news2024/9/28 1:19:05

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

存储设计

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

py
复制代码
# 连接到 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表的增、删、查的功能。

py
复制代码

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方法绑定好我们上面声明好的工具

py
复制代码
## 创建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去做时间的计算

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

创建Agent

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

py
复制代码

## 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验证功能是否可以正常了。

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

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

py
复制代码

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() == '退出':
        break
    print(ask(question))
bash
复制代码
> 删除今天所有的日程
已成功删除今天所有的日程。
> 创建一套明天晚上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 github.com/xindoo/lang…。

在这里插入图片描述

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

在这里插入图片描述

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取==🆓

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1644006.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ | Leetcode C++题解之第61题旋转链表

题目: 题解: class Solution { public:ListNode* rotateRight(ListNode* head, int k) {if (k 0 || head nullptr || head->next nullptr) {return head;}int n 1;ListNode* iter head;while (iter->next ! nullptr) {iter iter->next;n…

【备战软考(嵌入式系统设计师)】07 - 计算机网络模型

七层模型 计算机网络中比较常见的有OSI七层模型和TCP/IP四层模型。 软考中主要考七层模型,但是实际中使用的还是四层模型比较多,我们主要是为了考试,那就主要讲讲七层模型。不过实际上四层模型就是将七层模型压缩了三层,本质上是…

JVM笔记4-虚拟机类加载机制

1、概述 Java虚拟机把描述类的数据从Class文件加载到内存中,并对数据进行检验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。这个过程称为虚拟机的类加载机制。 2、类加载的时机 一个类型从被加载到内存中开始,到卸载出内存…

3. 深度学习笔记--优化函数

深度学习——优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、Adagrad、Adadelta、RMSprop、Adam、Nadam、AdaMax、AdamW ) 0. GD (梯度下降) Gradient Descent(梯度下降)是一种迭代优化算法&#xf…

你必须要知道的P沟道MOSFET场效应管AO3401电流-4A电压-30V

概述 多年前,P沟道MOSFET是很少的,国内新兴的半导体厂家还都没开起来,这个时候出了一款SOT23封装的P沟道MOSFET,这就是AO3401,对于小电流输出的电源控制,就变的简单起来。目前国内已有多家厂商可以生产各种…

【字符串】Leetcode 最长回文子串

题目讲解 5. 最长回文子串 算法讲解 dp[i][j]表示i~j这一段区间的子串是否是回文 当s[i] s[j]的时候&#xff0c;此时是有三种情况的&#xff1a; ij说明一个字符肯定是回文 i1 j也说明一个字符是回文 i1 < j说明需要判断[i1, j-1]这一段区间是否是回文 此时我们就可以…

【每日刷题】Day32

【每日刷题】Day32 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 1652. 拆炸弹 - 力扣&#xff08;LeetCode&#xff09; 2. 2058. 找出临界点之间的最小和最大距离 …

深圳网站推广怎么做

深圳是中国最具活力和创新精神的城市之一&#xff0c;拥有众多的互联网企业和创新型公司。如果你是一家深圳企业&#xff0c;想要在市场上获得成功&#xff0c;互联网是不可或缺的一部分。网站推广是你在线上推销你的企业或产品的一种方式&#xff0c;让更多的人知道你&#xf…

Linux: Netfilter 简介

文章目录 1. 前言2. Netfilter 简介2.1 Netfilter 的功能2.2 Netfilter 示例2.3 Netfilter 实现概览2.3.1 Netfilter hook 的 注册 和 注销2.3.2 Netfilter hook 的触发2.3.2.1 NF_INET_PRE_ROUTING2.3.2.2 NF_INET_LOCAL_IN2.3.2.3 NF_INET_FORWARD2.3.2.4 NF_INET_LOCAL_OUT2…

八、Linux进程检测与控制

章节目标 了解进程和程序的关系了解进程的特点能够使用top动态查看进程信息能够使用ps静态查看进程信息能够使用kill命令给进程发送信号能够调整进程的优先级&#xff08;扩展&#xff09; 引言 在运维的日常工作中&#xff0c;监视系统的运行状况是每天例行的工作&#xff…

python数据分析——业务数据描述

业务数据描述 前言一、数据收集数据信息来源 二、公司内部数据&#xff08;1&#xff09;客户资料数据&#xff08;2&#xff09;销售明细数据&#xff08;3&#xff09;营销活动数据 三、市场调查数据1 观察法2 提问法3 实验法 四、公共数据五、第三方数据六、数据预处理七、数…

Vue工程化开发和脚手架Vue CLI

目录 一、介绍 二、使用步骤 1. 全局安装&#xff08;一次&#xff09; 2.查看Vue版本 3.创建项目架子&#xff08;项目名不能使用中文&#xff09; 4.启动项目 一、介绍 Vue CLI是Vue官方提供的一个全局命令工具。可以帮助我们快速创建一个开发的Vue项目的标准化基础架子…

【HCIP】OSPF综合实验报告

一、分析要求 R4为ISP&#xff0c;直连设备间使用公网网段R3、R5、R6、R7为MGRE环境&#xff0c;R3为NHS合理划分172.16.0.0/16网段做NAT配置使私网能够访问R4环回ospf优化&#xff08;汇总和特殊区域&#xff09;&#xff0c;减少计时器时间加快收敛&#xff0c;设备之间做认…

解决:mybatisplus分页查询失效,总是查询到所有数据

目录 问题描述&#xff1a;解决方案&#xff1a;1.配置mybatisplus拦截器PaginationInterceptor2.自行编写SQL语句查询 问题描述&#xff1a; 在前端使用Map<String, Object> params&#xff0c;把page&#xff0c;limit参数作为请求体传送到后端&#xff0c;但是分页查…

WWW‘24 | 课程学习CL+模仿学习IL用于ETF及商品期货交易

WWW24 | 课程学习CL模仿学习IL用于ETF及商品期货交易 原创 QuantML QuantML 2024-05-04 13:47 论文地址&#xff1a;[2311.13326] Curriculum Learning and Imitation Learning for Model-free Control on Financial Time-series (arxiv.org) 本文探讨了在金融时间序列数据上…

vulnhub靶场之FunBox-3

一.环境搭建 1.靶场描述 Boot2Root ! Easy going, but with this Funbox you have to spend a bit more time. Much more, if you stuck in good traps. But most of the traps have hints, that they are traps. If you need hints, call me on twitter: 0815R2d2 Have fun.…

C++实验五 : 类的继承 -----CUST

【题目】 1.定义person类&#xff0c;包括数据私有成员&#xff1a;姓名&#xff0c;性别&#xff1b;共用成员函数&#xff1a;带参数构造函数&#xff0c;display函数输出本类对象的所有数据成员值。 2.定义student类&#xff0c;保护继承person类&#xff1b;增加保护数据成…

从零开始:Django项目的创建与配置指南

title: 从零开始&#xff1a;Django项目的创建与配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 后端开发 tags: DjangoWebDevPythonORMSecurityDeploymentOptimization Django简介&#xff1a; Django是一个开源的高级Python Web框架&#xff…

【Python项目】基于时间序列的【大气污染预测系统】

技术简介&#xff1a;使用Python技术、B/S架构、MYSQL数据库等实现。 系统简介&#xff1a;本系统的主要使用角色为普通用户和管理员用户&#xff0c;两者的功能几乎是一致的&#xff0c;但管理员用户比普通用户多了用户管理的功能&#xff0c;可以对系统内的用户进行管理。普通…

Vue的项目启动指令分析

通过Vue CLI脚手架创建的项目&#xff0c;默认的启动项目方式是 npm run serve 这里的serve是可以修改的。 在创建的项目目录中&#xff0c;找到package.json 双击打开&#xff0c;找到scripts部分 在scripts部分&#xff0c;有一个"serve"键值对&#xff0c;这里的…