LangChain E-Mails with LLM

题意:通过LangChain使用大型语言模型(LLM)处理电子邮件

问题背景:

I am quite new to LangChain and Python as im mainly doing C# but i am interested in using AI on my own data. So i wrote some python code using langchain that:

我对于LangChain和Python比较新,因为我主要做C#,但我对在自己的数据上使用AI很感兴趣。因此,我使用LangChain编写了一些Python代码,这些代码可以

1. Gets my Emails via IMAP        通过IMAP获取我的电子邮件

2. Creates JSON from my E-Mails (JSONLoader)  

从我的电子邮件中创建JSON(JSONLoader)

3. Creates a Vectordatabase where each mail is a vector (FAISS, OpenAIEmbeddings)

创建一个向量数据库,其中每封邮件都是一个向量(使用FAISS和OpenAI嵌入)

4. Does a similarity search according to the query returning the 3 mails that match the query the most

根据查询进行相似度搜索,返回与查询最匹配的3封邮件

5. feeds the result of the similarity search to the LLM (GPT 3.5 Turbo) using the query AGAIN

再次使用查询将相似度搜索的结果提供给LLM(GPT 3.5 Turbo)

The LLM Prompt then looks something like:        然后LLM的提示(Prompt)看起来像这样:

The question is{query}Here are some information that can help you to answer the question:{similarity_search_result}

Ok so far so good... when my question is:        好的,目前为止还不错……当我的问题是:

When was my last mail sent to xyz@gmail.com?

我最后一次给mailto:xyz@gmail.com发送邮件是什么时候?

i get a correct answer... -> e.g last mail received 10.04.2024 14:11

我得到了一个正确的答案……例如,最后一封邮件的接收时间是2024年10月4日14:11。

But what if i want to have an answer to the following question

但如果我想得到以下问题的答案呢?

How many mails have been sent by xyz@gmail.com?

mailto:xyz@gmail.com发送了多少封邮件?即 xyz@gmail.com 接收了多少邮件?

Because the similarity search only gets the vectors that are most similar, how can i just get an answer about the amount? Even if the similarity search would deliver 150 mails instead of 3 sent by xyz@gmail.com i cant just feed them all into the LLM prompt right?

因为相似度搜索只获取最相似的向量,我如何只得到数量的答案呢?即使相似度搜索返回了由xyz@gmail.com发送的150封邮件而不是3封,我也不能直接将它们全部输入到LLM的提示中,对吧?

So what is my mistake here?        那么我在这里的错误是什么?

问题解决:

It sounds like you need what OpenAI calls "function calling" / tools. RAG is great for grabbing relevant documents to dump into the context window, but as you've seen it's not suitable for everything. Thankfully, we can add arbitrary capabilities without implementing our own hacky solution using function calling. You first implement a function that does what you want in python. When you query OpenAI, you provide a description of these functions (tools). The chat completions API can reason about your request, then respond with JSON containing arguments for you to pass to the function you defined. This allows llms to hypothetically take any actions a human would.

听起来你需要的是OpenAI所说的“函数调用”/工具。RAG(Retrieval Augmented Generation,检索增强生成)在抓取相关文档并放入上下文窗口中非常出色,但正如你所看到的,它并不适合所有情况。幸运的是,我们可以使用函数调用来添加任意功能,而无需实现我们自己的粗暴解决方案。你首先在Python中实现一个你想要的函数。当你向OpenAI发出查询时,你提供这些函数(工具)的描述。聊天补全API可以根据你的请求进行推理,然后返回包含参数的JSON,这些参数需要你传递给你定义的函数。这允许LLMs(大型语言模型)理论上执行人类可以执行的任何操作。

So, for your case of getting the number of emails by email address, you'd want to implement a function in python that perhaps queries for the number of emails for a given user via IMAP. I'll leave that task to you, but once you complete that, the below should serve as a working minimal example to build off of.

因此,对于你想要通过电子邮件地址获取邮件数量的情况,你需要在Python中实现一个函数,该函数可能通过IMAP查询给定用户的邮件数量。我将把这个任务留给你,但一旦你完成了这个功能,下面的内容应该可以作为一个可以构建的最小工作示例。

import json
from openai import OpenAIclient = OpenAI(api_key='YOUR API KEY')tools = [{"type": "function","function": {"name": "total_number_of_emails","description": "Get the number of emails in an email user's inbox","parameters": {"type": "object","properties": {"email_address": {"type": "string","description": "The user's email address",},},"required": ["email_address"],},},},
]def total_number_of_emails(email_address):return 42 # replace with real code to grab # of emailsdef test(query):cpl = client.chat.completions.create(model='gpt-3.5-turbo',messages=[{'role': 'user', 'content': query}],tools=tools,tool_choice='auto' # lets model decide whether to use a tool)for tool_call in cpl.choices[0].message.tool_calls:fn = tool_call.functionif fn.name == 'total_number_of_emails':args = json.loads(fn.arguments)print(total_number_of_emails(args['email_address']))test('How many mails have been sent by xyz@gmail.com?')

If you simply copy and paste the above code unmodified, add your api key, and execute it, it should print "42" every time.

如果你直接复制和粘贴上面的代码而不做任何修改,然后添加你的API密钥并执行它,它应该每次都打印出“42”。

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

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

相关文章

如何安装和卸载软件?

如何安装和卸载软件? 💻 如何安装和卸载软件?——默语的详细教程摘要引言正文内容🖥️ 在Windows上安装和卸载软件安装软件卸载软件 🍏 在Mac上安装和卸载软件安装软件卸载软件 🤔 QA环节📝 表格…

QT QThread 线程类的使用及示例

QThread 是 Qt 框架提供的一个用于处理多线程的类,它允许开发者编写具有并发功能的应用程序,提高程序的响应速度、执行效率和用户体验。 在操作系统中,线程是进程内的执行单元,拥有独立的执行路径。每个线程有自己独立的栈空间&a…

从零开始学Spring Boot系列-集成Spring Security实现用户认证与授权

在Web应用程序中,安全性是一个至关重要的方面。Spring Security是Spring框架的一个子项目,用于提供安全访问控制的功能。通过集成Spring Security,我们可以轻松实现用户认证、授权、加密、会话管理等安全功能。本篇文章将指导大家从零开始&am…

日期类(java)

文章目录 第一代日期类 Date常用构造方法SimpleDateFormat 日期格式化类日期转字符串(String -> Date)字符串转日期 (String->Date) 第二代日期类 Calendar常用字段与如何得到实例对象相关 API 第三代日期类(LocalDate\TIme)日期,时间&…

springboot + Vue前后端项目(第二十一记)

项目实战第二十一记 写在前面1. springboot文件默认传输限制2. 安装视频插件包命令3. 前台Video.vue4. 创建视频播放组件videoDetail.vue5. 路由6. 效果图总结写在最后 写在前面 本篇主要讲解系统集成视频播放插件 1. springboot文件默认传输限制 在application.yml文件中添…

pip安装neuralcoref失败ERROR

最终解决的方法如下: git clone https://github.com/huggingface/neuralcoref.git cd neuralcoref pip install -r requirements.txt python setup.py install 原始步骤: 安装 neuralcoref 的依赖: 安装编译 neuralcoref 所需的依赖项&am…

boost asio异步服务器(4)处理粘包

粘包的产生 当客户端发送多个数据包给服务器时,服务器底层的tcp接收缓冲区收到的数据为粘连在一起的。这种情况的产生通常是服务器端处理数据的速率不如客户端的发送速率的情况。比如:客户端1s内连续发送了两个hello world!,服务器过了2s才接…

MCU解决800V电动汽车牵引逆变器的常见设计挑战的3种方式

电动汽车 (EV) 牵引逆变器是电动汽车的。它将高压电池的直流电转换为多相(通常为三相)交流电以驱动牵引电机,并控制制动产生的能量再生。电动汽车电子产品正在从 400V 转向 800V 架构,这有望实现: 快速充电 – 在相同…

绝了!Stable Diffusion做AI治愈图片视频,用来做副业简直无敌!10分钟做一个爆款视频保姆教程

一 项目分析 这个治愈类视频的玩法是通过AI生成日常生活场景,制作的vlog,有这样的一个号,发布了几条作品,就涨粉了2000多,点赞7000多,非常的受欢迎。 下面给大家看下这种作品是什么样的,如图所…

探索高效开发神器:Blackbox AI(免费编程助手)

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 🤖 想要代码生成?👌 💬 需要和AI聊天解决难题?&#…

Javaweb-初学

1.利用springboot开发一个web应用 简要流程,如下图 2.如何创建一个springboot的项目,下面两张图片是重点关注 第一张图片记得和图片一样改一下路径 第二张就是勾一个选项 3.第一个简单的springboot应用的开发 根据如下步骤进行操作 首先顶部要标识Res…

LinkedIn被封原因和解封方法

对于初识领英和对领英生态规则不熟悉的人来说,很容易造成领英账号被封号(被限制登录)的情况,那么如何才能避免和解决领英帐号被封号(被限制登录)的难题呢? 领英帐号被封号或被限制登录主要会有两类情况。 首先要搞清楚, Linkedi…

IP白名单及其作用解析

在网络安全领域,IP白名单是一项至关重要的策略,它允许特定的IP地址或地址范围访问网络资源,从而确保只有受信任的终端能够连接。下面,我们将深入探讨IP白名单的定义、作用以及实施时的关键考虑因素。 一、IP白名单的定义 IP白名单…

【scau大数据原理】期末复习——堂测题

一、集群安装知识 启动集群的命令start-all.sh位于 Hadoop安装目录的sbin文件夹 目录下。 bin文件夹下包含常见的Hadoop,yarn命令;sbin命令下包含集群的启动、停止命令。 启动集群的命令start-all.sh包含 同时启动start-dfs.sh和start-yarn.sh 功能。…

Python 面试【中级】

欢迎莅临我的博客 💝💝💝,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

已解决javax.xml.bind.MarshalException:在RMI中,参数或返回值无法被编组的正确解决方法,亲测有效!!!

已解决javax.xml.bind.MarshalException:在RMI中,参数或返回值无法被编组的正确解决方法,亲测有效!!! 目录 问题分析 出现问题的场景 服务器端代码 客户端代码 报错原因 解决思路 解决方法 1. 实现…

Vite:打包时去除console

需求描述 在生产环境下,Vite打包项目时,需要去除开发时加入的console、debugger调试信息,但是又不想引入terser。 解决方案 esbuild 参考: esbuild - API 修改配置 修改vite.config.js配置文件,新增配置项如下&…

c++指针和引用之高难度(二)习题讲解

1.【单选题】 int a[4] { 1001,1002,1003,1004 }; int* p{ &a[1] }; p[1] ? A 1001 B 1002 C 1003 解析:这道题考察了指针和数组可以混用。p 指向了 数组 a[0] 的地址,也就是 1002 的地址,此时 *p p[0]…

【多维动态规划】Leetcode 97. 交错字符串【中等】

交错字符串 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串 子字符串 是字符串中连续的 非空 字符序列。 s s1 s2 … snt…

Redis 7.x 系列【11】数据类型之位图(Bitmap)

有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 基本命令2.1 SETBIT2.2 GETBIT2.3 BITCOUNT2.4 BITPOS2.5 BITFIELD2.6 BITF…