用Streamlit构建Jina神经搜索

2021-09-06 15:31:05 浏览数 (2)


磐创AI分享

作者|Alex C-G 编译|VK 来源|Towards Data Science

这篇文章,我将介绍如何使用Jina的新streamlight组件来搜索文本或图像,从而构建一个神经搜索前端。

查看我们的文本搜索应用程序或图像搜索应用程序,这里是代码仓库地址:https://github.com/jina-ai/streamlit-jina。

为什么要用Jina建立一个神经搜索

Jina是一个开源的深度学习搜索框架,用于在云上构建多类型数据搜索系统(例如文本、图像、视频、音频)。从本质上说,它允许你为任何类型的数据构建一个搜索引擎。

所以你可以建立自己的文本到文本搜索引擎ala Google,文本到图像搜索引擎ala Google Images,视频到视频搜索引擎等等。像Facebook、Google和Spotify这样的公司通过FAISS、DistilBERT和have等先进的人工智能模型构建这些搜索引擎。

为什么使用Streamlit和Jina

在我加入Jina之前,我就一直是Streamlit的忠实粉丝。所以我很高兴能使用这个很酷的框架为我们的用户构建一些东西。

构建Streamlit组件有助于数据科学家、机器学习爱好者和Streamlit社区中的所有其他开发人员构建由神经搜索支持的东西。它提供了灵活性,而且,由于是用Python编写的,它可以更容易地让数据科学家跟上速度。

现成的streamlight jina组件具有文本到文本和图像到图像的搜索功能,但是jina为任何类型的数据提供了丰富的搜索体验,因此组件中还有很多可添加的内容!

它是如何工作的

每个Jina项目包括两个流程:

索引:用于使用神经网络模型从数据集中分解和提取丰富的含义

查询:用于获取用户输入并查找匹配结果

我们的streamlight组件是终端用户的前端,因此它不必担心索引部分。

  1. 管理员打开一个Jina Docker图片:docker run -p 45678:45678 jinahub/app.example.wikipedia-sentences-30k:0.2.9-1.0.1
  2. 用户在Streamlit组件中输入查询(当前为文本输入或图像上传)并点击“搜索”
  3. 用JSON包装查询并发送到Jina的查询API
  4. 查询并以JSON格式返回结果(以及大量元数据)
  5. 组件解析出有用的信息(例如文本或图像匹配),并将它们显示给用户

示例代码

让我们看看我们的文本搜索示例,因为它更容易看到那里发生了什么:

代码语言:javascript复制
import streamlit as st
from streamlit_jina import jina

st.set_page_config(page_title="Jina Text Search",)
endpoint = "http://0.0.0.0:45678/api/search" # 这是Jina的默认端点。如果你的“流”使用了不同的内容,那就把它关掉
st.title("Jina Text Search")
st.markdown("You can run our [Wikipedia search example](https://github.com/jina-ai/examples/tree/master/wikipedia-sentences) to test out this search")

jina.text_search(endpoint=endpoint)

如你所见,上面的代码:

  • 导入streamlit和streamlitïjina
  • 设置搜索的REST端点
  • 设置页面标题
  • 显示一些解释性文本
  • 显示定义了端点的Jina文本搜索小部件

对于Jina Streamlit小部件,你还可以传入其他参数来定义要返回的结果数,或者如果你想隐藏某些小部件。

背后

我们模块的源代码只是一个文件。现在我们来看一下文本搜索示例的高级功能:

设置配置变量
代码语言:javascript复制
headers = {
    "Content-Type": "application/json",
}

# 在用户没有指定端点的情况下设置默认端点
DEFAULT_ENDPOINT = "http://0.0.0.0:45678/api/search"
渲染组件
代码语言:javascript复制
class jina:
    def text_search(endpoint=DEFAULT_ENDPOINT, top_k=10, hidden=[]):
        container = st.beta_container()
        with container:
            if "endpoint" not in hidden:
                endpoint = st.text_input("Endpoint", endpoint)

            query = st.text_input("Enter query")

            if "top_k" not in hidden:
                top_k = st.slider("Results", 1, top_k, int(top_k / 2))

            button = st.button("Search")

            if button:
                matches = text.process.json(query, top_k, endpoint)
                st.write(matches)

        return container

简而言之,jina.text_search()方法:

  • 创建一个Streamlit容器来保存所有内容,如果没有指定,则使用合理的默认值
  • 如果widget没有设置为hidden,则将它们呈现给用户
  • [用户类型查询]
  • [用户单击按钮]
  • 向jina api发送查询并返回结果
  • 在组件中显示结果

我们的方法参数是:

jina.text_search()调用其他几个方法,所有这些方法都可以在__init__.py中找到。对于图像搜索,还有一些附加功能:

image.encode.img_base64()将查询图像编码为base64,并在传递给jina api之前将其包装为JSON

Jina的API以base64格式返回匹配项。方法将它们包装在标记中,这样它们就可以很好地显示

在你的项目中使用它

在终端中:

使用虚拟环境创建新文件夹并将其激活。这将防止系统库和单个项目库之间发生冲突:

代码语言:javascript复制
mkdir my_project
virtualenv env
source env/bin/activate

安装Streamlit和Streamlit Jina软件包:

代码语言:javascript复制
pip install streamlit streamlit-jina

在Jina中索引数据并启动查询流。或者,使用预索引的Docker映像:

代码语言:javascript复制
docker run -p 45678:45678 jinahub/app.example.wikipedia-sentences-30k:0.2.9-1.0.1

创建你的app.py:

代码语言:javascript复制
import streamlit as st
from streamlit_jina import jina

st.set_page_config(page_title="Jina Text Search",)
endpoint = "http://0.0.0.0:45678/api/search" # 这是Jina的默认端点。如果你的“流”使用了不同的内容,那就把它关掉
st.title("Jina Text Search")
st.markdown("You can run our [Wikipedia search example](https://github.com/jina-ai/examples/tree/master/wikipedia-sentences) to test out this search")

jina.text_search(endpoint=endpoint)

运行Streamlit:

代码语言:javascript复制
streamlit run app.py

你有了你自己的文本搜索!

对于图像搜索,只需将上面的文本代码替换为图像示例代码,然后运行Jina图像(如Pokemon示例)。

下一步怎么办

感谢你阅读本文!如果你想了解更多关于Jina和Streamlit的信息,请参阅以下一些有用的资源:

Jina

Streamlight Jina组件:https://github.com/jina-ai/streamlit-jina

Jina 101:Jina的基本组成部分:https://docs.jina.ai/chapters/101/index.html

Jina 102:Jina组件如何协同工作:https://docs.jina.ai/chapters/102/index.html

我的第一个Jina应用程序:为Wikipedia语句构建一个简单的文本搜索应用程序:https://docs.jina.ai/chapters/my_first_jina_app

我们的代码仓库:文本、图像、音频、视频和多模式搜索后端的示例:https://github.com/jina-ai/examples

Streamlit
  • Streamlit docs(https://docs.streamlit.io/en/stable/)
  • Components gallery(https://streamlit.io/gallery?type=components&category=featured)
  • App gallery(https://streamlit.io/gallery?type=apps&category=featured)
  • Community forum(https://discuss.streamlit.io/)

0 人点赞