किसी मानक को बनाए रखने और किसी प्रोजेक्ट में कोड की सर्वोत्तम प्रथाओं पर जोर देने में कोड समीक्षाएं हमेशा महत्वपूर्ण रही हैं। यह पोस्ट इस बारे में नहीं है कि डेवलपर्स को कोड की समीक्षा कैसे करनी चाहिए, यह इसके एक हिस्से को एआई को सौंपने के बारे में है।
जैसा कि माइकल लिंच ने अपनी पोस्ट में उल्लेख किया है - "एक इंसान की तरह कोड समीक्षा कैसे करें" - हमें कंप्यूटर को कोड समीक्षा के उबाऊ हिस्सों का ध्यान रखने देना चाहिए। जबकि माइकल एक फ़ॉर्मेटिंग टूल पर ज़ोर देता है, मैं इसे एक कदम आगे ले जाना चाहता हूँ और कृत्रिम बुद्धिमत्ता को इसका पता लगाने देना चाहता हूँ। मेरा मतलब है, उद्योग में एआई बूम का लाभ क्यों न उठाया जाए?
अब मैं यह नहीं कह रहा हूं कि फ़ॉर्मेटिंग टूल और लिंटर के स्थान पर एआई का उपयोग किया जाना चाहिए। इसके बजाय, इसका उपयोग उन तुच्छ चीज़ों को पकड़ने के लिए किया जाना चाहिए जो मानव से छूट सकती हैं।
इसलिए मैंने एक जीथब एक्शन बनाने का फैसला किया, जो कोड पुल अनुरोध अंतर की समीक्षा करता है और एआई का उपयोग करके सुझाव उत्पन्न करता है। आइए मैं आपको इसके बारे में बताता हूं।
? टिप्पणी
- यह 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; } }
मैं जीथब एक्शन को खुला रखना चाहता था और एकीकरण के लिए खुला रखना चाहता था और इसीलिए आप अपनी पसंद के किसी भी मॉडल का उपयोग कर सकते हैं (समर्थित मॉडलों की सूची देखें), या आप इसे ठीक कर सकते हैं और निर्माण कर सकते हैं समर्थित बेस मॉडल के शीर्ष पर अपना स्वयं का कस्टम मॉडल बनाएं और इस जीथब क्रिया के साथ इसका उपयोग करें।
यदि आपको कोई टोकन समस्या या दर सीमित करने का सामना करना पड़ता है, तो आप संबंधित प्लेटफ़ॉर्म के दस्तावेज़ का हवाला देकर अपनी मॉडल सीमा को अपग्रेड करना चाह सकते हैं।
तो आप किस बात की प्रतीक्षा कर रहे हैं? यदि आपके पास जीथब पर रिपॉजिटरी है, तो अभी कार्रवाई का प्रयास करें - यह जीथब एक्शन मार्केटप्लेस पर है।
एआई द्वारा संचालित एक कोड समीक्षक जीथब एक्शन, आपके वर्कफ़्लो में उपयोग के लिए तैयार है।
निम्नलिखित सामग्री के साथ अपने भंडार के .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
…अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3