"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > बेहतर - एक एआई संचालित कोड समीक्षक गिटहब एक्शन

बेहतर - एक एआई संचालित कोड समीक्षक गिटहब एक्शन

2024-11-08 को प्रकाशित
ब्राउज़ करें:212

किसी मानक को बनाए रखने और किसी प्रोजेक्ट में कोड की सर्वोत्तम प्रथाओं पर जोर देने में कोड समीक्षाएं हमेशा महत्वपूर्ण रही हैं। यह पोस्ट इस बारे में नहीं है कि डेवलपर्स को कोड की समीक्षा कैसे करनी चाहिए, यह इसके एक हिस्से को एआई को सौंपने के बारे में है।

जैसा कि माइकल लिंच ने अपनी पोस्ट में उल्लेख किया है - "एक इंसान की तरह कोड समीक्षा कैसे करें" - हमें कंप्यूटर को कोड समीक्षा के उबाऊ हिस्सों का ध्यान रखने देना चाहिए। जबकि माइकल एक फ़ॉर्मेटिंग टूल पर ज़ोर देता है, मैं इसे एक कदम आगे ले जाना चाहता हूँ और कृत्रिम बुद्धिमत्ता को इसका पता लगाने देना चाहता हूँ। मेरा मतलब है, उद्योग में एआई बूम का लाभ क्यों न उठाया जाए?

अब मैं यह नहीं कह रहा हूं कि फ़ॉर्मेटिंग टूल और लिंटर के स्थान पर एआई का उपयोग किया जाना चाहिए। इसके बजाय, इसका उपयोग उन तुच्छ चीज़ों को पकड़ने के लिए किया जाना चाहिए जो मानव से छूट सकती हैं।

इसलिए मैंने एक जीथब एक्शन बनाने का फैसला किया, जो कोड पुल अनुरोध अंतर की समीक्षा करता है और एआई का उपयोग करके सुझाव उत्पन्न करता है। आइए मैं आपको इसके बारे में बताता हूं।

? टिप्पणी

  • यह GitHub कार्रवाई अब GitHub बाज़ार में उपलब्ध है।
  • यह एक जावास्क्रिप्ट क्रिया है - जावास्क्रिप्ट जीथब क्रियाएं बनाने के बारे में और जानें।

अंतर प्राप्त करना

जीथब एपीआई के साथ इंटरैक्ट करने के लिए, मैंने ऑक्टोकिट का उपयोग किया है, जो कि मुहावरेदार तरीके से जीथब एपीआई के साथ इंटरैक्ट करने के लिए एक एसडीके या क्लाइंट लाइब्रेरी की तरह है।

पुल अनुरोध का अंतर बढ़ाने के लिए, आपको आवश्यक पैरामीटर के साथ एप्लिकेशन/vnd.github.diff मान के साथ एक्सेप्ट हेडर पास करना होगा।

async function getPullRequestDetails(octokit, { mode }) {
    let AcceptFormat = "application/vnd.github.raw json";

    if (mode === "diff") AcceptFormat = "application/vnd.github.diff";
    if (mode === "json") AcceptFormat = "application/vnd.github.raw json";

    return await octokit.rest.pulls.get({
        owner: github.context.repo.owner,
        repo: github.context.repo.repo,
        pull_number: github.context.payload.pull_request.number,
        headers: {
            accept: AcceptFormat,
        },
    });
}

यदि आप जीथब एक्शन से बिल्कुल भी परिचित नहीं हैं, तो यहां विक्टोरिया लो द्वारा जीथब एक्शन 101 श्रृंखला है और यह एक अच्छी शुरुआत है।

एक बार जब मुझे अंतर मिल जाता है, तो मैं इसे पार्स करता हूं और अवांछित परिवर्तन हटा देता हूं, और फिर इसे नीचे दिखाए गए स्कीमा में वापस कर देता हूं:

/** using zod */
schema = z.object({
    path: z.string(),
    position: z.number(),
    line: z.number(),
    change: z.object({
        type: z.string(),
        add: z.boolean(),
        ln: z.number(),
        content: z.string(),
        relativePosition: z.number(),
    }),
    previously: z.string().optional(),
    suggestions: z.string().optional(),
})

फ़ाइलों को अनदेखा करना

फ़ाइलों को अनदेखा करना काफी सरल है। उपयोगकर्ता इनपुट सूची के लिए ग्लोब पैटर्न की अर्धविराम से अलग की गई स्ट्रिंग की आवश्यकता होती है। फिर इसे पार्स किया जाता है, अनदेखा की गई फ़ाइलों की डिफ़ॉल्ट सूची के साथ जोड़ा जाता है और डी-डुप्लिकेट किया जाता है।

**/*.md; **/*.env; **/*.lock;
const filesToIgnoreList = [
    ...new Set(
        filesToIgnore
            .split(";")
            .map(file => file.trim())
            .filter(file => file !== "")
            .concat(FILES_IGNORED_BY_DEFAULT)
    ),
];

उपेक्षित फ़ाइलों की सूची का उपयोग उन भिन्न परिवर्तनों को हटाने के लिए किया जाता है जो उन उपेक्षित फ़ाइलों को संदर्भित करते हैं। यह आपको एक कच्चा पेलोड देता है जिसमें केवल वे परिवर्तन होते हैं जो आप चाहते हैं।

सुझाव उत्पन्न करना

अंतर को पार्स करने के बाद एक बार जब मुझे कच्चा पेलोड मिल जाता है, तो मैं इसे प्लेटफ़ॉर्म एपीआई को भेज देता हूं। यहां OpenAI API का कार्यान्वयन है।

async function useOpenAI({ rawComments, openAI, rules, modelName, pullRequestContext }) {
    const result = await openAI.beta.chat.completions.parse({
        model: getModelName(modelName, "openai"),
        messages: [
            {
                role: "system",
                content: COMMON_SYSTEM_PROMPT,
            },
            {
                role: "user",
                content: getUserPrompt(rules, rawComments, pullRequestContext),
            },
        ],
        response_format: zodResponseFormat(diffPayloadSchema, "json_diff_response"),
    });

    const { message } = result.choices[0];

    if (message.refusal) {
        throw new Error(`the model refused to generate suggestions - ${message.refusal}`);
    }

    return message.parsed;
}

आप एपीआई कार्यान्वयन में प्रतिक्रिया प्रारूप का उपयोग देख सकते हैं। यह कई एलएलएम प्लेटफार्मों द्वारा प्रदान की गई एक सुविधा है, जो आपको मॉडल को एक विशिष्ट स्कीमा/प्रारूप में प्रतिक्रिया उत्पन्न करने के लिए कहने की अनुमति देती है। यह इस मामले में विशेष रूप से सहायक है क्योंकि मैं नहीं चाहता कि मॉडल मतिभ्रम करे और पुल अनुरोध में गलत फ़ाइलों या स्थितियों के लिए सुझाव उत्पन्न करे, या प्रतिक्रिया पेलोड में नई संपत्तियाँ जोड़े।

सिस्टम प्रॉम्प्ट मॉडल को इस बारे में अधिक संदर्भ देने के लिए है कि उसे कोड की समीक्षा कैसे करनी चाहिए और किन बातों को ध्यान में रखना चाहिए। आप सिस्टम प्रॉम्प्ट यहां github.com/murtuzaalisurti/better देख सकते हैं।

उपयोगकर्ता संकेत में वास्तविक अंतर, नियम और पुल अनुरोध का संदर्भ शामिल है। यह वही है जो कोड समीक्षा को शुरू करता है।

यह जीथब एक्शन ओपनएआई और एंथ्रोपिक दोनों मॉडलों का समर्थन करता है। यहां बताया गया है कि यह एंथ्रोपिक एपीआई को कैसे लागू करता है:

async function useAnthropic({ rawComments, anthropic, rules, modelName, pullRequestContext }) {
    const { definitions } = zodToJsonSchema(diffPayloadSchema, "diffPayloadSchema");
    const result = await anthropic.messages.create({
        max_tokens: 8192,
        model: getModelName(modelName, "anthropic"),
        system: COMMON_SYSTEM_PROMPT,
        tools: [
            {
                name: "structuredOutput",
                description: "Structured Output",
                input_schema: definitions["diffPayloadSchema"],
            },
        ],
        tool_choice: {
            type: "tool",
            name: "structuredOutput",
        },
        messages: [
            {
                role: "user",
                content: getUserPrompt(rules, rawComments, pullRequestContext),
            },
        ],
    });

    let parsed = null;
    for (const block of result.content) {
        if (block.type === "tool_use") {
            parsed = block.input;
            break;
        }
    }

    return parsed;
}

टिप्पणियाँ जोड़ना

अंत में, सुझावों को पुनः प्राप्त करने के बाद, मैं उन्हें साफ करता हूं और समीक्षा के एक भाग के रूप में टिप्पणियां जोड़ने के लिए उन्हें जीथब एपीआई में भेजता हूं।

मैंने टिप्पणियाँ जोड़ने के लिए नीचे दिया गया तरीका चुना क्योंकि एक नई समीक्षा बनाकर, आप एक समय में एक ही टिप्पणी जोड़ने के बजाय एक ही बार में सभी टिप्पणियाँ जोड़ सकते हैं। एक-एक करके टिप्पणियाँ जोड़ने से भी दर सीमित हो सकती है क्योंकि टिप्पणियाँ जोड़ने से सूचनाएं ट्रिगर होती हैं और आप उपयोगकर्ताओं को सूचनाओं के साथ स्पैम नहीं करना चाहते हैं।

function filterPositionsNotPresentInRawPayload(rawComments, comments) {
    return comments.filter(comment =>
        rawComments.some(rawComment => rawComment.path === comment.path && rawComment.line === comment.line)
    );
}

async function addReviewComments(suggestions, octokit, rawComments, modelName) {
    const { info } = log({ withTimestamp: true }); // eslint-disable-line no-use-before-define
    const comments = filterPositionsNotPresentInRawPayload(rawComments, extractComments().comments(suggestions));

    try {
        await octokit.rest.pulls.createReview({
            owner: github.context.repo.owner,
            repo: github.context.repo.repo,
            pull_number: github.context.payload.pull_request.number,
            body: `Code Review by ${modelName}`,
            event: "COMMENT",
            comments,
        });
    } catch (error) {
        info(`Failed to add review comments: ${JSON.stringify(comments, null, 2)}`);
        throw error;
    }
}

निष्कर्ष

मैं जीथब एक्शन को खुला रखना चाहता था और एकीकरण के लिए खुला रखना चाहता था और इसीलिए आप अपनी पसंद के किसी भी मॉडल का उपयोग कर सकते हैं (समर्थित मॉडलों की सूची देखें), या आप इसे ठीक कर सकते हैं और निर्माण कर सकते हैं समर्थित बेस मॉडल के शीर्ष पर अपना स्वयं का कस्टम मॉडल बनाएं और इस जीथब क्रिया के साथ इसका उपयोग करें।

यदि आपको कोई टोकन समस्या या दर सीमित करने का सामना करना पड़ता है, तो आप संबंधित प्लेटफ़ॉर्म के दस्तावेज़ का हवाला देकर अपनी मॉडल सीमा को अपग्रेड करना चाह सकते हैं।

तो आप किस बात की प्रतीक्षा कर रहे हैं? यदि आपके पास जीथब पर रिपॉजिटरी है, तो अभी कार्रवाई का प्रयास करें - यह जीथब एक्शन मार्केटप्लेस पर है।

Better - An AI powered Code Reviewer GitHub Action मुर्तुजालिसुर्ति / बेहतर

एआई द्वारा संचालित एक कोड समीक्षक जीथब एक्शन, आपके वर्कफ़्लो में उपयोग के लिए तैयार है।

बेहतर

एआई द्वारा संचालित एक कोड समीक्षक जीथब एक्शन, आपके वर्कफ़्लो में उपयोग के लिए तैयार है।

इसका उपयोग क्यों करें?

  • अपनी कोड समीक्षा प्रक्रिया को मानकीकृत करें
  • तेज़ी से प्रतिक्रिया प्राप्त करें
  • ऐसे पैटर्न पहचानें जिनके परिणामस्वरूप खराब कोड आता है
  • सामान्य समस्याओं का पता लगाना
  • सुरक्षा कमजोरियों की पहचान करें
  • दूसरे की राय लेना
  • मनुष्य को अधिक जटिल कार्यों पर ध्यान केंद्रित करने के लिए

उपयोग

1. वर्कफ़्लो बनाएं

निम्नलिखित सामग्री के साथ अपने भंडार के .github/workflows फ़ोल्डर के अंदर एक वर्कफ़्लो फ़ाइल बनाएं (यदि यह मौजूद नहीं है तो बनाएं):

name: Code Review
on
    pull_request:
        types: [opened, reopened, synchronize, ready_for_review]
        branches:
            - main # change this to your target branch
    workflow_dispatch: # Allows you to run the workflow manually from the Actions tab

permissions: # necessary permissions
    pull-requests: write
    contents: read

jobs:
    your-job-name:
        runs-on: ubuntu-latest
        name: your-job-name
        steps:
            - name: step-name
              id: step-id
              uses: murtuzaalisurti/better@v2 # this is
पूर्णस्क्रीन मोड दर्ज करेंपूर्णस्क्रीन मोड से बाहर निकलें
GitHub पर देखें
विज्ञप्ति वक्तव्य यह लेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/murtuzaalisurti/better-an-ai-powered-code-reviewer-github-action-2n28?1 यदि कोई उल्लंघन है, तो कृपया हटाने के लिए स्टडी_गोलंग@163.com पर संपर्क करें। यह
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3