仅需15行代码,即可使⽤⼤模型进⾏问答并进⾏⾕歌联⽹搜索

文章介绍了如何结合OpenAIAPI和Serpapi的Google搜索接口来获取更准确、实时的答案。首先在Serpapi官网注册获取APIkey,然后在Python环境中设置环境变量。通过LangChain库加载和初始化工具,运行示例代码展示搜索日期和历史事件的功能。强调AI能提升效率,但需持续学习以充分发挥其价值,并提及LangChain的自定义配置等扩展可能性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

让我们的OpenAI api 联网搜索,以便于获取更加准确和实时性的答案,这可能是我们经常会遇到的⼀个需求。

为了实现这⼀⽬标,我们需要借助Serpapi提供的Google搜索API接⼝。

准备

5f39ccdad7294f054113f3220f6d7447.jpeg

1:OpenAI apikey

2:Serpapi(需要去Serpapi官网进行申请)

⾸先,我们需要在Serpapi官网上注册⼀个账户,并获取apikey。

然后像设置OpenAIAPIkey⼀样,将SerpapiAPIkey设置到环境变量⾥。

346d0f1e28ec16769ca7c483ed9f11d0.jpeg

代码

import os
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.llms import OpenAI
from langchain.agents import AgentType
os.environ["OPENAI_API_KEY"] = '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'
os.environ["SERPAPI_API_KEY"] = 'd329aa9848c97a69d8ad344dddf28af5dd8ab50e7ea1aa6271cb8c1ee94f4417'
# 加载 OpenAI 模型
llm = OpenAI(temperature=0,max_tokens=2048)
# 加载 serpapi ⼯具
tools = load_tools(["serpapi"])
# ⼯具加载后都需要初始化,verbose 参数为 True,会打印全部的执⾏详情
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
# 运⾏ agent
agent.run("What's the date today? What great events have taken place today in history?")

运行以上代码,我们可以看到,他正确的返回了日期(有时差),并且返回了历史上的今天。

597d0c355fcff319b22dc4b622ef821f.jpeg

直接把上面的两个API的KEY换成我们提前准备好的即可。

(前提是你的电脑需要有python环境,并且安装了相应的依赖)

值得注意的是,chain和agent对象上都有⼀个⾮常有⽤的参数,那就是verbose参数。开启他后我们可以看到完整的chain执行过程,他将我们的问题拆分成了几个步骤,然后⼀步⼀步得到最终的答案。

总结

使用AI技术能极⼤地提⾼我们的工作效率,无论是处理⼤量的信息,还是解决复杂的问题,AI都能为我们提供很大的帮助。


但是同时,我们也需要注意,AI技术并不是万能的,它依然需要我们不断地学习和掌握,才能真正地发挥其价值。

LangChain提供的功能还有很多,比如你还可以根据需求进行自定义配置等等,更多的强⼤功能等待你去探索。



计算机视觉⼩组实训项⽬2:图像识 别 任务⽬标: 对于给定数据集,训练CNN模型,并在测试集中验证。 要求: 模型围绕Alexnet展开,对模型改造,使得其适应输出 通过修改模型的参数(如通道数、卷积层尺⼨、层数等)来训练⾄少两种以上模型 (以Alexnet为基础) 注意数据隔离,验证集⾃划分,占⽐20%,最终结果要在验证集上得到 要给出明确结论,并⽤数据佐证 可以对所有代码的含义解释,理解所写下的每⼀句代码。不理解的代码不要 写。 任务要点: 数据: ⾸先,要把数据上传到盘,并进解压缩。⽰例代码为 import zipfile # path为压缩包路径 with zipfile.ZipFile(path, 'r') as zip_ref: zip_ref.extractall(path) 注意,最好将数据解压到⼀个⽂件夹中,避免混乱。 其次,通常数据上传到默认路径,要将其转移到盘之中。⽤python移动⽂件夹的 代码⽰例为 import shutil 计算机视觉⼩组实训项⽬2:图像识别 1 shutil.move(source_dir, destination_dir) 最后,解压后的train⽂件夹应当包含25000张图像,例如可以如下验证: len(os.listdir(folder_path)) # folder_path为train⽂件夹的路径 Dataset重构 读取数据要重构Dataset类,即 from torch.utils.data import Dataset 基本数据的读取思路为: 不可以将数据⼀次性全部载⼊内存 将数据的路径记录为列表,载⼊内存后,按读取图像 标签配对,转成tensor、resize归⼀化等各种操作 ⾸先,要定义数据预处理部分,即 from torchvision import transforms transform = transforms.Compose([ transforms.Lambda(lambda x: torch.from_numpy(x).permute(2, 0, 1). transforms.Resize(256), # 缩放为固定⼤⼩ transforms.ToTensor(), # 转换成tensor格式 transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 归⼀化 ]) 然后,重构Dataset类⽰例(可以按照⾃⼰习惯的⽅式调整) import os import cv2 from torch.utils.data import Dataset from torchvision import transforms # 建议定义默认transform default_transform = transforms.Compose([ 计算机视觉⼩组实训项⽬2:图像识别 2 transforms.ToPILImage(), transforms.Resize((256, 256)), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.22 ]) class ImageDataset(Dataset): def __init__(self, root_dir, transform=default_transform): self.root_dir = root_dir self.filelist = [ os.path.join(root_dir, fname) for fname in os.listdir(root_dir) if fname.lower().endswith('.jpg') ] self.transform = transform or transforms.ToTensor() # 确保默认转换 def __len__(self): return len(self.filelist) def __getitem__(self, idx): filename = self.filelist[idx] # 读取图像并校验 img = cv2.imread(filename) if img is None: raise FileNotFoundError(f"Failed to load image: {filename}") img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 转换处理 if self.transform: img = self.transform(image=img)["image"] # 假设使⽤albumentations格 else: img = transforms.ToTensor()(img) # 获取标签 fname = os.path.basename(filename).lower() if fname.startswith('cat'): y = 0 计算机视觉⼩组实训项⽬2:图像识别 3 elif fname.startswith('dog'): y = 1 else: raise ValueError(f"Unsupported class: {fname}") return img, y Tensorboard的使⽤ 可以使⽤tensorboard记录训练log 在训练前,可以定义tensorboard对象 writer = SummaryWriter('logs/experiment_1') # 指定⽇志⽬录 然后在训练过程中记录训练数据 # ⽰例训练循环中的记录操作 for epoch in range(epochs): # ... 训练代码 ... loss = ... acc = ... # 记录标量数据 writer.add_scalar('Loss/train', loss, epoch) writer.add_scalar('Accuracy/train', acc, epoch) # 训练结束后关闭记录器 writer.close() 启动tensorboard命令如下 %tensorboard --logdir logs/ --port 6006 然后就可以展⽰相关界⾯。 通常只要保存训练损失、训练精度、测试损失、测试精度⼏个标量即可模型保存 由于模型要⻓时间训练,因此中间结果保存。 计算机视觉⼩组实训项⽬2:图像识别 4 保存的⽅式是,每训练⼀个epoch,就⼀次保存。 保存的话,建议⽤⽇期和精度/损失命名⽂件,以便识别。 1. ⽣成时间戳 from datetime import datetime # ⽣成时间戳(精确到秒) timestamp = datetime.now().strftime("%Y%m%d%H%M%S") 2. 建议将所有的模型保存到⼀个⽂件夹中 os.makedirs(save_dir, exist_ok=True) 注意在训练不同模型时,记录在不同的⽂件夹内,以免混淆。 3. 记录loss并格式化为⽂件名 loss_str = f"{loss:.4f}" 4. 构建⽂件名⽰例 filename = f"model_epoch{epoch}_time{timestamp}_loss{loss_str}.pth" filepath = os.path.join(save_dir, filename) 5. 保存模型的⽰例 torch.save({ 'epoch': epoch, 'model_state_dict': model.state_dict(), 'optimizer_state_dict': optimizer.state_dict(), 'loss': loss, 'timestamp': timestamp }, filepath) 将上述变量填写后保存 6. 载⼊模型 ⽰例 计算机视觉⼩组实训项⽬2:图像识别 5 checkpoint = torch.load(path) # 保存的⽂件 model.load_state_dict(checkpoint['model_state_dict']) optimizer.load_state_dict(checkpoint['optimizer_state_dict']) start_epoch = checkpoint['epoch'] + 1 注意,如果模型训练中断后,重新载⼊模型训练,那么要改变epoch等关键变量的 值,以免出现混乱。 请给我用pytorch完成此项目,要求在colab中实现代码,请将详细步骤思路逻辑以及代码给我
04-03
《⼤数据算法综合实践》任务书 !"#$%& 本实验旨在通过⼤规模图数据中最⼤团搜索算法的设计与性能优化,帮助学 ⽣深⼊理解图计算系统的⼯作原理和性能优化机制,并学会使⽤图计算框架 ⼤规模图数据分析和处理。通过此实验,学⽣将能够掌握图计算的基本原理,编 写⽐较复杂的图算法程序并进性能调优。 !"#'(&⼤规模图数据中最⼤团搜索算法的设计与性能优化 ⼤数据时代,对关(图)数据的处理被⼴泛应⽤于社交络、智能交通、 移动络等领域。团问题指的是在给定的图中找到团(顶点的⼦集,都彼此相邻, 也称为完全⼦图)的计算问题。团的问题在现实⽣活中也有体现。例如我们考虑 ⼀个社交络,其中图的点代表⽤户,图的边代表其所连接的两个⽤户互相认识。 那么我们找到了⼀个团,也就找到了⼀群互相认识的⼈。最⼤团指的是点数量最 多的极⼤团。我们如果想要找到这个社交络中最⼤的⼀群互相认识的⼈,那么 就要⽤到最⼤团搜索算法。 基本思路是利⽤递归和回溯,⽤⼀个列表存储点,每次加⼊点来都检查这 些点是否仍在⼀个团中。如果加⼊来这个点后就⽆法还是⼀个团了,就回溯到 满⾜条件的位置,重新加⼊别的点。采⽤回溯策略的原因是,我们并不知道某个 顶点最终是否是最⼤团中的成员。如果递归算法选择作为最⼤团的成员时,并没 有找到最⼤团,那么应该回溯,并查找最⼤团中没有的解。 Bron-Kerbosch 算法对这种想法了优化实现,其基础形式是⼀个递归 回溯的搜索算法,通过给定三个集合:R、P、X 来递归的搜索: 1. 初始化集合 R、X 分别为空,集合 P 为所有顶点的集合 2. 每次从集合 P 中取顶点 {vi},当集合中没有顶点时,有两种情况: 1)集合 R 是最⼤团,此时集合 X 为空; 2)⽆最⼤团,此时回溯。 3. 对于每⼀个从集合 P 中取得的顶点 {vi},有如下处理: 1)将顶点 {vi} 加到集合 R 中,集合 P、X 与顶点 {vi} 的邻接顶点集合 N{vi} 相交,之后递归集合 R、P、X; 2)从集合 P 中删除顶点 {vi},并将顶点 {vi} 添加到集合 X 中; 3)若集合 P、X 都为空,则集合 R 即为最⼤团。 总的来看,就是每次从集合 P 中取 vi 后,再从 P∩N{vi} 集合中取相邻结 点,保证集合 R 中任意顶点间都两两相邻。此⽅法也可继续优化,为了节省时 间让算法更快的回溯,可以通过设定关键点(pivot vertex)来搜索。另⼀种 优化思路是在开始时把所有点排序,枚举时按照下标顺序,防⽌重复。 Bron-Kerbosch 算法的伪代码如下: R := {} P := node set of G X := {} BronKerbosch1(R, P, X): if P and X are both empty: report R as a maximal clique for each vertex v in P: BronKerbosch1(R ⋃ {v}, P ⋂ N(v), X ⋂ N(v)) P := P \ {v} X := X ⋃ {v} 在本实验中,同学们要重点考虑如何在⼤规模图数据中快速找到最⼤团。 在真实的数据集中,所考虑的图数据的规模将达到 228~229 顶点和 4-5 billion 条 边,要很⻓的计算时间。因此,⼤家可以先构造⽐较简单的数据集⽤于测试代 码功能。 在 Linux 环境下,采⽤ Spark GraphX 或 Pregel 或其它框架设计最⼤团问题 求解算法。所开发的算法应该能够充分利⽤多核资源,以完成给定格式的图数据 中最⼤团的搜索。开发环境如下: ● 操作系统:Linux ubuntu 14.04 或 16.04 ● 编译器:gcc 或者 g++ 4.8 以上 ● Make:GNU make 4.0 以上 ● 框架:Spark GraphX、Pregel、或你所熟悉擅⻓的其它框架 数据集 说明 中等规模数据集 soc-LiveJournal1 顶点数:4.8 million、边数:69 million 来源:https://snap.stanford.edu/data/soc￾LiveJournal1.html 小数据集 cit-HepPh 顶点数:34546, 边数:421578 来源:https://snap.stanford.edu/data/cit￾HepPh.html 注意: 1)以上⽂件皆为⽂本⽂件,为顺序存放的边表。每条边包含两个顶点(源 顶点和⽬的顶点,各占 4 个字节),边的存储⻓度为 8 个字节,⽂件的存 储格式为: 源顶点(4 字节,⽆符号整型),⽬的顶点(4 字节,⽆符号整型) 源顶点(4 字节,⽆符号整型),⽬的顶点(4 字节,⽆符号整型) ……[EOF] 2)由于最⼤团算法要求输⼊的图为⽆向图,所以算法应将以上表格中所 列出的图均(应视为)⽆向图处理。 !"#)*& 本实验有功能和性能两⽅⾯的要求,⾸先要能够正确地找到所给数据集 中的最⼤团,
最新发布
05-28
在线图书管理系统,请给我详细的细化代码,并显示代码结果 项⽬描述: 该系统旨在为图书管理员和读者提供一个便捷的图书管理和查询平台。管理员可以管理图书信息,包括添加、删除和更新图书信息,⽽读者可以查看图书列表并进图书查询。 基本功能: 1)图书管理:管理员可以添加、删除和更新图书信息,包括图书名称、作者、出版社、ISBN 等信息。 2)图书查询:读者可以根据图书名称、作者或关键字图书查询,并查看图书的详细信息。 3)⽤户登录:管理员和读者可以通过⽤户名和密码登录,并且管理员拥有更⾼的权限。 技术要求: 1)后端框架:Spring MVC、Spring、MyBatis 2)数据库:MySQL 3)前端技术:HTML、CSS、JavaScript(可以使⽤简单的前端框架,如Bootstrap) 4)开发⼯具:IntelliJ IDEA 或 Eclipse 5)版本控制:Git 项⽬实现步骤: 1)搭建项⽬基础框架:使⽤Spring MVC、Spring、MyBatis搭建项⽬基础框架。 2)创建数据库:设计并创建图书管理系统所的数据库表。 3)实现图书管理功能:编写后端代码,实现管理员对图书的增删改查功能。 4)实现图书查询功能:编写后端代码,实现读者根据关键字图书查询的功能。 5)实现⽤户登录功能:编写后端代码,实现管理员和读者的登录验证功能。 6)设计并实现前端⻚⾯:使⽤HTML、CSS和JavaScript设计并实现系统的前端⻚⾯,包括图书管理⻚⾯、图书查询⻚⾯和登录⻚⾯。 7)系统整合与测试:将前后端整合在一起,系统功能测试和性能测试,确保系统稳定运
04-28
### 在线图书管理系统的技术架构概述 在线图书管理系统是一种常见的Web应用程序,通常采用分层设计模式来提高可维护性和扩展性。以下是基于Spring MVC、MyBatis和MySQL技术栈的详细代码实现及运结果。 --- #### 1. 技术选型说明 该系统主要依赖于以下技术组件: - **前端框架**: JSP/HTML/CSS/JavaScript (Bootstrap 可用于美化界面)[^1] - **后端框架**: Spring MVC[^2] - **持久化框架**: MyBatis[^3] - **数据库**: MySQL[^4] 这些技术共同协作完成数据展示、业务逻辑处理以及数据存储等功能。 --- #### 2. 系统模块划分 典型的在线图书管理系统可以划分为以下几个核心功能模块: - 用户登录注册 - 图书查询与借阅 - 图书分类管理 - 借阅记录查看 - 后台管理员操作 每项功能都对应特定的服务接口和服务实现类。 --- #### 3. 数据库设计 数据库表结构如下: ##### `users` 表 | 字段名 | 类型 | 描述 | |--------------|--------------|----------------| | id | INT | 主键, 自增 | | username | VARCHAR(50) | 用户名 | | password | VARCHAR(50) | 密码 | ##### `books` 表 | 字段名 | 类型 | 描述 | |--------------|--------------|----------------| | book_id | INT | 主键, 自增 | | title | VARCHAR(100) | 图书名称 | | author | VARCHAR(50) | 作者 | | category | VARCHAR(50) | 分类 | | status | TINYINT | 是否已借出 (0:未借; 1:已借) | ##### SQL 创建语句 ```sql CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(50) NOT NULL ); CREATE TABLE books ( book_id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(100) NOT NULL, author VARCHAR(50), category VARCHAR(50), status TINYINT DEFAULT 0 ); ``` --- #### 4. Maven 配置文件 (`pom.xml`) 项目依赖配置如下所示: ```xml <dependencies> <!-- Spring Framework --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.9</version> </dependency> <!-- MyBatis and Integration with Spring --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <!-- MySQL Connector --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- Servlet API --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> ``` --- #### 5. 核心代码实现 ##### (1)Controller 层 负责接收请求并调用服务层方法。 ```java @Controller @RequestMapping("/book") public class BookController { @Autowired private BookService bookService; @GetMapping("/list") public String listBooks(Model model){ List<Book> books = bookService.getAllBooks(); model.addAttribute("books", books); return "bookList"; // 跳转到视图页面 } @PostMapping("/borrow/{id}") public String borrowBook(@PathVariable int id){ boolean success = bookService.borrowBook(id); if(success){ return "redirect:/book/list"; }else{ return "errorPage"; } } } ``` ##### (2)Service 层 封装具体的业务逻辑。 ```java @Service public class BookServiceImpl implements BookService { @Autowired private BookMapper bookMapper; @Override public List<Book> getAllBooks() { return bookMapper.selectAllBooks(); } @Override public boolean borrowBook(int bookId) { return bookMapper.updateStatus(bookId, 1) > 0; } } ``` ##### (3)DAO 层(MyBatis Mapper) 定义SQL映射关系。 ```java @Mapper public interface BookMapper { @Select("SELECT * FROM books") List<Book> selectAllBooks(); @Update("UPDATE books SET status=#{status} WHERE book_id=#{id}") int updateStatus(@Param("id") int id, @Param("status") int status); } ``` ##### (4)实体类 表示数据库中的对象模型。 ```java public class Book { private Integer bookId; private String title; private String author; private String category; private Integer status; // Getters 和 Setters 方法省略... } ``` --- #### 6. 运结果截图描述 假设已经部署完毕,在浏览器访问 `/book/list` 地址时会显示所有书籍列表;点击“借阅”按钮后,对应的书籍状态会被更新为“已借”。 由于无法直接提供图片,请按照以下流程验证: 1. 使用Postman测试API接口返回JSON数据。 2. 打开JSP页面观察渲染效果。 --- #### 7. 总结 通过以上代码实现了基本的功能求,并展示了如何利用Spring MVC作为控制器、MyBatisORM映射以及MySQL保存实际的数据。此方案具有良好的性能表现和较高的开发效率[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值