圣诞老人遇见 GenAI:利用大语言模型、LangChain 和 Elasticsearch 破译手写的圣诞信件

在北极的中心地带,圣诞老人的精灵团队面临着巨大的后勤挑战:如何处理来自世界各地儿童的数百万封信件。 圣诞老人表情坚定,他决定是时候将人工智能纳入圣诞节行动了。

圣诞老人坐在配备了最新人工智能技术的电脑前,开始在 Jupyter Notebook 中编写 Python 脚本。 我们的目标既简单又雄心勃勃:利用生成式人工智能和 LLM 的力量来解释手写字母并提取必要的数据,并将其组织在 Elasticsearch 中。

安装

安装 Elasticsearch 及 Kibana

如果你还没有安装好自己的 Elasticsearch 及 Kibana,那么请参考一下的文章来进行安装:

在安装的时候,请选择 Elastic Stack 8.x 进行安装。在安装的时候,我们可以看到如下的安装信息:

在下面的展示中,我将使用 Elastic Stack 8.11 来进行展示。

Python

你可以安装自己喜欢的 Python 版本。版本在 3.8 及以上。我们还需要安装如下的 Python 包:

pip3 install python-dotenv elasticsearch langchain openai

数据

为了展示方便,我们需要在当前的目录下创建如下的 .env 文件:

.env

$ pwd
/Users/liuxg/python/elser
$ cat .env
ES_USER="elastic"
ES_PASSWORD="yarOjyX5CLqTsKVE3v*d"
ES_ENDPOINT="localhost"
OPENAI_API_KEY="YourOwnOpenAiKey"

你可以根据自己的 Elasticsearch 配置进行修改上面的值。你需要申请一个 OpenAI 的 key 来进行使用。

为了能够访问 Elasticsearch,我们还需要把 Elasticsearch 的证书拷贝到当前的工作目录中:

$ pwd
/Users/liuxg/python/elser
$ cp ~/elastic/elasticsearch-8.11.0/config/certs/http_ca.crt .
$ ls http_ca.crt 
http_ca.crt

我们想要解密的手写信件可以在地址进行下载: 

应用设计

我们在项目当前的目录下运行:

$ pwd
/Users/liuxg/python/elser
$ jupyter notebook

这样我们就开创建我们的 notebook。第一步是设置环境变量,该变量将用作访问 OpenAI 和 Elasticsearch API 的凭据。

import os

from dotenv import load_dotenv

load_dotenv()

# OpenAI API Key
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
OPENAI_API_URL = "https://api.openai.com/v1/chat/completions"

elastic_user=os.getenv('ES_USER')
elastic_password=os.getenv('ES_PASSWORD')
elastic_endpoint=os.getenv("ES_ENDPOINT")
openai_api_key=os.getenv('OPENAI_API_KEY')

接下来,圣诞老人使用圣诞信件的数字化图像编写了一个脚本,使用 “gpt-4-vision-preview” 提取文本。 这一关键步骤将手写文字转变为数字文本。 “GPT-4-vision-preview” 是 OpenAI 的 GPT-4 语言模型的实验版本,扩展后包含图像处理和分析功能。

from PIL import Image
import requests
import numpy as np

from langchain.chat_models import ChatOpenAI
from langchain.schema.messages import HumanMessage,SystemMessage

image_path = 'https://i.imgur.com/IxC9lgd.png'

chat = ChatOpenAI(model="gpt-4-vision-preview",max_tokens=512,openai_api_key=openai_api_key)
result = chat.invoke(
    [
        HumanMessage(
            content=[
                {"type": "text","text": "What is in the picture? Please provide a detailed introduction."},{
                    "type": "image_url","image_url": {
                        "url": image_path,"detail": "auto",},]
        )
    ]
)


print(result.content)

然后,LangChain 开始行动,分析文本并识别关键元素,例如孩子的名字和愿望清单。

from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.schema import StrOutputParser

chain = ChatOpenAI(model="gpt-3.5-turbo",max_tokens=1024)

prompt = PromptTemplate.from_template(
"""
Extract the list and child's name from the text below and return the data in JSON format using the following name:
- "child_name","wishlist".

{santalist}

"""
)

runnable = prompt | chain | StrOutputParser()

letter = result.content
wishlist = runnable.invoke({"santalist": letter})
print(wishlist)

圣诞老人决定丰富一下数据库,并要求人工智能估算这些礼物的重量。 这样,他就可以在 Kibana 中生成一份清单,将孩子们的礼物分为每个袋子并放入雪橇的空间中 - 什么组织!

chain = ChatOpenAI(model="gpt-3.5-turbo",max_tokens=1024)

prompt = PromptTemplate.from_template(
"""

{santalist_json}

From the JSON above,include a new attribute in the JSON called 'weight',which will calculate the total estimated weight of each item in the list in kilograms.

You will first need to estimate the weight of each item individually.
After that,sum these values to obtain the total weight.
Extract only the numerical value.

"""
)

runnable = prompt | chain | StrOutputParser()

new_wishlist = runnable.invoke({"santalist_json": wishlist})
print(new_wishlist)

现在,数据已结构化,是时候将它们写入到 Elasticsearch 了。

from elasticsearch import Elasticsearch
import json

url = f"https://{elastic_user}:{elastic_password}@{elastic_endpoint}:9200"
es = Elasticsearch(url,ca_certs = "./http_ca.crt",verify_certs = True)

es.info() # should return cluster info

# Parse the JSON string
json_string = new_wishlist
data = json.loads(json_string)

# Index name
index_name = "santa_claus_list"

# Index the document
response = es.index(index=index_name,document=data)

# Print the response from Elasticsearch
print(response)

使用 Dev Tools(集成到 Kibana 中的工具),圣诞老人和精灵可以轻松搜索和分析数据。 这样可以清楚地了解今年的礼物趋势、信件最常出现的位置,甚至可以识别那些表达特殊或紧急愿望的信件,当然还有礼物的重量。 正如使用 ES|QL 的查询一样 (你需要安装 Elastic Stack 8.11 及以上版本才可以使用 ES|QL)。

POST /_query?format=txt
{
  "query": """
  FROM santa_claus_list
  | STATS  sum_toy = SUM(weight) BY child_name
  | LIMIT 100
  """
}

到目前为止,我们只处理了一封信。我们可以按照同样的套路对多封信进行处理。最终我们可以得到像如下的数据统计:

# result
    sum_toy    |  child_name   
---------------+---------------
30.5           |Maria
1.5            |Mike
3.0            |Theo
2.5            |Isabella
40.0           |William
30.0           |Olivia     

借助这一创新解决方案,圣诞老人不仅能够更高效地满足请求,而且还获得了对世界各地儿童的欢乐和希望的宝贵洞察,这一切都得益于人工智能、LangChain和 Elasticsearch 的力量。 今年的圣诞节注定会是最神奇、最井然有序的一个!

上面的代码可以在地址下载:https://github.com/liu-xiao-guo/semantic_search_es/blob/main/Deciphering%20Handwritten%20Christmas%20Letters%20with%20LLM%2C%20LangChain%20and%20Elasticsearch.ipynb

原文地址:https://blog.csdn.net/UbuntuTouch/article/details/135501664

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读774次,点赞24次,收藏16次。typescript项目中我们使用typings-for-css-modules-loader来替代css-loader实现css modules。1、typings-for-css-modules-loader加载器介绍 Webpack加载器,用作css-loader的替代产品,可动态生成CSS模块的TypeScript类型这句话是什么意思呢?就是编译时处理css文件...
文章浏览阅读784次。react router redux antd eslint prettier less axios_react+antd+redux+less
文章浏览阅读3.9k次,点赞5次,收藏11次。需要删除.security-7索引文件。把在第1步中的被注释的配置打开。之后就是按照提示输入密码。执行bin目录下的文件。_failed to authenticate user 'elastic' against
文章浏览阅读1.2k次,点赞23次,收藏24次。Centos 8 安装es_centos8 yum elasticsearch
文章浏览阅读3.2k次。设置完之后,数据会⾃动同步到其他节点。修改密码时,将第⼀步配置删除,然后重启。单独使⽤⼀个节点⽣成证书;执⾏设置⽤户名和密码的命令。执⾏完上⾯命令以后就可以在。⽂件,在⾥⾯添加如下内容。这个⽂件复制到其他节点下。其中⼀个节点设置密码即可。依次对每个账户设置密码。全部节点都要重启⼀遍。需要在配置⽂件中开启。个⽤户分别设置密码,⽬录下,证书⽂件名为。功能,并指定证书位置。_es设置账号和密码
文章浏览阅读1.9k次,点赞2次,收藏7次。针对多数据源写入的场景,可以借助MQ实现异步的多源写入,这种情况下各个源的写入逻辑互不干扰,不会由于单个数据源写入异常或缓慢影响其他数据源的写入,虽然整体写入的吞吐量增大了,但是由于MQ消费是异步消费,所以不适合实时业务场景。不易出现数据丢失问题,主要基于MQ消息的消费保障机制,比如ES宕机或者写入失败,还能重新消费MQ消息。针对这种情况,有数据强一致性要求的,就必须双写放到事务中来处理,而一旦用上事物,则性能下降更加明显。可能出现延时问题:MQ是异步消费模型,用户写入的数据不一定可以马上看到,造成延时。_mysql同步es
文章浏览阅读3.6w次,点赞48次,收藏44次。【程序员洲洲送书福利-第十九期】《C++ Core Guidelines解析》
文章浏览阅读1.3k次。当我们在开发Vue应用时,经常需要对表单进行校验,以确保用户输入的数据符合预期。Vue提供了一个强大的校验规则机制,通过定义rules规则,可以方便地对表单进行验证,并给出相应的错误提示。_vue ruler校验
文章浏览阅读2k次,点赞16次,收藏12次。Linux内核源码下载地址及方式_linux源码下载
文章浏览阅读1k次。这样在每天自动生成的索引skywalking_log_xxx就会使用上述模版来生成,timestamp会被设置成date类型。然后此时在–>索引管理–>kibana–>索引模式添加skywalking_log*索引时就会有时间字段了。在通过skywalking将日志收集到es后,由于skywalking收集的日志(skywalking_log索引)没有date类型的字段导致在es上再索引模式中没有时间范围的查询。skywalking收集的日志有时间戳字段timestamp,只是默认为long类型。_skywalking timestamp
文章浏览阅读937次,点赞18次,收藏21次。1.初始化git仓库,使用git int命令。2.添加文件到git仓库,两步走:2.1 使用命令,注意,可反复多次使用,添加多个文件;2.2 使用命令,完成。此笔记是我个人学习记录笔记,通过廖雪峰的笔记进行学习,用自己能理解的笔记记录下来,如果侵权,联系删。不存在任何盈利性质,单纯发布后,用于自己学习回顾。
文章浏览阅读786次,点赞8次,收藏7次。上述示例中的 origin 是远程仓库的名称,https://github.com/example/repository.git 是远程仓库的 URL,(fetch) 表示该远程仓库用于获取更新,(push) 表示该远程仓库用于推送更新。你可以选择在本地仓库创建与远程仓库分支对应的本地分支,也可以直接将本地仓库的分支推送到远程仓库的对应分支。将 替换为远程仓库的名称(例如 origin), 替换为要推送的本地分支的名称, 替换为要推送到的远程分支的名称。_git remote 智能切换仓库
文章浏览阅读1.5k次。配置eslint校验代码工具_eslint 实时校验
文章浏览阅读1.2k次,点赞28次,收藏26次。Git入门基础介绍,什么是Git,如何使用Git,以及Git的工作的基本原理
文章浏览阅读2.7k次。基于官方给出的几种不同环境不同的安装方式,本文将会选择在使用.zip文件在Windows上安装Elasticsearch在Linux或macOS上从存档文件安装ElasticsearchInstall Elasticsearch with Docker (此种方式待定)使用Docker安装Elasticsearch。_elasticsearch安装部署windows
文章浏览阅读3.3k次,点赞5次,收藏11次。【Linux驱动】内核模块编译 —— make modules 的使用(单模块编译、多模块编译)_make modules
文章浏览阅读1k次。docker启动es报错_max virtual memory areas vm.max_map_count [65530] is too low, increase to at
文章浏览阅读4.2k次,点赞2次,收藏6次。使用docker单机安装elasticsearch后再安装kibana时找不到es。_unable to retrieve version information from elasticsearch nodes. security_ex
文章浏览阅读1.1k次。日志处理对于任何现代IT系统都是关键部分,本教程专为新手设计,通过详细解释Logstash的三大核心组件,为您展示如何从零开始搭建强大的日志处理系统。您还将学习如何同步MySQL数据到Elasticsearch,并通过一个"Hello World"示例快速入门。无论您是完全的新手还是有一些基础,本教程都将引导您顺利掌握Logstash的基本操作和高级应用。_logstash mysql
文章浏览阅读1.1w次,点赞5次,收藏25次。执行这条指令之后,你的本地项目就与远程Git仓库建立了连接,你就可以开始对你的代码进行版本追踪和协作开发了。使用“git remote add origin”指令,可以轻松地将本地项目连接到远程Git仓库。git remote set-url origin 执行这条指令之后,Git就会将已经添加的名为“origin”的仓库删除。git remote add origin 其中,是你的远程Git仓库的网址。_git remote add origin