将相关的数据add给云服务器中的搜索引擎|青训营笔记

233 阅读7分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第6篇笔记

本文将介绍如何将数据add给云服务器中的搜索引擎

悟空数据集介绍

华为诺亚方舟实验室开源了第一个亿级中文多模态数据集:悟空。

这个新发布的数据集不仅规模大——包含1亿组图文对,而且质量也很高。

所有图像都是筛选过的,长宽都在200个像素以上,比例从1/3-3不等。

而和图像对应的文本也根据其语言、长度和频率进行了过滤,隐私和敏感词也都考虑在内。

例如这一组数据集中的例子,内容还相当新,像进门扫码登记,社区疫苗接种的防疫内容都有。

\

\

这一波可以说是填上了大规模中文多模态数据集的缺口。

悟空数据集

自一年前OpenAI的CLIP+Dall·E组合开启新一轮多模态学习浪潮以来,算上后续的ALIGN和FILIP,都在视觉语言预训练(VLP)领域表现优异。

世界范围内的成功离不开大规模数据集的支持,但中文开源数据方面,有是有,规模大的不多。

\

\

有了“悟空”数据集之后,就可以支持更多预训练模型用于下游任务。

数据集之外,团队还附赠了一款基本模型,参考了流行的文本图像双编码器架构:

\

\

其中视觉标记和文本标记作为输入。然后,将两种模式的输入标记连接起来,并用位置嵌入来显示标记位置。

有意思的一点是,这里的图像编码器是从英文数据集上训练的,上面预加载并锁定了从外部模型中训练的英文数据集中的权重。

但是仍然可以中文文本进行跨模态预训练,在下游任务中也表现得很好。

除此之外,华为诺亚还提供了不同下游任务的基准测试

例如零样本图像分类,下图中除了WukongViT-500M,其他的悟空模型变体都是在这个一亿的数据库上训练的:

\

\

再比如在图像检索文本和文本检索图像这两个任务上,在五个不同的数据集上的测试结果如下:

\

\

而这也证明了将在英语数据集上预训练的图像编码器应用于中文多模态预训练的良好效果。未来也可能会探索更多的解决方案,利用悟空数据集训练多语言跨模态模型。

目前悟空数据集在官网即可下载(链接在文末),赶快用起来吧~

数据集地址:
wukong-dataset.github.io

参考文章:悟空数据集 - 搜索 (bing.com)

Apifox介绍

Apifox 是接口管理、开发、测试全流程集成工具,定位 Postman + Swagger + Mock + JMeter。通过一套系统、一份数据,解决多个系统之间的数据同步问题。只要定义好接口文档,接口调试、数据 Mock、接口测试就可以直接使用,无需再次定义;接口文档和接口开发调试使用同一个工具,接口调试完成后即可保证和接口文档定义完全一致。高效、及时、准确!


【运行环境】

  • Windows
  • Mac
  • Linux

【官方网站】

www.apifox.cn/

【官方文档】

www.apifox.cn/help/

Apifox十大核心功能


可以看到,Apifox已经能够满足你日常进行接口测试的大部分需要。

我个人认为,比较好用的功能有:

接口文档、团队协作、数据导入/导出、CI/CD的持续集成。

二、基本使用

Apifox 的页面长得很像 Postman,Postman该有的功能,Apifox同样也有,所以你完全可以把他当成Postman去用。

接口环境隔离设置

\

请求构造


上述功能都比较简单,假如大家用过postman的话,上手应该不难。

这里教大家Apifox的几个实用小技巧。

2.1 快速构造请求

我们手动去录入请求的时候,需要填入很多参数,包括:

  • 请求方法
  • URL
  • Header
  • Params
  • Body
  • ...

等等信息,相当繁琐。

有没有一种快速的方式,可以帮我们快速生成接口请求呢?有。

我们可以利用Apifox的导入抓包请求,来快速生成接口请求。

第一步:打开charles,右键需要目标接口,并 "Copy cURL Request"

\

第二步:在Apifox中,导入抓包数据

\


简单2步,就可以快速的帮助我们生成接口请求。

\

2.2 生成接口文档

在项目概览,可以生成在线接口文档。

\


生成的在线接口文档,还是相当美观的,这给不喜欢维护接口文档的团队,带来了很大的福音。

2.3 执行自动化测试

我们可以把录制好的用例,进行抽取并执行简单的自动化测试,甚至还可以控制线程数、循环次数等。

(尼玛,这不就是Jmeter么?)

测试完成后,还能够生成一份较为直观的测试报告


2.4 自动生成代码

Apifox甚至支持自动生成业务代码!


支持很多种编程语言。(常见的 Java/PHP/Go/Python/C# 都支持)

尝试着生成了一份Java的业务代码(Spring),并用 IDEA 打开。


一般来说,导出的业务代码都会出现各种各样离奇古怪的问题,我们开发在写业务代码的时候,也不会直接去使用这个自动生成代码的功能。

但,这个功能看上去还是挺炫酷的,不是么?

三、总结

本文只是简单介绍了 Apifox客户端 的基本用法,但是 Apifox 还有很多实用的功能,这里就不再一一展示了,有需要的朋友,可以自己去官网了解。

抛开 Apifox 的介绍,我们再来谈谈,如何把一些免费或开源的测试项目,更好的运用到日常工作当中去:

3.1 不要重复造轮子

在工作中,我遇到过很多人,遇到问题,没有去调研市面上好用的测试工具,就想着自己埋头去写代码解决。

但是往往做出来的,要么易用性太差,很难在团队中推广;要么设计上浪费好多时间,但是实际做出来很简陋,并不能满足日常工作需要。

最终的结果都是:写出来的工具很垃圾,根本没法用,最后又不得不去找好用的第三方或开源的工具来使用。

如果市面上已经有了好用的工具,那就不要重复造轮子了吧!真的很浪费时间。

参考文献: (一款丧心病狂的API测试工具:Apifox! - 知乎 (zhihu.com))

给gofund搜索引擎添加数据

因为我们参考的搜索引擎项目是gofund 首先要明白如何对gofund添加相关数据,demo代码如下所示:


import (
	"bytes"
	"encoding/csv"
	"encoding/json"
	"fmt"
	"io"
	"io/ioutil"
	"log"
	"net/http"
	"net/url"
	"os"
)

type RequestData struct {
	Id   int               `json:"id"`
	Text string            `json:"text"`
	Url  map[string]string `json:"document"`
}

func sendJsonReq(client *http.Client, jsonData []byte) {
	sJsonData := bytes.NewReader(jsonData)
	req, err := http.NewRequest("POST", "http://127.0.0.1:8080/api/index", sJsonData)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/json")
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%s\n", bodyText)
}

//将悟空数据集当中的数据上传的gofound服务器当中
func sendReqByDatafile(client *http.Client) {
	filename := "data/wukong50k_release.csv"
	fp, err := os.Open(filename)
	if err != nil {
		log.Fatalf("can open file, err is %+v", err)
	}
	defer fp.Close()
	var reqId int = 0
	reader := csv.NewReader(fp)
	reader.Read() //读取表头
	for {
		row, err := reader.Read()
		if err == io.EOF {
			break
		}
		data := RequestData{}
		data.Id = reqId
		data.Text = row[1]
		data.Url = make(map[string]string)
		data.Url["url"] = url.QueryEscape(row[0]) //url将编码之后发送
		//将结构体数据转化为jsondata之后发送
		jsonData, _ := json.Marshal(data)
		sendJsonReq(client, jsonData)
		reqId++
	}
}

func main() {
	client := &http.Client{}
	sendReqByDatafile(client)
}

func urlTest() {
	urltest := "https://gimg2.baidu.com/image_search/src=http%3A%2F%2F5b0988e595225.cdn.sohucs.com%2Fimages%2F20200326%2Fffc00cb6bc944e5b9ab2673c4873b24c.jpeg&refer=http%3A%2F%2F5b0988e595225.cdn.sohucs.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1632531279&t=1b9ba84f70ddebdda6601a5576d37c50"
	fmt.Println(urltest)
	encodeurl := url.QueryEscape(urltest)
	fmt.Println(encodeurl)
	decodeurl, err := url.QueryUnescape(encodeurl)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(decodeurl)
}

给青训营项目中的搜索引擎add悟空数据集

单个的add数据在apifox当中可以进行自动生成。我们需要进行数据的处理加工然后用for循环进行add

package main

import (
   "encoding/csv"
   "fmt"
   "io/ioutil"
   "log"
   "net/http"
   "os"
   "strings"
)

func sendReq(url string, text string) {
   method := "GET"

   client := &http.Client{}
   req, err := http.NewRequest(method, url, nil)

   if err != nil {
      fmt.Println(err)
      return
   }
   req.Header.Add("User-Agent", "apifox/1.0.0 (https://www.apifox.cn)")

   res, err := client.Do(req)
   if err != nil {
      fmt.Println(err)
      return
   }
   defer res.Body.Close()

   body, err := ioutil.ReadAll(res.Body)
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Println(string(body))
}

func main() {
   filename := "D://迅雷下载/wukong50k_release.csv"
   fp, err := os.Open(filename)
   if err != nil {
      log.Fatalf("can open file, err is %+v", err)
   }
   defer fp.Close()
   reader := csv.NewReader(fp)
   reader.Read()

   for i := 0; i < 50259; i++ {
      fmt.Println(i)
      fmt.Println("++++++")
      row, _ := reader.Read()
      apx := row[0]
      text := row[1]
      var (
         build strings.Builder
      )
      a := "http://cosine.ren:8080/search/add?text="
      build.WriteString(a)
      build.WriteString(row[1])
      build.WriteString("url=")
      build.WriteString(apx)
      url := build.String()
      sendReq(url, text)

   }
   fmt.Print("上传完成")
}
```
```