Jina 轻松学 —— 三个基本元素
“ Document、Executor、Flow是Jina中的三个基本元素”
📄 Document —— Jina中的基本数据类型
⚙️ Executor —— Jina处理Document的基本单元
🔀 Flow —— 将Executor组合后得到的Jina搜索框架
本期教程将带来关于Document、Executor、Flow的简单使用介绍,让你快速熟悉Jina的工作原理!
⭐️ Document是Jina中的基本数据类型,可以是文字、图片、视频、音频、图像或3D mesh文件。
⭐️ DocumentArray由 Document的序列组成,也是Executor的直接处理对象,即Executor的输入和输出。
⭐️ Document相当于Jina中的np.float,而DocumentArray相当于Jina中的np.ndarray 。
Document
d = Document()
Document的文本属性一个Document 只可以拥有一种类型的文本属性。非常方便的是,当使用Document.content构造文本属性时,输入内容将自动归类为text,buffer,blob或uri中的一种。Document还有元数据、层次关系、相关性等其他类别的属性。
DocumentArray
# from list
da1 = DocumentArray([Document(), Document()])
# from generator
da2 = DocumentArray((Document() for _ in range(10)))
# from another `DocumentArray`
da3 = DocumentArray(da2)
DocumentArray的元素匹配
DocumentArray.match可以在两个DocumentArray对象之间找到最接近的Document(要求每个Document有相同长度的embedding)
Executor
Executor是Jina中处理Document的基本单元,可以实现非常丰富多样的功能,包括数据预处理、多模态数据向量化、数据索引……并且支持Tensorflow, Pytorch, Pytorch Lightning, Fastai, Mindspore, PaddlePaddle, Scikit-learn等多种机器学习框架。
Executor的创建
Python代码
from jina import Executor, Flow, Document, requests
class MyExecutor(Executor):
@requests
def foo(self, **kwargs):
print(kwargs)
f = Flow().add(uses=MyExecutor)
with f:
f.post(on='/random_work', inputs=Document(), on_done=print)
Yaml文件+Python代码
创建my.yml
jtype: MyExecutor
metas:
py_modules:
- foo.py
name: awesomeness
description: my first awesome executor
requests:
/random_work: foo
使用Yaml创建Executor
from jina import Flow, Document
f = Flow().add(uses='my.yml')
with f:
f.post(on='/random_work', inputs=Document(), on_done=print)
服务端和客户端一起创建
from jina import Executor, Flow, Document, requests
class MyExecutor(Executor):
@requests
def foo(self, **kwargs):
print(kwargs)
f = Flow().add(uses=MyExecutor)
with f:
f.post(on='/random_work', inputs=Document(), on_done=print)
服务端和客户端单独创建 服务端
from jina import Flow, Executor, requests
class MyExecutor(Executor):
@requests(on='/bar')
def foo(self, docs, **kwargs):
print(docs)
f = Flow(port_expose=12345).add(name='myexec1', uses=MyExecutor)
with f:
f.block()
客户端
from jina import Client, Document
c = Client(port_expose=12345)
c.post(on='/bar', inputs=Document(), on_done=print)
下面的9个tips可以帮你写出更简洁、更高效的Jina代码:
一行代码导入各Jina模块
使用 Python generator 作为Flow 的输入
使用request_size来决定每个请求中包含多少个Document
构造Executor时 __init__ 可省略
使用@request修饰函数时若没有指定on=参数,则此函数会响应所有的request
非必需的参数放在 **kwargs中
对Executor进行debug时 ,只需创建一个Executor实例并调用其功能即可
如果向Flow发送的请求中不包含Document ,则只需向Flow发送parameters
使用append将chunks添加到Document中,而不要在创建Document时写入chunks
👇 往期精彩
Jina·拥抱社区!即刻申请,丰富周边送上门
Jina 2.0 快速入门指"北"