适应场景
后端开发使用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