10.4 k Star!連續 3 天 Github 熱榜前三的神經搜尋框架

語言: CN / TW / HK

【導語】:雲原生的神經搜尋框架。

簡介

Jina 是一個神經搜尋框架,簡單快速,可以在幾分鐘內構建 SOTA 和可擴充套件的深度學習搜尋應用程式。

  • 支援幾乎所有的資料型別-支援對任何型別的非結構化資料進行大規模索引和查詢,比如影片、圖片、文字、音樂、原始碼、PDF等。
  • 快速和雲原生-分散式架構,具有可擴充套件性,支援雲原生、容器化、並行、分片、非同步排程、HTTP/gRPC/WebSocket 協議。
  • 高效快速-幾分鐘內就可以構建一個深度學習搜尋系統。

專案地址:

https://github.com/jina-ai/jina

安裝

  • 通過 PyPI 安裝:
pip install jina
  • 通過 Conda 安裝:
conda install jina -c conda-forge
  • 通過 Docker 安裝:
docker run jinaai/jina:latest

官方例子

圖片搜尋

構建命令:

jina hello fashion

這個過程會下載 Fashion-MNIST 訓練和測試資料集,並訓練集中索引 60,000 張影象。然後從測試集中隨機抽取影象作為查詢,整個過程大約需要1分鐘。

聊天機器人

構建命令:

pip install "jina[demo]"
jina hello chatbot

這會下載 CovidQA 資料集並告訴 Jina 使用 MPNet 索引 418 個問答集。索引過程在 CPU 上大約需要 1 分鐘。然後它會開啟一個網頁,可以在其中輸入問題並詢問 Jina。

構建

Document、Executor 和 Flow 是 Jina 中的三個基本概念。利用這三個元件,就可以構建一個應用程式。

  • :page_facing_up: Document 是 Jina 中的基本資料型別;
  • ⚙️ Executor 是 Jina 處理 Documents 的方式;
  • :twisted_rightwards_arrows: Flow 是 Jina 精簡和分配 Executor 的方式。

1. 複製以下最小示例並執行

import numpy as np
from jina import Document, DocumentArray, Executor, Flow, requests

class CharEmbed(Executor):  # a simple character embedding with mean-pooling
    offset = 32  # letter `a`
    dim = 127 - offset + 1  # last pos reserved for `UNK`
    char_embd = np.eye(dim) * 1  # one-hot embedding for all chars

    @requests
    def foo(self, docs: DocumentArray, **kwargs):
        for d in docs:
            r_emb = [ord(c) - self.offset if self.offset <= ord(c) <= 127 else (self.dim - 1) for c in d.text]
            d.embedding = self.char_embd[r_emb, :].mean(axis=0)  # average pooling

class Indexer(Executor):
    _docs = DocumentArray()  # for storing all documents in memory

    @requests(on='/index')
    def foo(self, docs: DocumentArray, **kwargs):
        self._docs.extend(docs)  # extend stored `docs`

    @requests(on='/search')
    def bar(self, docs: DocumentArray, **kwargs):
         docs.match(self._docs, metric='euclidean')

f = Flow(port_expose=12345, protocol='http', cors=True).add(uses=CharEmbed, parallel=2).add(uses=Indexer)  # build a Flow, with 2 parallel CharEmbed, tho unnecessary
with f:
    f.post('/index', (Document(text=t.strip()) for t in open(__file__) if t.strip()))  # index all lines of _this_ file
    f.block()  # block for listening request

2. 在瀏覽器中開啟( http://localhost:12345/docs ),點選 /search 並輸入以下文字,點選 Execute 按鈕:

{"data": [{"text": "@requests(on=something)"}]}

3. 不喜歡 GUI 也可以使用 Python 命令列來做。保持步驟 1 的服務執行,通過 Python 建立客戶端:

from jina import Client, Document
from jina.types.request import Response


def print_matches(resp: Response):  # the callback function invoked when task is done
    for idx, d in enumerate(resp.docs[0].matches[:3]):  # print top-3 matches
        print(f'[{idx}]{d.scores["euclidean"].value:2f}: "{d.text}"')


c = Client(protocol='http', port=12345)  # connect to localhost:12345
c.post('/search', Document(text='request(on=something)'), on_done=print_matches)

列印如下結果:

[email protected][S]:connected to the gateway at localhost:12345!
[0]0.168526: "@requests(on='/index')"
[1]0.181676: "@requests(on='/search')"
[2]0.218218: "from jina import Document, DocumentArray, Executor, Flow, requests"

開源前哨 日常分享熱門、有趣和實用的開源專案。參與維護 10萬+ Star 的開源技術資源庫,包括:Python、Java、C/C++、Go、JS、CSS、Node.js、PHP、.NET 等。