服务端grpc框架
server-grpc
etc yaml配置及
internal 内部代码包config yaml配置解析代码包
logic 逻辑实现包
server 服务连接处理
svc 上下文配置信息proto proto文件
go.mod model
go.sum
main.go 主函数入口
逻辑代码处理
目前该应用的逻辑只有机器人对话功能,在服务端是通过grpc服务进行数据传输,这里前提是在main函数中需要启动grpc服务,设置proto数据类型。在logic层初始化服务上下文信息,日治配置大模型配置等。
func NewChatbotLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ChatbotLogic {llm, err := chain.New(chain.WithToken(svcCtx.Config.OpenaiClient.Token), chain.WithModel(svcCtx.Config.OpenaiClient.Model), chain.WithBaseURL(svcCtx.Config.OpenaiClient.BaseURL))if err != nil {logx.Errorf("large model import error: %v", err)return nil}return &ChatbotLogic{Logger: logx.WithContext(ctx),ctx: ctx,svcCtx: svcCtx,model: llm,}
}
在对话逻辑中,设置历史信息的上限,设置对话者角色,从客户端获取用户对话信息。通过langchain框架传递给大模型返回信息,最后将得到最准确的信息返回给用户。
// 对话逻辑
func (c *ChatbotLogic) Chat(req *pb.ChatRequest) (*pb.ChatResponse, error) {//chat role and partmessage := make([]llms.MessageContent, 10)var index int = 0if index == 9 {index = 0}//create role instancemessage[index].Role = "human"//create text instancetext := llms.TextContent{Text: req.UserInput}message[index].Parts = []llms.ContentPart{text}//input sessionrespose, err := c.model.GenerateContent(c.ctx, message)if err != nil {logx.Errorf("Session error: %v", err)return nil, err}jsonRespponse, err := json.Marshal(respose)if err != nil {logx.Errorf("struct parse error: %v", err)result := respose.Choices[0].Contentreturn &pb.ChatResponse{BotResponse: result,}, err}jsonRes := string(jsonRespponse)return &pb.ChatResponse{BotResponse: jsonRes,}, nil
}
下一期敬请期待。