磐创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组件是终端用户的前端,因此它不必担心索引部分。
- 管理员打开一个Jina Docker图片:
docker run -p 45678:45678 jinahub/app.example.wikipedia-sentences-30k:0.2.9-1.0.1
- 用户在Streamlit组件中输入查询(当前为文本输入或图像上传)并点击“搜索”
- 用JSON包装查询并发送到Jina的查询API
- 查询并以JSON格式返回结果(以及大量元数据)
- 组件解析出有用的信息(例如文本或图像匹配),并将它们显示给用户
示例代码
让我们看看我们的文本搜索示例,因为它更容易看到那里发生了什么:
代码语言: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/)