AI大模型的使用-深入使用LLMChain,给AI连上Google和计算器

news2025/1/2 0:16:53

今天涉及的内容如下,下面都会使用例子一一讲解使用,

1.1 utilities:langchain的python解析器

1.2 LLMMathChain:可以处理计算的链,内部用python解释器处理

1.3 LLMRequestsChain:通过一个 HTTP 请求来得到问题的答案

1.4 TransformChain:可以定义代码用来统一数据格式转换

1.5 VectorDBQA:qa方式向量数据库问答

我们用OpenAI来实现简单数字计算,然后对比python的数字计算

#! pip install openai
#! pip install langchain
import openai, os
os.environ["OPENAI_API_KEY"] = ""
openai.api_key = os.environ.get("OPENAI_API_KEY")
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
from langchain.chains import LLMChain

llm=OpenAI(model_name="text-davinci-003", max_tokens=2048, temperature=0.5)
multiply_prompt=PromptTemplate(template="请计算一下{question}是多少?", input_variables=["question"])
math_chain=LLMChain(llm=llm,prompt=multiply_prompt,output_key="answer")
answer=math_chain.run({"question":"352乘以493"})
print("OpenAI API 说答案是:", answer)

python_answer = 352 * 493
print("Python 说答案是:", python_answer)

结果:很明显,AI给了个错误答案,

OpenAI API 说答案是: 

352 x 493 = 174096
Python 说答案是: 173536

不过,有人很聪明,说虽然 ChatGPT 直接算这些数学题不行,但是它不是会写代码吗?我们直接让它帮我们写一段利用 Python 计算这个数学式子的代码不就好了吗?的确,如果你让它写一段 Python 代码,给出的代码是没有问题的。

multiply_prompt=PromptTemplate(template="请你写一段python代码,计算{question}", input_variables=["question"])
math_chain=LLMChain(llm=llm,prompt=multiply_prompt,output_key="answer")
answer=math_chain.run({"question":"352乘以493"})
print("OpenAI API 说答案是:", answer)

结果:

answer = 352 * 493
print(answer)

1.utilities

这样还需要将代码复制到可以执行python脚本的地方,我们可以再调用下python解释器,让整个过程自动完成。使用langchain的utilities就可以做到将代码进行处理执行操作,如下代码所示:

# 可以实现对 Python 解释器的调用。
from langchain.utilities import PythonREPL
python_repl =PythonREPL()
result=python_repl.run(answer)
print("结果:",result)

需要有上下文的哦,结果是:

结果: 173536

2.LLMMathChain

你会发现上面先调用openai得到代码,再调用解析器执行代码其实也是一种链式调用,而LangChain 就把这样的过程封装成了一个叫做 LLMMathChain 的 LLMChain。不需要自己去生成代码,再调用 PythonREPL,只要直接调用 LLMMathChain,它就会在背后把这一切都给做好,代码如下:

# 使用LLMMathChain
from langchain import LLMMathChain

llm_math=LLMMathChain(llm=llm,verbose=True)
result=llm_math.run("请计算一下352乘以493是多少?")
print(result)

结果如下:

> Entering new LLMMathChain chain...
请计算一下352乘以493是多少?```text
352 * 493
```
...numexpr.evaluate("352 * 493")...

Answer: 173536
> Finished chain.
Answer: 173536

LangChain 也把前面讲过的 utilities 包里面的很多功能,都封装成了 Utility Chains。比如,SQLDatabaseChain 可以直接根据你的数据库生成 SQL,然后获取数据,LLMRequestsChain 可以通过 API 调用外部系统,获得想要的答案。

3.通过 RequestsChain 获取实时外部信息

之前通过文本数据进行索引和向量,这些都是因为内容固定不需要时效性,如果需要时效性,则这类问题就不好这样处理因为我们可能没有必要不停地更新索引。

我们可以使用 LLMRequestsChain,通过一个 HTTP 请求来得到问题的答案。可以得到有时效性的问题。

下面的代码,prompt中则表示将请求url的谷歌天气数据的html动态加载到{requests_result},再根据{query}内容,从数据里搜索出来相关内容,

然后将prompt模版传入LLMRequestsChain里,最后把要查询的问题以及url传入LLMRequestsChain对象并调用(运行下)LLMRequestsChain对象即可。

from aiohttp.client import request
from tempfile import template
from langchain.chains import LLMRequestsChain

#定义从谷歌网页中搜索出想要信息的模版
template="""在 >>> 和 <<< 直接是来自Google的原始搜索结果.
请把对于问题 '{query}' 的答案从里面提取出来,如果里面没有相关信息的话就说 "找不到"
请使用如下格式:
Extracted:<answer or "找不到">
>>> {requests_result} <<<
Extracted:
"""
PROMPT=PromptTemplate(
    input_variables=["query","requests_result"],
    template=template,
)
# 将把PROMPT传给LLMRequestsChain
request_chain=LLMRequestsChain(llm_chain=LLMChain(llm=OpenAI(temperature=0),prompt=PROMPT))
# 对应的搜索词语,通过query参数传入,对应的原始搜索结果默认放入requests_result,有对应的占位符替换
question="今天北京天气怎么样?"
inputs={
    "query":question,
    "url":"https://www.google.com/search?q="+ question.replace(" ", "+")
}
# 运行一下就会通过OpeenAI提取搜索结果
result=request_chain(inputs)
print(result)
# print(result['output'])

结果:

{'query': '今天北京天气怎么样?', 'url': 'https://www.google.com/search?q=今天北京天气怎么样?', 'output': '今天白天最高气温30℃,阴有阵雨或雷阵雨,上午东部局在中到大雨2、3级,北转南风;今天夜间最低气温22℃,阴。'}

每个人的结果都不一样,我这个结果不太好解析,咱们按作者的结果进行解析处理下,其实这个也可以解析,就是会费劲些,或者说没有规律些,作者使用的是chatGPT4,可能会比我们好,接下来我们按原作者的output处理。

{'query': '今天北京天气怎么样?', 'url': 'https://www.google.com/search?q=今天北京天气怎么样?', 'output': '小雨; 10℃~15℃;东北风 风力4-5级'}

我们先解析output内容,并形成规范,按照字典key,value形式展示出来,好方便统一封装。

用代码解析下返回天气的数据,很简单的代码,就是根据字符串内容拆出数据,并封装到字典里,

import re

# 定义一个接收weather_info字符串参数,返回字典类型结果
def parse_weather_info(weather_info: str) -> dict:
  # 将天气信息拆分成不同部分
  parts=weather_info.split(';')

  # 解析天气
  weather=parts[0].strip()

  # 解析温度范围,并提取最小和最大温度
  temperature_range=parts[1].strip().replace('℃','').split('~')
  temperature_min=int(temperature_range[0]);
  temperature_max=int(temperature_range[1]);

  #解析风向和风力
  wind_parts=parts[2].split(' ')
  wind_direction=wind_parts[0].strip()
  wind_force=wind_parts[1].strip()

  # 返回解析后的天气信息字典
  weather_dict={
      'weather':weather,
      'temperature_min':temperature_min,
      'temperature_max':temperature_max,
      'wind_direction':wind_direction,
      'wind_force':wind_force
  }
  return weather_dict

weather_info="小雨; 10℃~15℃;东北风 风力4-5级"
weather_dict=parse_weather_info(weather_info)
print(weather_dict)

结果:

{'weather': '小雨', 'temperature_min': 10, 'temperature_max': 15, 'wind_direction': '东北风', 'wind_force': '风力4-5级'}

4.通过 TransformationChain 转换数据格式

将上面的解析代码与当前的TransformationChain结合到一起封装,我们就能把结果解析成 dict,供后面其他业务使用结构化的数据。

from langchain.chains import TransformChain, SequentialChain

def transform_func(inputs: dict) ->dict:
  # 请求谷歌天气返回的结果数据
  text=inputs["output"]
  # 将结果数据放入解析
  return {"weather_info":parse_weather_info(text)}
# 
transformation_chain=TransformChain(input_variables=["output"], output_variables=["weather_info"], transform=transform_func)
# langchain链式调用将上面的request_chain和本次数据转换transformation_chain放入一个调用链条里
final_chain=SequentialChain(chains=[request_chain,transformation_chain],
                            input_variables=["query","url"], output_variables=["weather_info"])

# 将查询的问题和天气的url传入得到最终的结果
final_result = final_chain.run(inputs)
print(final_result)

然后将request_chain和transformation_chain组成一个final_chain这样的链条,变成一个新的叫做 final_chain 的 LLMChain。在这三步完成之后,未来我们想要获得天气信息,并且拿到一个 dict 形式的输出,只要调用 final_chain 的 run 方法,输入我们关于天气的搜索文本就好了。

它的流程我们给出下面的一张图,就可以很清晰了解它的内部流程了

5.通过 VectorDBQA 来实现先搜索再回复的能力

我们这次的案例是之前使用的电商faq内容文件用VectorDBQA方式处理,之前我们预先把资料库索引好,然后每次用户来问问题的时候,都是先到这个资料库里搜索,再把问题和答案一并交给 AI,让它去组织语言回答。

下面的代码则创建了一个基于 FAISS 进行向量存储的 docsearch 的索引,以及基于这个索引的 RetrievalQA 得到这个 LLMChain。也是可以实现之前的电商faq问答的。

跟之前的代码差不多,将文件数据加载进来,进行分块处理,然后转换为向量,在下一步根据转换后的数据在次转换为faq的chain链条,然后根据链条调用查询就可以了

#!pip install spacy;
#!python -m spacy download zh_core_web_sm
#!pip install tiktoken
#!pip install faiss-cpu
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.text_splitter import SpacyTextSplitter
#from langchain import OpenAI, VectorDBQA
from langchain.chains import RetrievalQA
from langchain.document_loaders import TextLoader


llm=OpenAI(temperature=0)
# 通过一个 TextLoader 把文件加载进来
loader=TextLoader('./data/ecommerce_faq.txt')
documents=loader.load()
# SpacyTextSplitter 给文本分段,确保每个分出来的 Document 都是一个完整的句子。
text_splitter=SpacyTextSplitter(chunk_size=256,pipeline="zh_core_web_sm")
texts=text_splitter.split_documents(documents)

# 定义了使用 OpenAIEmbeddings来给文档创建 Embedding
embeddings=OpenAIEmbeddings()
# 用embeddings将文本数据 "texts" 转换为嵌入向量
# 使用这些嵌入向量创建了一个名为 "docsearch" 的 FAISS 对象
docsearch=FAISS.from_documents(texts,embeddings)
# 通过 FAISS 把它存储成一个 VectorStore,通过 RetrievalQA 的 from_chain_type 定义了一个 LLM
# faq_chain = VectorDBQA.from_chain_type(llm=llm, vectorstore=docsearch, verbose=True)10.3
faq_chain=RetrievalQA.from_chain_type(llm=llm,retriever=docsearch.as_retriever())

根据chian搜索:

question = "请问你们的货,能送到三亚吗?大概需要几天?"
result = faq_chain.run(question)
print(result)

结果:

我们支持全国大部分省份的配送,包括三亚。一般情况下,大部分城市的订单在2-3个工作日内送达,偏远地区可能需要5-7个工作日。

根据chian搜索:

question = "请问你们的退货政策是怎么样的?" 
result = faq_chain.run(question)
print(result)

结果:

自收到商品之日起7天内,如产品未使用、包装完好,您可以申请退货。某些特殊商品可能不支持退货,请在购买前查看商品详情页面的退货政策。

我们看到,chain也可以处理这种faq的文本数据,也会根据文档的内容查询出来数据,没有的话就会去搜索AI。

好了以上就是今天的全部内容,

本章视频说明:深入使用LLMChain,给AI连上Google和计算器_哔哩哔哩_bilibili

本节知识资料感谢徐文浩老师的《AI大模型之美》,让我们可以感受它是真的美! 

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

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

相关文章

Flink(java版)

watermark 时间语义和 watermark 注意:数据进入flink的时间&#xff1a;如果用这个作为时间语义就不存在问题&#xff0c;但是开发中往往会用处理时间 作为时间语义这里就需要考虑延时的问题。 如上图&#xff0c;数据从kafka中获取出来&#xff0c;从多个分区中获取&#xf…

DES和3DES等常见加解密的关键要素---安全行业基础篇3

DES和3DES DES和3DES是对称加密算法&#xff0c;其加密和解密的关键要素包括&#xff1a; 密钥&#xff1a;DES和3DES使用相同长度的密钥进行加密和解密。DES使用56位密钥&#xff0c;而3DES可以使用112位或168位密钥。密钥是保护数据安全的关键&#xff0c;必须保持机密并只…

港联证券:为什么人们买涨不买跌?

在股票市场中&#xff0c;有一个普遍的现象是人们倾向于买涨不买跌。即使在市场出现明显下跌趋势时&#xff0c;大部分投资者也会选择继续持有股票或者进行买入操作&#xff0c;而在股票呈现明显上涨趋势时&#xff0c;却有更多的人涌入市场追涨杀跌。究其原因&#xff0c;可能…

微信小程序+Springboot实现订阅消息推送 (demo)

1. 开通订阅消息 2. 选用模板 订阅消息 - 公共模板库 - 选用 3. 选择关键词 勾选关键词 - 最多勾选5个 - 显示例子 4. 我的模板 5. 订阅号开发者-文档: 发送订阅消息 | 微信开放文档 6. 依赖 <dependency><groupId>com.alibaba.fastjson2</groupId><art…

淘宝API接口解析,实现获得淘宝商品快递费用

要获取淘宝商品快递费用&#xff0c;需要使用淘宝的开放平台API接口。以下是一个基本的示例&#xff0c;解析并实现获取淘宝商品快递费用的API接口。 首先&#xff0c;你需要访问淘宝开放平台并注册一个开发者账号。注册完成后&#xff0c;你需要创建一个应用并获取到API的权限…

滑动窗口实例7(串联所有单词的子串)

题目&#xff1a; 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如&#xff0c;如果 words ["ab","cd","ef"]&#xff0c;…

iPhone勿扰模式如何设置?1分钟学会!

上班的时候手机信息一直“噔、噔、噔”的响&#xff0c;开了静音模式也没用&#xff0c;信息一来手机还是会一直震动&#xff0c;搞得我无法安心工作&#xff0c;还有什么方法可以将这些信息免打扰吗&#xff1f; iPhone手机有一个功能叫做【勿扰模式】&#xff0c;它能够帮助用…

多numa设备,如何看网卡插在哪个numa上

1.在Linux系统中&#xff0c;可以通过lstopo命令来查看系统的NUMA拓扑结构。这个命令通常随着hwloc包一起提供。 安装hwloc包&#xff1a;yum install hwloc 使用lstopo命令来显示系统的NUMA拓扑结构。 &#xff08;在bclinux安装后&#xff0c;只有lstopo-no-graphics命令&…

TSN协议解读系列 | (2) Qbv:车间里的求知路

时春季夜间&#xff0c;风清月朗&#xff0c;周期仿佛又轮转到了从前。一位不修篇幅的老头&#xff0c;牙还没刷&#xff0c;却已然歪头斜躺在床上&#xff0c;床边微亮的显示屏上隐约可见Victory的字样&#xff0c;不一会儿就熄了屏。 这正是我们今天的主人公&#xff0c;Qbv…

微服务-gateway跨域配置

文章目录 一、前言二、gateway跨域配置1、问题描述1.1、什么是跨域请求&#xff1f;1.1.1、同源策略1.1.2. 安全性考虑1.1.3. 跨域攻击 1.2、问题产生原因 2、解决方法2.1、修改配置文件2.2、配置类统一配置2.3、全局跨域拦截器 三、总结 一、前言 在SpringCloud项目中&#x…

C++ - 继承 一些 细节 - 组合 和 继承的区别

前言 本篇博客基于 C - 继承_chihiro1122的博客-CSDN博客 之上列出一些例子&#xff0c;如果有需要请看以上博客。 继承的例子 例1 上述例子应该选择 C。 首先不用说&#xff0c;p3肯定是指向 d 对象的开头的&#xff1b;p1 也是指向 d 对象的开头的&#xff1b;…

网站监控系统最佳实践之静态资源采样上报

作者 观测云 产品服务部门 深圳团队 朱端畅 背景说明 通过 RUM 采集前端数据时&#xff0c;若采集的数据过多&#xff0c;可能会导致占用过多的网络带宽以及其他资源。特别是刚进入首页加载数据时&#xff0c;可能会调用几十次甚至更多次 v1/write/rum?precisionms数据采集接…

spacy安装旧版本en_core_web_sm的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Navicat Premium 16.2.7 数据库管理教程

Navicat Premium 16.2.7是一款功能强大的数据库管理工具&#xff0c;支持多种数据库类型&#xff0c;包括MySQL、Oracle、SQL Server等。以下是使用Navicat Premium的基本步骤&#xff1a; 安装Navicat Premium软件。打开Navicat Premium&#xff0c;在主界面上选择“新建连接…

实现高效数据存储:OpenStack Swift与本地文件系统的完美对接

文章目录 Swift对接本地文件系统前言控制节点新增20G磁盘针对磁盘做分区&#xff08;2个&#xff09;针对磁盘格式化卸载原有的 Swift 虚拟设备创建两个目录并挂载更改权限创建builder创建ring再平衡测试配合glance对接swiftglance对接swift测试 Swift对接本地文件系统 前言 实…

OpenCV实战(31)——基于级联Haar特征的目标检测

OpenCV实战&#xff08;31&#xff09;——基于级联Haar特征的目标检测 0. 前言1. Haar 特征图像表示2. 基于级联 Haar 特征的二分类分类器3. 级联分类器算法流程4. 使用 Haar 级联检测器进行人脸检测5. 完整代码小结系列链接 0. 前言 在机器学习基础一节中&#xff0c;我们介…

【Linux】文件缓冲区

目录 一、缓冲区图解二、自定义实现文件操作函数三、强制刷新内核缓冲区&#xff08;fsync&#xff09; 提到文件缓冲区这个概念我们好像并不陌生&#xff0c;但是我们对于这个概念好像又是模糊的存在脑海中&#xff0c;之间我们在介绍c语言文件操作已经简单的提过这个概念&…

NoSQL MongoDB Redis E-R图 UML类图概述

NoSQL NoSQL(Not only SQL)是对不同于传统的关系数据库的数据库管理系统的统称&#xff0c;即广义地来说可以把所有不是关系型数据库的数据库统称为NoSQL。 NoSQL 数据库专门构建用于特定的数据模型&#xff0c;并且具有灵活的架构来构建现代应用程序。NoSQL 数据库使用各种数…

CIM和websockt-实现实时消息通信:双人聊天和消息列表展示

欢迎大佬的来访&#xff0c;给大佬奉茶 一、文章背景 有一个业务需求是&#xff1a;实现一个聊天室&#xff0c;我和对方可以聊天&#xff1b;以及有一个消息列表展示我和对方&#xff08;多个人&#xff09;的聊天信息和及时接收到对方发来的消息并展示在列表上。 项目框架概…

SNP 分享:SAP S/4HANA Cloud 私有云版本及其独特优势

近几年来&#xff0c;SAP一直强调其愿景是帮助客户达成智慧型企业(Intelligent Enterprise)&#xff0c;为此其相关产品也在不断进行快速迭代&#xff0c;其核心就是S4HANA。同时SAP一直强调其要成为一家云计算公司&#xff0c;近些年也一直在推行云优先战略(Cloud First)。因此…