redis缓存替换+pgvector向量替换

This commit is contained in:
1iaan
2026-04-04 22:39:16 +08:00
parent e993eb6c5c
commit 9d7c416737
124 changed files with 5460 additions and 141 deletions

View File

@@ -0,0 +1,23 @@
package ai_chat_service
import (
"ai-chat-backend/pkg/config"
grpc_client "ai-chat-backend/services/grpc-client"
"sync"
)
var pool grpc_client.ClientPool
var once sync.Once
type client struct {
grpc_client.DefaultClient
}
func GetAiChatServiceClientPool() grpc_client.ClientPool {
once.Do(func() {
cnf := config.GetConfig()
c := &client{}
pool = c.GetPool(cnf.DependOn.AiChatService.Address)
})
return pool
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,72 @@
syntax = "proto3";
option go_package = "ai-chat-service/proto";
package ai_chat_service.zvoice.com;
message ChatCompletionRequest {
string message = 1[json_name = "message"];
string id = 2[json_name = "id"];
string pid = 3[json_name = "p_id"];
bool enableContext = 4[json_name = "enable_context"];
ChatParam chatParam = 5[json_name = "chat_param"];
}
message ChatParam {
string model = 1[json_name = "model"];
int32 maxTokens = 2[json_name = "max_tokens"];
float temperature = 3[json_name = "temperature"];
float topP = 4[json_name = "top_p"];
float presencePenalty = 5[json_name = "presence_penalty"];
float frequencyPenalty = 6[json_name = "frequency_penalty"];
string botDesc =7[json_name = "bot_desc"];
int32 minResponseTokens = 8[json_name = "min_response_tokens"];
int32 contextTTL = 9[json_name = "context_ttl"];
int32 contextLen = 10[json_name = "context_len"];
}
// 服务响应消息,非流式响应
message ChatCompletionResponse {
string id = 1 [json_name = "id"];
string object = 2 [json_name = "object"];
int64 created = 3 [json_name = "created"];
string model = 4 [json_name = "model"];
repeated ChatCompletionChoice choices = 5 [json_name = "choices"];
Usage usage = 6[json_name = "usage"];
}
message ChatCompletionChoice {
int32 index = 1[json_name = "index"];
ChatCompletionMessage message = 2 [json_name = "message"];
string finishReason = 3[json_name = "finish_reason"];
}
message ChatCompletionMessage {
string role=1[json_name = "role"];
string content=2[json_name = "content"];
string name=3[json_name = "name"];
}
message Usage {
int32 promptTokens = 1 [json_name = "prompt_tokens"];
int32 completionTokens =2 [json_name = "completion_tokens"];
int32 totalTokens = 3 [json_name = "total_tokens"];
}
// 服务响应消息,流式响应
message ChatCompletionStreamResponse {
string id = 1 [json_name = "id"];
string object = 2 [json_name = "object"];
int64 created = 3 [json_name = "created"];
string model = 4 [json_name = "model"];
repeated ChatCompletionStreamChoice choices = 5 [json_name = "choices"];
}
message ChatCompletionStreamChoice {
int32 index = 1[json_name = "index"];
ChatCompletionStreamChoiceDelta delta =2 [json_name = "delta"];
string finishReason = 3[json_name="finish_reason"];
}
message ChatCompletionStreamChoiceDelta {
string content = 1 [json_name = "content"];
string role = 2 [json_name = "role"];
}
service Chat {
rpc ChatCompletion(ChatCompletionRequest) returns (ChatCompletionResponse);
rpc ChatCompletionStream(ChatCompletionRequest) returns (stream ChatCompletionStreamResponse);
}

View File

@@ -0,0 +1,169 @@
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.2.0
// - protoc v4.22.0
// source: proto/chat.proto
package proto
import (
context "context"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
)
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7
// ChatClient is the client API for Chat service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
type ChatClient interface {
ChatCompletion(ctx context.Context, in *ChatCompletionRequest, opts ...grpc.CallOption) (*ChatCompletionResponse, error)
ChatCompletionStream(ctx context.Context, in *ChatCompletionRequest, opts ...grpc.CallOption) (Chat_ChatCompletionStreamClient, error)
}
type chatClient struct {
cc grpc.ClientConnInterface
}
func NewChatClient(cc grpc.ClientConnInterface) ChatClient {
return &chatClient{cc}
}
func (c *chatClient) ChatCompletion(ctx context.Context, in *ChatCompletionRequest, opts ...grpc.CallOption) (*ChatCompletionResponse, error) {
out := new(ChatCompletionResponse)
err := c.cc.Invoke(ctx, "/ai_chat_service.zvoice.com.Chat/ChatCompletion", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *chatClient) ChatCompletionStream(ctx context.Context, in *ChatCompletionRequest, opts ...grpc.CallOption) (Chat_ChatCompletionStreamClient, error) {
stream, err := c.cc.NewStream(ctx, &Chat_ServiceDesc.Streams[0], "/ai_chat_service.zvoice.com.Chat/ChatCompletionStream", opts...)
if err != nil {
return nil, err
}
x := &chatChatCompletionStreamClient{stream}
if err := x.ClientStream.SendMsg(in); err != nil {
return nil, err
}
if err := x.ClientStream.CloseSend(); err != nil {
return nil, err
}
return x, nil
}
type Chat_ChatCompletionStreamClient interface {
Recv() (*ChatCompletionStreamResponse, error)
grpc.ClientStream
}
type chatChatCompletionStreamClient struct {
grpc.ClientStream
}
func (x *chatChatCompletionStreamClient) Recv() (*ChatCompletionStreamResponse, error) {
m := new(ChatCompletionStreamResponse)
if err := x.ClientStream.RecvMsg(m); err != nil {
return nil, err
}
return m, nil
}
// ChatServer is the server API for Chat service.
// All implementations must embed UnimplementedChatServer
// for forward compatibility
type ChatServer interface {
ChatCompletion(context.Context, *ChatCompletionRequest) (*ChatCompletionResponse, error)
ChatCompletionStream(*ChatCompletionRequest, Chat_ChatCompletionStreamServer) error
mustEmbedUnimplementedChatServer()
}
// UnimplementedChatServer must be embedded to have forward compatible implementations.
type UnimplementedChatServer struct {
}
func (UnimplementedChatServer) ChatCompletion(context.Context, *ChatCompletionRequest) (*ChatCompletionResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method ChatCompletion not implemented")
}
func (UnimplementedChatServer) ChatCompletionStream(*ChatCompletionRequest, Chat_ChatCompletionStreamServer) error {
return status.Errorf(codes.Unimplemented, "method ChatCompletionStream not implemented")
}
func (UnimplementedChatServer) mustEmbedUnimplementedChatServer() {}
// UnsafeChatServer may be embedded to opt out of forward compatibility for this service.
// Use of this interface is not recommended, as added methods to ChatServer will
// result in compilation errors.
type UnsafeChatServer interface {
mustEmbedUnimplementedChatServer()
}
func RegisterChatServer(s grpc.ServiceRegistrar, srv ChatServer) {
s.RegisterService(&Chat_ServiceDesc, srv)
}
func _Chat_ChatCompletion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ChatCompletionRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(ChatServer).ChatCompletion(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/ai_chat_service.zvoice.com.Chat/ChatCompletion",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ChatServer).ChatCompletion(ctx, req.(*ChatCompletionRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Chat_ChatCompletionStream_Handler(srv interface{}, stream grpc.ServerStream) error {
m := new(ChatCompletionRequest)
if err := stream.RecvMsg(m); err != nil {
return err
}
return srv.(ChatServer).ChatCompletionStream(m, &chatChatCompletionStreamServer{stream})
}
type Chat_ChatCompletionStreamServer interface {
Send(*ChatCompletionStreamResponse) error
grpc.ServerStream
}
type chatChatCompletionStreamServer struct {
grpc.ServerStream
}
func (x *chatChatCompletionStreamServer) Send(m *ChatCompletionStreamResponse) error {
return x.ServerStream.SendMsg(m)
}
// Chat_ServiceDesc is the grpc.ServiceDesc for Chat service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
var Chat_ServiceDesc = grpc.ServiceDesc{
ServiceName: "ai_chat_service.zvoice.com.Chat",
HandlerType: (*ChatServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "ChatCompletion",
Handler: _Chat_ChatCompletion_Handler,
},
},
Streams: []grpc.StreamDesc{
{
StreamName: "ChatCompletionStream",
Handler: _Chat_ChatCompletionStream_Handler,
ServerStreams: true,
},
},
Metadata: "proto/chat.proto",
}

View File

@@ -0,0 +1,28 @@
package grpc_client
import (
"ai-chat-backend/pkg/log"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
type ServiceClient interface {
GetPool(addr string) ClientPool
}
type DefaultClient struct {
}
func (c *DefaultClient) GetPool(addr string) ClientPool {
pool, err := NewPool(addr, c.getOptions()...)
if err != nil {
log.Error(err)
return nil
}
return pool
}
func (c *DefaultClient) getOptions() []grpc.DialOption {
opts := make([]grpc.DialOption, 0)
opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials()))
return opts
}

View File

@@ -0,0 +1,48 @@
package grpc_client
import (
"ai-chat-backend/pkg/log"
"google.golang.org/grpc"
"google.golang.org/grpc/connectivity"
"sync"
)
type ClientPool interface {
Get() *grpc.ClientConn
Put(*grpc.ClientConn)
}
type clientPool struct {
pool sync.Pool
}
func NewPool(target string, opts ...grpc.DialOption) (ClientPool, error) {
return &clientPool{
pool: sync.Pool{
New: func() any {
conn, err := grpc.NewClient(target, opts...)
if err != nil {
log.Error(err)
return nil
}
return conn
},
},
}, nil
}
func (c *clientPool) Get() *grpc.ClientConn {
conn := c.pool.Get().(*grpc.ClientConn)
if conn.GetState() == connectivity.Shutdown || conn.GetState() == connectivity.TransientFailure {
conn.Close()
conn = c.pool.New().(*grpc.ClientConn)
}
return conn
}
func (c *clientPool) Put(conn *grpc.ClientConn) {
if conn.GetState() == connectivity.Shutdown || conn.GetState() == connectivity.TransientFailure {
conn.Close()
return
}
c.pool.Put(conn)
}

View File

@@ -0,0 +1,11 @@
package services
import (
"context"
"google.golang.org/grpc/metadata"
)
func AppendBearerTokenToContext(ctx context.Context, accessToken string) context.Context {
md := metadata.Pairs("Authorization", "Bearer "+accessToken)
return metadata.NewOutgoingContext(ctx, md)
}