使用jina构建人工智能服务(python),后端使用go-client进行访问获取数据

该示例展示了一个使用Go作为后端语言,通过Jina框架与Python服务端交互来获取AI应用接口,特别是进行语义分析和计算文本相似度的流程。服务端使用Python实现JinaExecutor,客户端使用Go发送请求并处理响应。
摘要由CSDN通过智能技术生成

适应场景

后端开发使用go,为了获取AI应用接口,采用Jina框架,服务端使用python

实现

server.py

# 这是一个demo,用来测试jina和语义分析工具similarity的

from jina import DocumentArray, Document, Executor, Flow, requests
from similarities import Similarity


class check(Executor):
    @requests
    async def add_text(self, docs: DocumentArray, **kwargs):
        print("checkSimilarity service is been called")
        m = Similarity()
        print(docs[0].text, docs[1].text)

        r = m.similarity(docs[0].text, docs[1].text)
        t = str(r.numpy()[0][0]) #r返回时是torch.tensor([[float]])形式, 需要转换为str传给text
      
        resp = DocumentArray([Document(text=t)])
        print("score:",t)
       
        return resp

f = Flow(port=12345).add(uses=check, replicas=1) # replicas是指节点实例数

if __name__ == '__main__':
    with f:
        f.block()

注意:服务端里不能省略if __name__ == '__main__':,否则会报错

client.go

package main

import (
	"flag"
	"fmt"
	"github.com/jina-ai/client-go"
	"github.com/jina-ai/client-go/docarray"
	"github.com/jina-ai/client-go/jina"
)

// Create a Document
func getDoc(sentence string) *docarray.DocumentProto {
	return &docarray.DocumentProto{
		Content: &docarray.DocumentProto_Text{
			Text: sentence,
		},
	}
}

// Create a DocumentArray with 3 Documents
func getDocarrays(s1, s2 string) *docarray.DocumentArrayProto {
	var docs []*docarray.DocumentProto
	docs = append(docs, getDoc(s1))
	docs = append(docs, getDoc(s2))

	return &docarray.DocumentArrayProto{
		Docs: docs,
	}
}

// Create DataRequest with a DocumentArray
func getDataRequest(s1, s2 string) *jina.DataRequestProto {
	return &jina.DataRequestProto{
		Data: &jina.DataRequestProto_DataContentProto{
			Documents: &jina.DataRequestProto_DataContentProto_Docs{
				Docs: getDocarrays(s1, s2),
			},
		},
	}
}

// Generate a stream of requests
func generateDataRequests(s1, s2 string) <-chan *jina.DataRequestProto {
	requests := make(chan *jina.DataRequestProto)
	go func() {
		requests <- getDataRequest(s1, s2)
		defer close(requests)
	}()
	return requests
}

func OnDone(resp *jina.DataRequestProto) {

	fmt.Println("resp.Data:", resp.GetData().GetDocs().Docs[0].GetText()) //注意返回的数据是array,所以用了Docs[0]

	fmt.Println("服务调用成功!:")
}

func OnError(resp *jina.DataRequestProto) {
	fmt.Println("Got an error for request", resp)
}

func main() {
	host := flag.String("host", "", "host of the gateway")
	flag.Parse()

	if *host == "" {
		panic("Please pass a host to check the health of")
	}

	s1 := "我认为你很优秀"
	s2 := "我不得不承认你很优秀"
	GRPCClient, err := client.NewGRPCClient(*host)
	if err != nil {
		panic(err)
	}
	request := generateDataRequests(s1, s2)
	GRPCClient.POST(request, OnDone, OnError, nil)

}

注意:在客户端里,返回的数据通过方法onDone来处理的,onDone的入参就是resp。要获取返回的数据,使用下面形式的语句resp.GetData().GetDocs().Docs[0].GetText()

运行效果

运行服务端python server.py
效果:

────────────────────────────────────────────── 🎉 Flow is ready to serve! ──────────────────────────────────────────────
╭────────────── 🔗 Endpoint ───────────────╮
│  ⛓     Protocol                    GRPC  │
│  🏠       Local         127.0.0.1:12345  │
│  🔒     Private      172.17.29.48:12345  │
│  🌍      Public   221.234.130.148:12345  │
╰──────────────────────────────────────────╯

运行客户端go run client.go --host grpc://localhost:12345
效果

resp.Data: 0.8622679
服务调用成功!:

────────────────────────────────────────────── 🎉 Flow is ready to serve! ──────────────────────────────────────────────
╭────────────── 🔗 Endpoint ───────────────╮
│  ⛓     Protocol                    GRPC  │
│  🏠       Local         127.0.0.1:12345  │
│  🔒     Private      172.17.29.48:12345  │
│  🌍      Public   221.234.130.148:12345  │
╰──────────────────────────────────────────╯
checkSimilarity service is been called
2023-02-13 09:53:19.069 | DEBUG    | text2vec.sentence_model:__init__:74 - Use device: cpu
我认为你很优秀 我不得不承认你很优秀
score: 0.8622679
Jina是一个开源的流数据引擎,可以帮助您对大规模文本数据进行无监督的语料标注。以下是使用Jina进行无监督语料标注的简要步骤: 1. 准备您的数据集 首先,您需要准备一个包含大量文本数据的数据集。这个数据集可以是您自己的数据集,或者是公开可用的数据集,例如维基百科。 2. 安装Jina 安装Jina非常简单,您可以使用pip命令进行安装: ``` pip install jina ``` 3. 创建一个Flow 在Jina中,Flow是一个用于构建分布式流水线的对象。要创建一个Flow,您需要定义一些Executor,并将它们组合在一起。 在这里,我们将使用Jina内置的TextEncoder和ChunkToDoc Executor。TextEncoder用于将文本数据编码为向量表示,而ChunkToDoc将编码后的数据组合成文档。 以下是一个简单的Flow示例: ```python from jina.flow import Flow from jina.executors.encoders.nlp import TextEncoder from jina.executors.metas import get_default_metas metas = get_default_metas() metas['workspace'] = 'my-workspace' encoder = TextEncoder(metas=metas) chunk_to_doc = ChunkToDoc(metas=metas) flow = Flow().add(encoder).add(chunk_to_doc) ``` 4. 运行Flow 现在,我们已经创建了一个Flow,接下来需要将数据传递给Flow并运行它。在这里,我们将使用一个简单的Python列表来模拟我们的数据集。 ```python data = ['This is the first document.', 'This is the second document.'] with flow: flow.index(data, batch_size=2) ``` 在运行此代码后,Jina将处理我们的数据集,并将其编码为向量表示。这些向量表示将被存储在Jina内置的索引中,以便以后进行检索。 5. 检索数据 一旦我们的数据被编码和索引,我们就可以使用Jina进行检索。以下是一个简单的示例: ```python query = 'This is a query.' with flow: response = flow.search(query, return_results=True) for result in response[0].data.docs: print(result.text) ``` 在这里,我们将查询传递给Flow,Jina将返回与查询最相关的文档。在此示例中,我们只打印了检索到的文档的文本内容,但您可以根据需要对其进行其他操作。 这就是使用Jina进行无监督语料标注的基本步骤。当然,这只是一个简单的示例,您可以根据自己的需求对Flow进行更复杂的配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值