前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FastGPT二次开发-使用应用库进行代码Code Review

FastGPT二次开发-使用应用库进行代码Code Review

作者头像
zx钟
发布2024-01-26 19:52:45
7520
发布2024-01-26 19:52:45
举报
文章被收录于专栏:测试游记

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景!

背景

在之前使用Gitlab CI进行AI Code Review的时候发现一些痛点,这次为了解决这些问题故在FastGPT平台上进行二次开发

现有痛点

  1. 优化提示词后需要多个项目同步修改
  2. 收集使用反馈困难
  3. 改动较多时候评论太多,影响人工评审
  4. 重试不方便
  5. Review结果不佳

为了解决这些问题从两个角度出发

  1. 将Review任务放到平台上,发起合并请求的时候使用gitlab CI触发该任务(当前二次开发部分)
  2. 维护知识库,提高Review质量

FastGPT技术栈

NextJs + TS + ChakraUI + Mongo + Postgres (Vector 插件)

将项目下载到本地后对关键路径进行分析

  • fastgpt/projects/app/src/service: 存入mongo时的存储内容,相当于表设计
  • fastgpt/projects/app/src/web/core:接口使用
  • fastgpt/projects/app/src/pages:页面路由
  • fastgpt/projects/app/src/pages/api:API路由

功能设计

工程

每个工程都可以选择对应的应用或者提示词来进行代码评审

代码语言:javascript
复制
// projects/app/src/types/mongoSchema.d.ts
export interface ReviewSchema {
  _id: string;
  appName: string;
  projectId: string;
  prompt?: string;
  appId?: string;
  createTime: Date;
  lastUsedTime?: Date;
}

实现增删改查

增加/修改

代码语言:javascript
复制
// 增/改
const { appName, prompt, projectId, appId, _id } = req.body;
if (_id) {
  // 传入了_id则为修改
  response = await Review.updateOne({ _id }, { $set: { appName, prompt, appId, projectId } });
} else {
  // 否则为新增
  response = await Review.create({ appName, prompt, appId, projectId });
}

删除

代码语言:javascript
复制
const { id } = req.query;
await Review.deleteOne({ _id: id });

查看

代码语言:javascript
复制
const { appName, id } = req.query;
let response;
if (appName) {
  response = await Review.find({ appName });
} else if (id) {
  response = await Review.find({ _id: id });
} else {
  response = await Review.find();
}

任务

每次Review都是一次任务

代码语言:javascript
复制
// projects/app/src/types/mongoSchema.d.ts
export interface ReviewJobSchema {
  _id: string;
  reviewId: string; // 对应ReviewSchema的_id
  projectId: string; // 对应ReviewSchema的projectId
  mrId: string;
  createTime: Date;
}

查看任务

代码语言:javascript
复制
const { projectId } = req.query;
let response = await ReviewJob.find({ projectId }).sort({ createTime: -1 })

结果

每个任务中有多条结果记录

代码语言:javascript
复制
// projects/app/src/types/mongoSchema.d.ts
export interface ReviewResultSchema {
  _id: string;
  jobId: string; // 对应ReviewJobSchema的_id
  newPath?: string;
  newLine?: number;
  oldPath?: string;
  oldLine?: number;
  body: string;
  ref: GitlabDiffRef;
  effective?: string | null;
  createTime: Date;
}

查看结果

代码语言:javascript
复制
const { jobId } = req.query;
let response = await ReviewResult.find({ jobId }).sort({ createTime: -1 });

核心操作

功能实现采用的是【第2924期】如何在 Gitlab 中使用 ChatGPT 进行 CodeReview:https://mp.weixin.qq.com/s/Dyk1cYg63oOs13f9_gf9ug

另外需要打通使用应用库来进行CodeReview的操作

从官方文档可以看出,FastGPT使用API访问时,除域名外其他用法与直接使用Chatgpt一致,所以稍微修改一下原有的 chatgpt.ts 文件即可

这样就有两个执行文件了

代码语言:javascript
复制
import run1 from '@/utils/review/chatgpt';
import run2 from '@/utils/review/fastgpt';

执行任务的时候就是

  1. 根据传参查询指定工程
  2. 判断使用提示词还是应用
  3. 使用提示词则使用run1
  4. 使用的应用则使用run2

其中应用采用的是API访问,如果之前没有创建过,则新建一个,使用.lean()从数据库中拿到API Key来进行操作

代码语言:javascript
复制
let { projectId, mrId, target = /\.(js|jsx|ts|tsx|java)$/} = req.query
let response = await Review.find({ projectId });
let prompt = response[0].prompt;
let appId = response[0].appId;
// 创建review任务
let response1 = await ReviewJob.create({
  reviewId: response[0]._id,
  projectId,
  mrId
});
let jobId = response1._id;
if (appId) {
  // 当有appId时,使用fastgpt
  let res2;
  res2 = await MongoOpenApi.findOne({ appId }).lean();
  if (!res2?.apiKey) {
    let res1 = await MongoUser.findOne({ username: 'root' });
    let userId = res1?._id;
    const nanoid = customAlphabet(
      'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890',
      Math.floor(Math.random() * 14) + 24
    );
    let apiKey = `${global.systemEnv?.openapiPrefix || 'fastgpt'}-${nanoid()}`;
    await MongoOpenApi.create({
      userId,
      apiKey,
      appId,
      name: 'review',
      limit: {
        credit: -1
      }
    });
  }
  res2 = await MongoOpenApi.findOne({ appId }).lean();
  if (!res2?.apiKey) throw new Error('apiKey获取失败');
  run2({
    gitlabConfig: {
      host: 'https://gitlab.qunhequnhe.com',
      token: 'xxx',
      projectId,
      mrIId: mrId,
      target
    },
    fastgptConfig: {
      apikey: res2.apiKey,
      chatId: jobId
    },
    projectId,
    jobId
  });
} else {
  // 当没有appId时,使用chatgpt
  run1({
    gitlabConfig: {
      host: 'https://gitlab.qunhequnhe.com',
      token: 'xxx',
      projectId,
      mrIId: mrId,
      target
    },
    chatgptConfig: {
      model: 'gpt-3.5-turbo-16k',
      prompt,
      language: 'Chinese'
    },
    projectId,
    jobId
  });
}

接口

代码语言:javascript
复制
import { GET, POST, DELETE, PUT } from '@/web/common/api/request';
import { CreateReviewParams } from '@/types/review';

/**
 * 创建一个review工程任务
 */
export const createReviewItem = (data: CreateReviewParams) => POST<string>('/review/create', data);

/**
 * 获取review工程任务列表
 */
export const getReviewList = (appName: string | null, id: string | null) =>
  GET<any>(`/review/list?appName=${appName}&id=${id}`);

/**
 * 删除review工程任务
 */
export const delReviewItem = (_id: string) => DELETE<any>(`/review/del?id=${_id}`);

/**
 * 开始review工程任务
 * */
export const startReviewItem = (projectId: string, mrId: string, target: string) =>
  GET<any>(`/review/work?projectId=${projectId}&mrId=${mrId}&target=${target}`);

/**
 * 查询review结果
 * */
export const getReviewResult = (projectId: string | null, jobId: string | null) =>
  GET<any>(`/review/results?projectId=${projectId}&jobId=${jobId}`);

/**
 * 数据概览
 * */
export const getReviewOverview = () => GET<any>(`/review/overview`);

/**
 * 修改结果是否有效
 * */
export const setEvaluateReviewResult = (_id: string, effective: string) =>
  POST<any>(`/review/evaluateResult?_id=${_id}&effective=${effective}`);

/**
 * 通过jobId获取appId
 * */
export const getAppIdByJobId = (jobId: string) =>
  GET<any>(`/review/getAppIdByJobId?jobId=${jobId}`);

页面部分

页面部分代码略,展示样式

工程新建/编辑

新建

编辑

工程展示

展示

结果展示

结果展示

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试游记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
    • 现有痛点
    • FastGPT技术栈
    • 功能设计
      • 工程
        • 任务
          • 结果
            • 核心操作
              • 接口
                • 页面部分
                  • 工程新建/编辑
                  • 工程展示
                  • 结果展示
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档