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 OpenAI

client = 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 emails

def 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.function
        if 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”。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot系列八: springboot静态资源访问,Rest风格请求处理, 接收参数相关注解

文章目录 WEB开发-静态资源访问官方文档基本介绍快速入门注意事项和细节 Rest风格请求处理基本介绍应用实例注意事项和细节思考题 接收参数相关注解基本介绍应用实例PathVariableRequestHeaderRequestParamCookieValueRequestBodyRequestAttributeSessionAttribute ⬅️ 上一篇…

智慧校园-医务管理系统总体概述

智慧校园医务管理系统,作为校园健康管理体系的智能化升级,深度融合信息技术与医疗服务,为师生构筑起一道全方位的健康守护网。医务管理系统以提升校园医疗服务水平、优化健康管理流程为核心目标,通过一系列创新功能,确…

SerDes介绍以及原语使用介绍(2)OSERDESE2原语仿真

文章目录 前言一、SDR模式1.1、设计代码1.2、testbench代码1.3、仿真分析 二、DDR模式下2.1、设计代码2.2、testbench代码2.3、仿真分析 三、OSERDES2级联3.1、设计代码3.2、testbench代码3.3、代码分析 前言 上文通过xilinx ug471手册对OSERDESE有了简单的了解,接…

Rabbit MQ安装详细记录

RabbitMQ是Erlang语言开发的,因此安装Erlang环境在进行安装RbbitMQ的操作,选择两者版本时一定要参考版本的兼容性。 查看RabbitMQ和Erlang版本对应关系:https://www.rabbitmq.com/which-erlang.html 一、下载地址 下载Erlang地址 : https:…

【RT摩拳擦掌】RT云端测试之百度天工物接入构建(设备型)

【RT摩拳擦掌】RT云端测试之百度天工物接入构建(设备型) 一, 文档介绍二, 物接入IOT Hub物影子构建2.1 创建设备型项目2.2 创建物模型2.3 创建物影子 三, MQTT fx客户端连接云端3.1 MQTT fx配置3.2 MQTT fx订阅3.3 MQT…

SpringBoot学习05-[SpringBoot的嵌入式Servlet容器]

SpringBoot的嵌入式Servlet容器 嵌入式Servlet容器servlet容器-嵌入式servlet容器配置修改通过全局配置文件修改修改添加实现了WebServerFactoryCustomizer接口的bean来进行修改 servlet容器-注册servlet三大组件 嵌入式Servlet容器 SpringBoot包含对嵌入式Tomcat、Jetty、Und…

Nvidia Jetson/RK3588+AI双目立体相机,适合各种割草机器人、扫地机器人、AGV等应用

双目立体视觉是基于视差原理,依据成像设备从不同位置获取的被测物体的图像,匹配对应点的位置偏移,得到视差数据,进而计算物体的空间三维信息。为您带来高图像质量的双目立体相机,具有高分辨率、低功耗、远距离等优点&a…

DIYGW UniApp低代码可视化平台:高效、灵活、安全的应用开发新途径

一、引言 在数字化快速发展的今天,企业对于快速构建多端应用的需求日益增长。然而,传统的应用开发方式往往面临周期长、成本高、技术门槛高等问题。为了解决这些问题,DIYGW UniApp低代码可视化平台应运而生,它以高效率、多端使用…

动态人物抠图换背景 MediaPipe

pip下载 MediaPipe pip install mediapipe -i 手部特征点模型包包含一个手掌检测模型和一个手部特征点检测模型。手掌检测模型在输入图片中定位手部,手部特征点检测模型可识别手掌检测模型定义的被剪裁手掌图片上的特定手部特征点。 由于运行手掌检测模型非常耗时&…

面试突击:HashMap 源码详解

本文已收录于:https://github.com/danmuking/all-in-one(持续更新) 数据结构 JDK1.8 之前 JDK1.8 之前 HashMap 采用 数组和链表 结合的数据结构。如下图: HashMap 将 key 的 hashCode 经过扰动函数处理过后得到 hash 值&#…

用C/C++写一个客户端和服务器之间进行TCP通信的DEMO

目录 一、Visual Sudio 2022 二、配置 三、说明 四、客户端 五、服务端 六、演示 一、Visual Sudio 2022 Visual Studio 2022是微软公司推出的一款集成开发环境(IDE),旨在为开发人员提供全面的工具集,支持从Windows到MacOS…

【算法专题--链表】两数相加 -- 高频面试题(图文详解,小白一看就懂!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐双指针 -- 模拟进位 (使用哨兵位头节点) 🥝 什么是哨兵位头节点? 🍇思路解析 🍍案例图解 四、总结与提炼 五、共勉 一、前言 两数相加 这道题,可以说是--…

Linux Swap

Swap: 页面换出:就是在 Swap 机制下,当内存资源紧张时,内核就会把不经常使用的这些匿名页中的数据写入到 Swap 分区或者 Swap 文件中。从而释放这些数据所占用的内存空间。 页面换入:就是当进程再次访问那些被换出的数据时&…

如何修复Power BI【View usage metrics report】指标报表数据源更新问题?

故事背景 有朋友留言询问:通过我之前写的 想知道Power BI用户访问报告的次数?快来学习! 这篇文章,了解了如何查看Power BI用户访问报告的详情。 但是最近由于创建【View usage metrics report】指标报表的小伙伴离职了&#x…

【数据可视化技术】1、如何使用Matplotlib和Seaborn库在Python中绘制热力图

热力图是一种数据可视化技术,可以显示变量之间的相关性。这个代码段是数据分析和可视化的常用方法,特别适合于展示变量之间的相关性,对于数据科学和机器学习项目非常有帮助。 1、 导入必要的库 首先,确保你已经安装了matplotlib…

苏州网站建设好做吗

苏州网站建设是一个非常热门的行业,由于苏州地理位置优越、经济发达、人口众多,所以网站建设市场也非常火爆。但是在苏州网站建设这个行业中,竞争也是非常激烈的,所以想要在这个市场中脱颖而出并不是件容易的事情。 首先&#xff…

break和continue的标签使用

break标签的使用 break label是退出label对应的循环 //BreakDetail.java //2024.06.29 public class BreakDetail{public static void main(String[] args) {label1:for(int j 0; j < 4; j){label2:for(int i 0; i < 10; i){if(i 2){//break; //情况1//break label2…

信息系统项目管理师(项目整合管理)补充

项目管理信息系统&#xff1a;给项目提供了IT软件工具&#xff0c;例如进度计划软件工具、工作授权系统、配置管理系统、信息收集与发布系统&#xff0c;或其他基于IT技术的工具。以及进入其他在线信息系统&#xff08;如知识库&#xff09;的登录界面&#xff0c;支持自动收集…

应用部署方式演变

应用部署方式演变 1.传统部署2.虚拟化部署3.容器化部署 1.传统部署 传统的应用程序部署是将多个应用程序直接部署在操作系统上&#xff0c;一旦其中的某个应用程序出现内存泄漏&#xff0c;那么该程序就会大量吞噬系统内容空间&#xff0c;导致其他应用程序无法正常运行。 2.虚…

docker 学习之路

文章目录 1、官方文档2、常用命令挂载Docker容器内运行的脚本或命令常用 3、介绍4、Dockerfile5、问题6、链接 ​ 1、官方文档 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux…