AI-koodausavustimet, keskustelua AI-avustetusta koodaamisesta/skriptaamisesta/dokumentoinnista/...

finWeazel

Chief Karpfen - ruoKalan C&R
Liittynyt
15.12.2019
Viestejä
9 193
Keskustelua ai:n avustetusta koodaamisesta. Ketjun tarkoitus nimenomaan koodauksessa/skriptauksessa/dokumentoinnissa/automaatiossa/... eikä yleisessä ai vie työpaikat tai yleisessä ai keskustelussa. Jos haluaa yleisemmin keskustella ai:sta niin esimerkiksi tämä ketju palvelee:

Oletteko kokeilleet jotain ai-koodiavustinta? Millon kokeilitte, toimiko vai ei? Mihin käyttäisit tai et käyttäisi koodiavustinta? Onko käyttämäsi koodiavustin parantunut ajan saatossa vai ei?

Keskustelun aloittamiseksi
  • Cursor Mun mielestä tän hetken paras ide+ai koodiavustin(etenkin claude sonnet3.5 mallin käyttö pop). Forkattu vscode mihin AI integroitu syvälle. Ymmärtää koko koodipohjan ei vain yksittäisiä tiedostoja
    • Maksullinen
  • GitHub Copilot · Your AI pair programmer Microsoftin copilotti vscodeen
    • Maksullinen
  • qwen2.5-coder + Continue + vscode
    • Ilmainen. Integroituu lokaaliin kielimalliin. Continue toki integroituu maksullisiinkin pilvimalleihin. Itse laajennus taitaa olla open sourcea?
    • Mun setuppi macbook pro + ollama + vscode + continue. Toimii llaman yms. kanssa myös mutta ne ei pärjää qwen2.5:lle
  • https://chatgpt.com/
    • Tälläkin voi, mutta aika keljua copy/pasteilla ees+taas. Mä arvostan enemmän IDEen integroitua, mutta voi tälläkin jotain tehdä kankeudesta huolimatta.
Muistiinpanohommiin testaillut obsidian+llm:t. Mielenkiintoinen tapa prosessoida ajatuksia

Tähän ketjuun saa myös heittää kuvauksia koodista mitä haluaisi luoda. Voidaan porukalla kokeilla osaako AI avustaa vai menikö metsään.
 
Viimeksi muokattu:
ChatGPT:ltä oon kyselly yksittäisiä juttuja ja välissä se yllättää positiivisesti lisäten automaattisesti tärkeitä juttuja jotka ei ollu käyny itellä mielessä tai ollu huomannu sanoa. Esim. File Browseriin teki taaksepäin napin kysymättä, ja kuvien lataamiseen kuva-cachen. Välissä sillä taas ei ole oikein mitään käsitystä mitä se tekee. Hauskasti se osaa silti korjata oman virheensä kun antaa virheilmoituksen, tai pelkästään mainitsee ettei antamanne koodi toimi.

Cursor kiinnostais ku katoin Lex Fiedmanin podcastin jossa tekijätiimi oli vieraana. Erittäin vakuuttava, varsinkin kun tyypit oli selvästi "tehokkuus orientoituneita", ja keskittyivät just niihin asioihin.

Saa nähdä koska tulee AI joka liikuttaa hiirtä ja käyttää kaikkia PC:n ohjelmia, ohjelmoija vaan tuijottaa monitoria ja selittää mitä haluaa tehtävän.
 
Saa nähdä koska tulee AI joka liikuttaa hiirtä ja käyttää kaikkia PC:n ohjelmia, ohjelmoija vaan tuijottaa monitoria ja selittää mitä haluaa tehtävän.
Agentic AI taitaa olla 2025 alkuvuoden juttuja. "kaikki" pöhisee agenttien tekemisestä. Esim. imho. parhaan koodausmallin(claude sonnet 3.5) tekijät julkaisi agenttujutun: Introducing computer use, a new Claude 3.5 Sonnet, and Claude 3.5 Haiku

openai:n huhuttu tekevän agenttia OpenAI reportedly plans to launch an AI agent early next year

Koodaushommissa en tiedä miten agentti tässä kohtaa auttaisi. Tarvii tällä hetkellä vielä paimentaa AI:ta aika paljon eikä voi oikein jättä vapaalle jalalle että koodailes vaikka yksikkötestejä ja tee pull requestit ja kerro sitten kun menee ci putken läpi ilman virheitä. Jos anthropic&co tyyppien juttuihin on uskominen niin aika vauhdilla avustimet tulevat kehittymään lähivuosien ajan.
 
Olen käyttänyt sekä kaupallista että tavallista bingin copilottia apuna vaikeiden html:n xpath-lokaattorien löytämiseen ja rakenteluun automaatiotestauksen toteuttamisessa (Robot Framework). Lisäksi on tullut käytettyä vähän samoihin hommiin lokaalisti sekä Chat with RTX:ää (Mistral) ja Intelin AI Playgroundia (Phi-3-mini). Lokaalisti on myös asennettuna malli Poro34B:stä, mutta sen kokeilu on jäänyt hyvin vähäiseksi vaikka hommasin sen suomen kielen kokeiluja varten.

Oma käyttötapani on se että teen itse ensin koodin ja kun sieltä alkaa tulla virhettä, useimmiten lokaattorien takia, alan keskustella virheestä ja koodista LLM:n kanssa ja useimmiten ongelma selviää verrattain nopeasti. Joskus LLM alkaa vaikeissa kysymyksissä kiertämään vastauksissaan kehää, jolloin pitää osata kysyä sama asia eri tavoin. Kokonaisuutena on hämmästyttävää miten hyvin ainakin minua on LLM:t pystyneet auttamaan ja miten paljon on säästynyt chatbotin kanssa keskustelemalla aikaa verrattuna siihen että alkaisi googlaamaan ja katselemaan videoita.
 
On tullut käytettyä Cursoria, ja tietysti ChatGPT:tä. Opiskelen alanvaihtajana tällä hetkellä kolmatta vuotta tieto- ja viestintätekniikkaa, painottuen juurikin dataan ja tekoälyyn. Cursor on kyllä kätevä esim. koodin dokumentoinnissa ja yksikkötestien väsäämisessä, koodiakin tekee mutta ei täysin autuaaksi tee, eikä tarvitsekaan. Hyvät taidot tiedon etsimisessä haastavissa tilanteissa ja pyrkimys kehittää omia ratkaisuja on kuitenkin "key".
 
Itse luokittelisin itseni ehkä harrastelijakoodariksi joka välillä loihtii töissäkin jotain pientä koodinpätkää.

Olen tähän asti käytellyt ChatGPT:ta ja Googlen Geminiä ihan vaan kirjoittamaan tylsiä koodinpätkiä jossa nuo ovat kyllä pääsääntöisesti toimineet varsin hyvin. Eli tyyliin "Kirjoita pythonilla funktio aiheesta x, parametrit y ja z, haluan paluuarvon muodossa a" ja lähes aina on tullut ihan kelvollista koodia. Samoin joskus kun on ollut joku koodinpätkä josta ei vaan ole itse virhetä löytänyt niin AI on yli puolessa tapauksista löytänyt jotain korjattavaa.

Joskus on ihan huvikseen kokeillut kysyä jotain vähän isompaa kokonaisuutta mutta selkeästi silloin vastaukset ovat olleet heikompia eli kaikenlaista pikkubugia on ollut koodissa siellä sun täällä. Toki niistä suurimman osan on saanut osoitettua tekoälylle ja saanut sitä kautta korjattua mutta tuollaisessa isommassa koodinpätkässä on melkeinpä ollut helpompaa ja nopeampaa itse korjailla pikkuviat.

Toki tuohon vastausten laatuun vaikuttaa varmaan oma taito kysellä AI:lta asioita ja varmaan nuo LLM:t ovat kehittyneetkin viimeisen vuoden aikana.

Mitään editoriin integroitua avustinta ei minulla ainakaan vielä ole käytössä, sen verran harvoin kuitenkin on tullut AI:ta käytettyä koodailussa apuna.
 
SWE-bench on yksi tapa mitata miten hyvä AI on tekemään koodaustaskeja. Claude Sonnetin tekijät jutteli, että vuosi sitten oli suurinpiirtein 3% mitä AI osasi ratkaista, nyt päästään 49%:iin. Ehkä vuoden päästä ollaan yli 90% suorituskyvyssä. Toki ei tarkoita että AI osaisi koodata kaiken, mutta kertoo jotain siitä miten AI:n käyttö tavanomaisiin tehtäviin on kehittynyt ja ehkä tulee kehittymään. Ollaan jännän äärellä. Ongelmiakin on benchmarkeissa kun niissä tehdyt tulokset eivät välttämättä yleisty tavanomaiseen käyttöön tai puuttuu benchmarkista testejä jostain tietystä koodaushommasta.

Mä olen tykännyt cursorista kun se tuntuu ymmärtävän kontekstin paremmin. ChatGPT webbisivulla hankala kun se ei näe ympäröivää koodia. On ihan herran hallussa tai pitkällinen promptaaminen että saa "helposti integroitavaa" tai hajoaa kokonaan jos pitäisi ympärillä olevaa koodia myös muuttaa.

Our latest model, the upgraded Claude 3.5 Sonnet, achieved 49% on SWE-bench Verified, a software engineering evaluation, beating the previous state-of-the-art model's 45%. This post explains the "agent" we built around the model, and is intended to help developers get the best possible performance out of Claude 3.5 Sonnet.
 
Copilottia on tullut käytettyä, integroituna VS Codeen. Kyllähän siitä pientä buustia saa koodin kirjoittamiseen, juurikin "autocomplete" featuren muodossa. Ja joskus kun on ollut aivot solmussa eikä ole jaksanut miettiä miten funktio kannattaisi toteuttaa, niin olen kirjoittanut ensin yksikkötestit ja pyytänyt niiden pohjalta ratkaisua, on toiminut oikein hyvin.
 
Kokeilin cursorin avulla tehdä rogue like peliä alulle. 20 minuutin väsäys nyrkkeilyä katsoessa tuotti kuvan tuloksen. Modulaarinen python koodi, skriptillä virtualenv setup ja riippuvuuksien asentaminen, karttapohjageneraatio, liikkuminen avoimessa tilassa, npc-generointi, seinät, värit. Liikkuminen toimii, seinien läpi ei pääse.

Jännää vois saada aikaiseksi kun kytkisi npc:n motivaatiot, toiminnot ja liikkumisen lokaaliin kielimalliin. Pelin teema vaikkapa olla softatalossa töissä missä pisteitä saa töiden välttämisestä/epäonnistumisesta. Töiden onnistunut tekeminen vähentää pisteitä. Managerit joko etsivät syytä antaa pelaajalle potkut(game over) tai yrittävät nakittaa hommia. Kaikenlaisten aktivitettien lopputuloksen päättämisen voisi jalkauttaa lokaalille kielimallille niin ei tarvi tehdä jotai if avain sopii lukkoon tms. hässäköitä. AI toimisi dungeon masterina ja logiikka hieman sumea mutta promptattu.

Omia koodirivejä ja muutoksia nolla, eli cursor generoi 100% koodista

1731723748758.png
 
Ajan itse paikallisesti omalla Nvidia pelikoneellani deepseek-coder-v2 LLM johon sitten yhdistän työläppärini VSCoden Continue plugarilla. Samoin käytän ChatGPT:tä ja olen jo käyttänyt sitä ainakin 1-2v vuoden ajan.

Näiden vajaa 2v aikana en ole varsinaisesti kertaakaa törmännyt tilanteeseen jossa oikeasti kannattaisi käyttää LLM itse koodaamiseen pl. muutamat poikkeustapaukset. Omasta mielestäni nämä LLM on aivan mullistavia ja jokaisen itsensä tosissaan ottavan ohjelmistokehittäjän tai oikeastaan kenen tahansa normaalin ihmisen kannattaisi ehdottomasti ottaa nämä täysillä mukaan omaan arkeen. Se missä olen saanut aivan helvetisti ajan ja hermojen säästöä LLM on nämä:
  • Dokumentaation sisällöstä kysely
  • Stackoverflow/Google korvike
  • Dokumentaation oikoluku ja englannin kielityylin parantaminen
  • Tietokanta kyselyjen ja regular expression luonti
  • Raporttien tekeminen
  • Yksittäisten "algortimisten" funktioiden koodaamisen ulkoistaminen tekoälylle kun aivoja laiskotuttaa
  • Arkkitehtuurin validointi ja siitä keskustelu
  • Boilerplate-koodin teko
Varsinaisessa arjen koodaamisessa taas ellei kyse ole erittäin yksinkertaisesta ja suoraviivaisesta "perussovelluksesta", LLM käyttö koodaamiseen tarvitsee niin paljon kontekstin selittämistä ja virheiden korjaamista että kaikki se etu mitä sillä saadaan yleensä nollaatuu täysin ja pahimmillaan mennään jopa negatiiviselle puolelle.
 
Viimeksi muokattu:
Varsinaisessa arjen koodaamisessa taas ellei kyse ole erittäin yksinkertaisesta ja suoraviivaisesta "perussovelluksesta", LLM käyttö koodaamiseen tarvitsee niin paljon kontekstin selittämistä ja virheiden korjaamista että kaikki se etu mitä sillä saadaan yleensä nollaatuu täysin ja pahimmillaan mennään jopa negatiiviselle puolelle.
Cursor+claude sonnet 3.5 tuo paljon apua kontekstiasiaan. Cursor promptattu niin, että se osaa siirtää koko projektin tiedot kontekstiin. Claude sonnet 3.5 kielimalli next level verrattuna chatgpt koodin ymmärtämisen ja luonnin kanssa. Github copilot&co on hieman perässä kontekstiasian kanssa versus cursor. Jos en ole väärin käsittänyt niin github copilottiin on tulossa claude sonnet vaihtoehtona tai saattaa olla jo nyt tarjolla. Samoin github copilotissa on yritystä luoda isompi konteksti kuin vain yksi editoitava tiedosto.

Kehitys on kyllä niin nopeaa, että vaikea sanoa mikä työkalu ja kielimalli on paras vuoden päästä. qwen2.5-coder:32B:ta testaillut lokaalisti. Se on ihan ok, mutta vaatii hyvään lopputuloksene paljon tarkempaa promptaamista kuin claude sonnet 3.5.
 
Viimeksi muokattu:
Cursor+claude sonnet 3.5 tuo paljon apua kontekstiasiaan. Cursor promptattu niin, että se osaa siirtää koko projektin tiedot kontekstiin. Claude sonnet 3.5 kielimalli next level verrattuna chatgpt koodin ymmärtämisen ja luonnin kanssa. Github copilot&co on hieman perässä kontekstiasian kanssa versus cursor. Jos en ole väärin käsittänyt niin github copilottiin on tulossa claude sonnet vaihtoehtona tai saattaa olla jo nyt tarjolla. Samoin github copilotissa on yritystä luoda isompi konteksti kuin vain yksi editoitava tiedosto.

Kehitys on kyllä niin nopeaa, että vaikea sanoa mikä työkalu ja kielimalli on paras vuoden päästä. qwen2.5-coder:32B:ta testaillut lokaalisti. Se on ihan ok, mutta vaatii hyvään lopputuloksene paljon tarkempaa promptaamista kuin claude sonnet 3.5.
Tajuaakohan nuo vaikka Unityä? Siellä kun monia asioita tehdään hiirellä raahaamalla, ja koodi on käyttökelvoton monesti vaikka idea on oikea.
 
Tajuaakohan nuo vaikka Unityä? Siellä kun monia asioita tehdään hiirellä raahaamalla, ja koodi on käyttökelvoton monesti vaikka idea on oikea.
ChatGPT väittää osaavansa, allaoleva lainaus. Varmaan tuota kannattaisi kokeilla mutta pitää odotukset alhaisina.

Toinen puoli tarinaa, että mun makuun parhaiten toimii IDEen integroidut avustimet joilla on pääsy IDEn toiminnallisuuksiin ja tietävät projektin kontekstin. Tätä taustaa vasten imho. jos haluaisi unity/ue5 tms. avustimen niin järkevintä sellainen olisi integroida suoraan työkaluun. Suoran integroinnin ansiosta ai:n ei myöskään tarvisi klikkailla ui elementtejä. Avustin voisi kutsua ohjelmallisesti työkalun ulkoisia ja sisäisiä rajapintoja.
Yes, I’m familiar with Unity! I can assist you with various aspects of Unity game development, including:

1. Project Setup & Best Practices:
• Structuring your project folders.
• Setting up scenes, prefabs, and game objects efficiently.
• Using the Unity Package Manager for dependencies.

2. Programming & Scripting:
• Writing and optimizing C# scripts.
• Implementing game mechanics, AI behavior, player controls, and game physics.
• Working with coroutines, events, delegates, and asynchronous programming.

3. UI/UX Design:
• Designing and implementing user interfaces (menus, HUDs, etc.).
• Handling input (keyboard, mouse, gamepad, or touch).
• Animations for UI elements and transitions.

4. Graphics & Visual Effects:
• Setting up materials, shaders, lighting, and post-processing effects.
• Using Unity’s Visual Effect Graph and Shader Graph.
• Implementing particle systems, visual effects, and environmental details.

5. 2D/3D Animation:
• Animating characters, objects, and environments using the Animator.
• Handling blend trees, animation controllers, and rigging.
• Importing assets from Blender, Maya, or other tools.

6. Physics & Collisions:
• Implementing realistic or arcade-style physics.
• Setting up collisions, triggers, and rigidbodies.
• Handling character controllers and movement systems.

7. Sound Design & Music:
• Integrating audio effects, background music, and sound triggers.
• Working with Unity’s Audio Mixer for complex sound setups.

8. Optimization:

• Improving performance with techniques like object pooling, LODs, and occlusion culling.
• Reducing draw calls, optimizing shaders, and managing memory.
• Profiling your game to identify bottlenecks.

9. Builds & Deployment:
• Preparing builds for different platforms (PC, Android, iOS, etc.).
• Configuring player settings, quality settings, and resolution.
• Addressable assets and optimizing for different hardware targets.

Let me know what specific area you’re interested in or if you need help with a particular feature or problem in your project!
 
Viimeksi muokattu:
Olen käyttänyt Phind.com ja VS Codea yhdessä hyvällä menestyksellä. Phind tarjoaa kätevän tavan testata vastauksia erilaisilla kielimalleilla, mukaan lukien:

Phind (Instant, 70B, 405B)
GPT-4o
o1-preview
Claude (3.5 Sonnet, Opus)
 
Linuxin säätämisessä on ollut hyötyä. Vähän kuin hakukone, mutta ensimmäinen tulos on hyvä.
Tämä. Säästää ihan järjettömän määrän jotain random reddit threadien selaamista. Käyttänyt lähinnä ongelmanselvitykseen tai "miten tämän voisi tehdä paremmin"-tyyliseen säätämiseen.
 
Ohjelmointi puoli on usein vähän heikko, mutta kuten sanottu threadissa, esim. Sql, regex ja ansible menee usein hyvin. Oikoluku on ok, mutta tekee usein uusia virheitä.

Tässä. Myös hyvä artikkeli chatgpt käytöstä
 
Viimeksi muokattu:
Tuli tuossa taas pari iltaa sitten kokeiltua kuinka Googlen Gemini generoi koodia. Oli sellainen yksi pieni oma projekti että helvetillisen isosta CSV-tiedostosta piti parsia muutamia asioita ja tehdä niistä uusi CSV. Pilkoin ongelman yksittäisiksi funktioiksi ja kyselin huvikseni niihin ratkaisut Geminiltä ja sehän antoi käytännössä ihan täydelliset vastaukset. Sitten vaan kasailin nuo yhdeksi ohjelmaksi ja hommahan toimi.

Eli kyllähän nuo AI:t jo ainakin pythonia osaavat ihan sujuvasti koodailla, ainakin jos niille ei anna liian isoa palaa kerrallaan ratkaistavaksi. Tuohon tekoälyn kanssa leikkimiseen ja lopputuloksen kasaamiseen meni varmaan joku vajaa puoli tuntia, itse alusta asti koodailemalla itselläni olisi varmaan mennyt tunnin verran kun olisi joutunut vähän miettimään miten muutamia asioita olisi tehnyt jne.

Pitää varmaan tulevaisuudessa entistä enemmin koittaa käyttää noita AI-apureita, ihan vaan opettelun kannalta.
 
Itse olen nyt kaikkea kokeillut. Claude Sonnet on ylivoimaisesti ainut, mitä pystyy käyttämään Aiderin kanssa. Tosin hyvin kalliiksi on tullut OpenRouterin API:n kanssa. Viimeiseltä 2 viikolta 200€ edestä on tokeneitä poltettu.

Joskus Cursorin IDE:tä käytin pitkään, mutta IDE oli liian buginen. Tuli kokeiltua myös Sourcegraphin Cody, Double.bot ja vielä muita vastaavia. Aina kaikissa ongelmia, vaikka halpa se on maksaa se 10€ tai 20€/kk. Sieltä saa silti jonkinnäköisen "limited" mallin Sonnetista, missä on vain joku 20k tjs contextia vs alkuperäinen, missä 200k. Nämä mallit käy, jos on hyvin vähän contextia, mutta silti huomasin, ettei jostain syystä ollut yhtä älykkäitä kuin alkuperäinen Sonnet 200k contextilla.

Ja nyt sitten päädyin tähän:
  • Enimmäkseen käytän: Aider + Claude Sonnet 3.5 ja välillä vaihdan Haikuun, jos on helpompia nakkeja.
  • Cline + Claude Sonnet: Hyvä, jos pitäisi projekti alusta aloittaa (tai generoida uusia tiedostoja), huono ja kallis, jos pitää koodia muuttaa.
  • Codeium autocomplete: Ja sitten jos haluaa vielä completionia niin tämä paras ja ilmainen, jos käyttää sitä vaan siihen.
Vähän ahdistaa kyllä tämä Sonnetin hinta, mutta kun ei ole vaan vaihtoehtoja. Qwen 2.5 Coder vaikuttaa lupavalta ja melkein ilmainen käyttää, valitettavasti oli vielä liian buginen..

Nykyään en ymmärrä kyllä enää, mikä on GPT:n tarkoitus. Ei siitä ole vastustaa Sonnetille, ihan v*'n kallis verrattuna muihin, eikä ole paras missään muussakaan.

Long Context > Gemini
Koodaus > Sonnet
Creativity Writing > Llama finetuunattu
 
Viimeksi muokattu:
Nykyään en ymmärrä kyllä enää, mikä on GPT:n tarkoitus. Ei siitä ole vastustaa Sonnetille, ihan v*'n kallis verrattuna muihin, eikä ole paras missään muussakaan.
o1 on todella hyvä. Kai tarkoitus noissa on kova kilpailu oli kyse sitten kielimallista tai IDE:sta. chatgpt perustuu melko vanhaan malliin. OpenAI alkanut opettamaan uutta foundation mallia, mutta sen opettamisessa, optimoinnissa yms. menee kuukausia aikaa.

Uskon, että kilpailu takaa sen, että piikkipaikka vaihtuu ja toisaalta myös löytyy eri nichejä mihin eri mallit sopivat paremmin ja huonommin. esim. o1:en ja monimutkaisempien ongelmien ratkaiseminen palasissa(matematiikka, fysiikka yms).

Claude sonnet 3.5:en tällä hetkellä mun käyttöön paras. O1:en etenkin matematiikka/fysiikka ongelmien ratkaisuun. Lokaalisti macbook pro:ssa tullut ajettua qwen 2.5 coder 32B:ta.
 
Kannattaako Cursor ottaa mieluummin kk-maksulla ($16 - $20 /kk) vai Anthropicin kautta Claude ($18 - $20) lisäominaisuuksineen ja tarjoilla Cursoriin API-avain?

Aloitin siis Cursorin käytön pari viikkoa sitten ja ollut erittäin tyytyväinen koodatessani Flutter:illa ja React Native:lla. Nyt pitäisi sitten alkaa maksamaankin tuosta nautinnosta
 
Kannattaako Cursor ottaa mieluummin kk-maksulla ($16 - $20 /kk) vai Anthropicin kautta Claude ($18 - $20) lisäominaisuuksineen ja tarjoilla Cursoriin API-avain?

Aloitin siis Cursorin käytön pari viikkoa sitten ja ollut erittäin tyytyväinen koodatessani Flutter:illa ja React Native:lla. Nyt pitäisi sitten alkaa maksamaankin tuosta nautinnosta
Ei tässä varmaan ole oikeaa vastausta olemassa. Tilanteet voi vaihtua yhden softapäivityksen myötä myös siihen suuntaan ettei cursor olekkaan enää the juttu ja parempi käyttää jotain muuta editoria/laajennusta.

Mä otin cursorin vuodeksi kun sai niin hieman halvemmalla. Chatgpt pyörii mukana kuukausimaksulla. Jos/kun työkalut paranee niin vaihtelen parempiin/mielekkäämpiin. Ei lokaalia qwen-coderiakaan kannata väheksyä, ilmaiseksi todella hyvä jos vain on kone missä sen isointa versiota saa ajettua

Lieköhän näihin olisi tarjolla/tulossa jotain black friday tarjousta?
 
ChatGPT on itselle uusi (tai ei enää uusi) google. Joskus tulee kirjoiteltua googleen kysymys samaan tapaan kuin GPT:lle mutta vaikka kuinka hienosäätäisi hakusanoja, tulos on nykyään pelkkiä firmojen linkkejä ja ei tunnu löytyvän sitä mitä yrittää hakea. Ehkä google on mennyt FB suuntaan eli alkaa säädellä liikaa hakutuloksia käyttäjäkohtaisesti tai GPT:n jälkeen huomaa vain miten kökkö google onkaan.

VSCodessa käyttänyt coPilotia ja laitoin sen Visual Studioonkin, mutta tästä on noin vuosi aikaa enkä ole VS:llä tehnyt koodia vuoteen. Silloin se ei ainakaan tarjonnut kauheasti lisäiloa. coPilotista luovuin kun siitä oli vaikea päästä eroon ja kun laitoin tauolle, tuli silti vielä yhden kuukauden veloitus. Kokelin Codeiumia ja se on ollutkin ns. intellisensenä ihan mainio. ChatGPT on ollut rinnalla mutta siinä on tosiaan suuri miinus ettei muista contextia kovinkaan pitkään vaan tarjoaa vastauksia jotka rikkoo projektin. Sitten taas vähän aikaa selvittelet, mistä johtuu ja lopulta kerrot ChatGPT:lle että unohdit että käytän versiota xxx ja kirjastoja ccc ja bbb. Sitten se osaa tehdä ehkä jotenkuten toimivan vastauksen. Mutta on se silti huomattavasti nopeampaa kuin vääntää kaikki itse rivi riviltä.

Tänäään lähtee testiin Cursor. Yritin Codeiumin kanssa kysellä siltiä koko projektista niin sillähän ei ollut pääsyä muihin tiedostoihin kuin aktiiviseen.

Tästä ajattelinkin kysyä; miten suhtaudutte tai miten työnantajanne suhtautuu tekoälyavustajien tietoturvaan? Olen antanut itselleni kertoa että esim. VSCoden avustajat ei pääsisi koko projektiin kiinni nimenomaan ettei koko projekti ole kohta talon ulkopuolella. Kun mietitään sovelluskehitystä ja vähänkään kriittisempiä softia niin on aikamoinen riski että jokin rajapinta saa pääsyn koko koodiin.
 
Tästä ajattelinkin kysyä; miten suhtaudutte tai miten työnantajanne suhtautuu tekoälyavustajien tietoturvaan? Olen antanut itselleni kertoa että esim. VSCoden avustajat ei pääsisi koko projektiin kiinni nimenomaan ettei koko projekti ole kohta talon ulkopuolella. Kun mietitään sovelluskehitystä ja vähänkään kriittisempiä softia niin on aikamoinen riski että jokin rajapinta saa pääsyn koko koodiin.
Mun viimeiseksi jäänyt työnantaja meni all in AI-avustimiin. Mallit tuunattiin firman datoilla paremmin firman työntekijöille toimivaksi. Helposti voin kuvitella, että joku toinen yritys ei käyttäisi nykyisiä ai-avustimia. Ei ole kykyä ylläpitää omissa tiloissa rautaa+palvelua, pilviin ei luoteta, ei osata kustomoida kielimallia omalla datalla(parempi toimivuus), jyrkkä ei AI-avustimille? Tosin jos pilvessä on jo videoneuvottelu, office, email, slack/chat, ci-työkalut, jira jne. niin onko koodiavustin pilvessä sen isompi riski kuin noi muut pilvipalvelut? Pitäisi ehkä tosin olla microsoftin tasoinen partneri(github copilot) että uskaltaa uskoa pilven ja tarjoajan olevan "luotettava".

Yksi vaihtoehto on koodiavustin ajoon omassa koneessa. esim tämä malli : qwen2.5-coder:32b qwen:in tai llaman saa integroitua lokaalina versiona vscodeen Continue(open source) laajennuksen avulla Continue - Codestral, Claude, and more - Visual Studio Marketplace Ihan hyvä tuo qwen+continue vaikka ei claude sonnet:lle/cursor:lle pärjää. macbook pro:ssa ajanut tuota 32b versiota qwen2.5-coder:sta. Vaatii aika reilusti muistia qwen:in isoin versio. Continuessa kätevää kun tab-complete, koodinluonti jne. asioihin voi kytkeä eri kielimallit niin saa toimintaa paremmaksi kun yksi malli harvoin on paras/nopein kaikkeen.

Olen ollamalla asentanut ja käyttänyt lokaaleja kielimalleja. En tiedä onko paras tapa, mutta ainakin helppo Ollama
 
Viimeksi muokattu:
Testaan advent of codeen miten cursor ja ai-avustimet toimivat. Ensimmäisen päivän tehtävänannon cursor ratkaisi triviaalisti ilman että tarvi itse koodata. Pyysin cursorilta python koodina ratkaisun. Advent of code täällä: Advent of Code 2024

Kelasin ensin testaa cursorilla. Jos se ei osaa niin sitten chatgpt o1:lla pureksii atomeiksi ja katsoo ratkeaako.

Cursorin ratkaisu
Koodi:
def read_input(filename):
    with open(filename, 'r') as file:
        left = []
        right = []
        for line in file:
            # Split each line into two numbers
            l, r = map(int, line.strip().split())
            left.append(l)
            right.append(r)
    return left, right
def calculate_list_distance(left_list, right_list):
    # Sort both lists
    left_sorted = sorted(left_list)
    right_sorted = sorted(right_list)
 
    # Calculate total distance
    total_distance = sum(abs(l - r) for l, r in zip(left_sorted, right_sorted))
 
    return total_distance
def calculate_similarity_score(left_list, right_list):
    # Create a frequency counter for numbers in the right list
    right_frequencies = {}
    for num in right_list:
        right_frequencies[num] = right_frequencies.get(num, 0) + 1
 
    # Calculate similarity score
    total_score = 0
    for num in left_list:
        # Multiply each left number by its frequency in right list
        total_score += num * right_frequencies.get(num, 0)
 
    return total_score
def main():
    # Read input from file
    left, right = read_input('reaL_input')
 
    distance_result = calculate_list_distance(left, right)
    similarity_result = calculate_similarity_score(left, right)
 
    print(f"Total distance between lists: {distance_result}")
    print(f"Similarity score between lists: {similarity_result}")
if __name__ == "__main__":
    main()
O1:en optimoima versio python skriptistä
Koodi:
#!/usr/bin/env python3
import sys

if len(sys.argv) != 2:
    print("Usage: {} <input_file>".format(sys.argv[0]))
    sys.exit(1)

input_file = sys.argv[1]
left = []
right = []
count_right = {}

with open(input_file, 'r') as f:
    for line in f:
        l, r = map(int, line.strip().split())
        left.append(l)
        right.append(r)
        count_right[r] = count_right.get(r, 0) + 1

left.sort()
right.sort()
distance = sum(abs(l - r) for l, r in zip(left, right))
similarity = sum(l * count_right.get(l, 0) for l in left)

print("Total distance between lists:", distance)
print("Similarity score between lists:", similarity)
[/quote]
[/spoiler]

Päivän 2. ratkaisu meni kahdella promptilla, ts. molemmat tehtävät oneshot ilman säätöä. Aikaa meni enemmän mulla lukea tehtävänannot kuin prompti tehtävänannosta copy pastella editoriin+koodinluonti. On tuo hurja. Pitänee palata tähän asiaan jos joku tehtävä ei mene triviaalisti ai:lla. Ratkaisu spoilerissa
Koodi:
def is_safe_report(levels):
    diffs = [b - a for a, b in zip(levels, levels[1:])]
    return all(1 <= d <= 3 for d in diffs) or all(-3 <= d <= -1 for d in diffs)
def is_safe_with_dampener(levels):
    return is_safe_report(levels) or any(
        is_safe_report(levels[:i] + levels[i+1:]) for i in range(len(levels))
    )
def count_safe_reports(filename):
    try:
        with open(filename) as file:
            return sum(
                is_safe_with_dampener(list(map(int, line.strip().split())))
                for line in file
            )
    except FileNotFoundError:
        print(f"Error: File '{filename}' not found.")
    except Exception as e:
        print(f"An error occurred: {e}")
    return 0
def main():
    result = count_safe_reports('real_data')
    print(f"Number of safe reports: {result}")
if __name__ == "__main__":
    main()

Päivän 3. ongelman kakkososassa cursor tuotti väärän vastauksen. Korjasi kyllä jälkensä ja teki toimivan kun erroin että väärä vastaus, katso ongelmamäärittelyä uudestaan ja korjaa
 
Viimeksi muokattu:
Testaan advent of codeen miten cursor ja ai-avustimet toimivat. Ensimmäisen päivän tehtävänannon cursor ratkaisi triviaalisti ilman että tarvi itse koodata. Pyysin cursorilta python koodina ratkaisun. Advent of code täällä: Advent of Code 2024

Kelasin ensin testaa cursorilla. Jos se ei osaa niin sitten chatgpt o1:lla pureksii atomeiksi ja katsoo ratkeaako.

Cursorin ratkaisu
Koodi:
def read_input(filename):
    with open(filename, 'r') as file:
        left = []
        right = []
        for line in file:
            # Split each line into two numbers
            l, r = map(int, line.strip().split())
            left.append(l)
            right.append(r)
    return left, right
def calculate_list_distance(left_list, right_list):
    # Sort both lists
    left_sorted = sorted(left_list)
    right_sorted = sorted(right_list)
 
    # Calculate total distance
    total_distance = sum(abs(l - r) for l, r in zip(left_sorted, right_sorted))
 
    return total_distance
def calculate_similarity_score(left_list, right_list):
    # Create a frequency counter for numbers in the right list
    right_frequencies = {}
    for num in right_list:
        right_frequencies[num] = right_frequencies.get(num, 0) + 1
 
    # Calculate similarity score
    total_score = 0
    for num in left_list:
        # Multiply each left number by its frequency in right list
        total_score += num * right_frequencies.get(num, 0)
 
    return total_score
def main():
    # Read input from file
    left, right = read_input('reaL_input')
 
    distance_result = calculate_list_distance(left, right)
    similarity_result = calculate_similarity_score(left, right)
 
    print(f"Total distance between lists: {distance_result}")
    print(f"Similarity score between lists: {similarity_result}")
if __name__ == "__main__":
    main()
O1:en optimoima versio python skriptistä
Koodi:
#!/usr/bin/env python3
import sys

if len(sys.argv) != 2:
    print("Usage: {} <input_file>".format(sys.argv[0]))
    sys.exit(1)

input_file = sys.argv[1]
left = []
right = []
count_right = {}

with open(input_file, 'r') as f:
    for line in f:
        l, r = map(int, line.strip().split())
        left.append(l)
        right.append(r)
        count_right[r] = count_right.get(r, 0) + 1

left.sort()
right.sort()
distance = sum(abs(l - r) for l, r in zip(left, right))
similarity = sum(l * count_right.get(l, 0) for l in left)

print("Total distance between lists:", distance)
print("Similarity score between lists:", similarity)
[/quote]
[/spoiler]

Päivän 2. ratkaisu meni kahdella promptilla, ts. molemmat tehtävät oneshot ilman säätöä. Aikaa meni enemmän mulla lukea tehtävänannot kuin prompti tehtävänannosta copy pastella editoriin+koodinluonti. On tuo hurja. Pitänee palata tähän asiaan jos joku tehtävä ei mene triviaalisti ai:lla. Ratkaisu spoilerissa
Koodi:
def is_safe_report(levels):
    diffs = [b - a for a, b in zip(levels, levels[1:])]
    return all(1 <= d <= 3 for d in diffs) or all(-3 <= d <= -1 for d in diffs)
def is_safe_with_dampener(levels):
    return is_safe_report(levels) or any(
        is_safe_report(levels[:i] + levels[i+1:]) for i in range(len(levels))
    )
def count_safe_reports(filename):
    try:
        with open(filename) as file:
            return sum(
                is_safe_with_dampener(list(map(int, line.strip().split())))
                for line in file
            )
    except FileNotFoundError:
        print(f"Error: File '{filename}' not found.")
    except Exception as e:
        print(f"An error occurred: {e}")
    return 0
def main():
    result = count_safe_reports('real_data')
    print(f"Number of safe reports: {result}")
if __name__ == "__main__":
    main()

Päivän 3. ongelman kakkososassa cursor tuotti väärän vastauksen. Korjasi kyllä jälkensä ja teki toimivan kun erroin että väärä vastaus, katso ongelmamäärittelyä uudestaan ja korjaa
Ihan mielenkiinnosta, millä tavalla cursor 3. Pv ratkaisi?
 
Ihan mielenkiinnosta, millä tavalla cursor 3. Pv ratkaisi?
Cursorin ratkaisut minimaalisella copy/paste ongelma promptauksella. Jos haluaisi jonkun tietyntyylisen ratkaisun niin tuntuu hyvin toimivan ohjeet "käytä/älä käytä kirjastoa X","priorisoi luettavuus/nopeus/skriptin koko" tms. Osalla optimointipyynnöistä tuntuu toisinaan pääsevän suohon mistä ei saa toimivaa.

Osa 1
Koodi:
import re
def extract_and_multiply(file_path):
    # Read the input from the file
    with open(file_path, 'r') as file:
        data = file.read()
    # Regular expression to find valid mul(X,Y) instructions
    pattern = r'mul\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)'
    # Find all matches in the data
    matches = re.findall(pattern, data)
    # Calculate the sum of all valid multiplications
    total_sum = sum(int(x) * int(y) for x, y in matches)
    return total_sum
# Example usage
file_path = 'input'
result = extract_and_multiply(file_path)
print(f"The sum of all valid multiplications is: {result}")
osa 2
Koodi:
import re
def extract_and_multiply(file_path):
    # Read the input from the file
    with open(file_path, 'r') as file:
        data = file.read()
    # Regular expressions to find valid instructions
    mul_pattern = r'mul\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)'
    do_pattern = r'do\(\)'
    dont_pattern = r"don't\(\)"
    # Initialize the state
    mul_enabled = True
    total_sum = 0
    # Iterate over the data to find instructions
    index = 0
    while index < len(data):
        # Check for don't() instruction
        dont_match = re.match(dont_pattern, data[index:])
        if dont_match:
            mul_enabled = False
            index += dont_match.end()
            continue
        # Check for do() instruction
        do_match = re.match(do_pattern, data[index:])
        if do_match:
            mul_enabled = True
            index += do_match.end()
            continue
        # Check for mul(X,Y) instruction
        mul_match = re.match(mul_pattern, data[index:])
        if mul_match:
            if mul_enabled:
                x, y = mul_match.groups()
                total_sum += int(x) * int(y)
            index += mul_match.end()
            continue
        # Move to the next character if no instruction is matched
        index += 1
    return total_sum
# Example usage
file_path = 'input'
result = extract_and_multiply(file_path)
print(f"The sum of all enabled multiplications is: {result}")

o1:en "optimoima" osa 2
Koodi:
import re
def extract_and_multiply(file_path):
    with open(file_path, 'r') as file:
        data = file.read()
    pattern = re.compile(r"don't\(\)|do\(\)|mul\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)")
    mul_enabled = True
    total_sum = 0
    for match in pattern.finditer(data):
        instr = match.group()
        if instr == "don't()":
            mul_enabled = False
        elif instr == "do()":
            mul_enabled = True
        elif mul_enabled:
            x, y = match.groups()
            total_sum += int(x) * int(y)
    return total_sum
# Example usage
file_path = 'input'
result = extract_and_multiply(file_path)
print(f"The sum of all enabled multiplications is: {result}")

En yritä päästä leaderboardeille tms. näillä AI-ratkaisuilla. ts. kokeilen ratkooko AI näitä aika paljon myöhemmin kuin mitä ongelma tulee tarjolle. Sinällään ei yllätä, että cursor nämä ratkoo kun epäilemättä aikaisempien vuosien Advent of Code, leetcode jne. on kielimallin opetusmateriaalissa niin kielimalli tajuaa tällaisten logiikka-ongelmien rakenteen hyvin. Viime vuoden 25. päivän probleema oli jännä kun ai:n ratkaisu oli niin hidas ettei se olis varmaan saanut valmista maailmanloppuun mennessä. Kun käskytti optimoimaan suorituskyvyn suhteen niin plop ja sieltähän se vastaus tuli. Jännää tässä että oletettavasti oikea ratkaisu moneen kertaan opetusdatassa, mutta silti antoi epäoptimaalisen koodin.
 
Viimeksi muokattu:
Päivä 4 advent of coden parissa. Cursor epäonnistui molemmissa tehtävän osissa. Osan 1 ratkaisi kun käskytti miettimään uudestaan. Osa 2 ei onnistunut.

Chatgpt o1 ratkaisi molemmat tehtävät one shottina. Perehdyn cursorin epäonnistumiseen tarkemmin myöhemmin. Josko tuossa olisi jotain opittavaa siitä miten promptataan paremmin.

edit. Cursor ratkaisi 5. luukun tehtävät one shottina. Epäilytti pitkät ja varmaan tarkoituksella sekavat tehtävänannot, mutta niin vain kielimalli osasi ilman lisäapuja.

edit. o1 ratkaisi luukun 6 suoraan copy/pastesta. Cursor takelteli ja piti 2x pyytää korjaamaan ongelman molempien osien ratkaisua. Arvelen, että tehtävänanto niin pitkä että cursor unohtaa osan annetusta tiedosta ja siksi pitää sanoa että katsoppa uudelleen, ja katsoppa vielä kerran uudelleen.

edit. cursor ratkaisi luukun 7 suoraan copy/pastesta. Ei tarvinut laittaa o1:sta tulille.
edit. Cursor sössi luukun 8, fail. o1 ratkaisi 8. luukun ilman ongelmia
 
Viimeksi muokattu:
Anthropic(claude sonnet 3.5) alkaa käyttämään satoja tuhansia amazonin uusia kiihdyttimiä seuraavien malliversioiden opettamiseen. Tarkoittanee sitä, että koodausavustimet paranevat ensi vuonna jo pelkän brute forcen ansiosta + muut parannukset päälle.

We are collaborating with AWS to build Project Rainier—an EC2 UltraCluster of Trn2 UltraServers containing hundreds of thousands of Trainium2 chips. This cluster will deliver more than five times the computing power (in exaflops) used to train our current generation of leading AI models.
 
Oma harrastusprojekti vaatii kaverikseen simppelin sovelluksen ja on sen vuoksi useamman kerran jäänyt toteuttamatta loppuun asti. Nyt kun helpottavat työkalut (ja oma motivaatio sekä suunnitelmien selkeys) ovat parantuneet niin laitoinpa homman taas uudestaan alulle. VS Code + Continue + codestral/qwen2.5 coderit paikallisesti ovat Flutterin ja Android studion säätämisen jälkeen muutamassa tunnissa tuottaneet oikein kelvollisen sovelluksen aihion jossa oleellisimmat palikat jo toimii (sqflite, bluetooth), nyt ollaan siis jo paljon pidemmällä kuin ikinä aiemmin! Hienoksi on ilmaisetkin työkalut menneet, nyt on iso riski että ikuisuusprojekti oikeasti valmistuu:D
 
Pythonilla saa ilmeisen toimivaa koodia mutta tuntuu että C++ on vaikeampi AI:lle.

Vastausta tulee mutta turhan usein puppua. ChatGPT ehdottaa myös välillä tosi outoja ratkaisuja ja käyttää eksoottista syntaksia. Pitääkin kokeilla noita muita.
 
Pythonilla saa ilmeisen toimivaa koodia mutta tuntuu että C++ on vaikeampi AI:lle.

Vastausta tulee mutta turhan usein puppua. ChatGPT ehdottaa myös välillä tosi outoja ratkaisuja ja käyttää eksoottista syntaksia. Pitääkin kokeilla noita muita.
Tarkoitatko chatgpt:lla 4o:ta vai uunituoretta maksullista o1:sta? Mun kokemus on, että 4o ei ole hyvä. o1 preview ja varsinkin pari päivää sitten julkaistu uusi o1 on paras. Cursor+Claude sonnet 3.5 paras ide joka ymmärtää ympäristöä muttei pärjää o1:lle logiikkapulmisa kuten advent of code. Qwen coder osaa jotain mutta ei pärjää maksullisille. Uunituore llama3.3:70b feilas tosi kovaa tän päivän advent of codessa siinä missä o1 vain sylkäisi oikean ratkaisun ulos.
 
Viimeksi muokattu:
Tarkoitatko chatgpt:lla 4o:ta vai uunituoretta maksullista o1:sta?
4o. Jossain testissä minkä luin o1-mini pesi o1-previewin koodauksessa vaikka se on halvempi. Tehtävät olivat LeetCodesta.

Mutta tämä kehitys on kyllä vauhdikasta. Tässä saa kohta tosissaan olla huolissaan koodaustöiden vähenemisestä.
 
4o. Jossain testissä minkä luin o1-mini pesi o1-previewin koodauksessa vaikka se on halvempi. Tehtävät olivat LeetCodesta.

Mutta tämä kehitys on kyllä vauhdikasta. Tässä saa kohta tosissaan olla huolissaan koodaustöiden vähenemisestä.
Voi hyvin olla että menee noin. Paljon ne osaa tuunata pienempiäkin malleja hyvään kuntoon. Pitää jossain kohtaa kokeilla ongelmia mitkä o1 ratkoo että osaako mini myös.

En hirveästi pelkäis työpaikkojen puolesta. Tekemistä riittänee vaikka työn luonne voi muuttua. Kaikenmaailman protoilut ja testailut supernopeaa nykyisillä kielimalleilla. Eilen teetätin cursorilla python applikaation mikä kytkee itsensä kiinni lokaaliin kielimalliin ollaman api:n läpi + chatbot tuohon päälle. Tavoite mulla pikkuhiljaa rakennella ja testailla voisiko joku rogue like peli toimia kokonaan kielimallin päällä nopanheittojen sun muiden sijaan. NPC:t agentteja, kielimalli pelinjohtaja joka päättää onnistuuko asiat jne. Voi yrittää mitä vain ja kielimalli päättää onnistuiko vai ei ja mitä tapahtui.
 
Windsurf on kyllä kova, muutaman päivän koodaillut sen kanssa ja saa kyllä paljon aikaan. Toki tekee virheitä, mutta enimmäkseen pieniä sellaisia. Angularin kanssa testattu.
 
Windsurf on kyllä kova, muutaman päivän koodaillut sen kanssa ja saa kyllä paljon aikaan. Toki tekee virheitä, mutta enimmäkseen pieniä sellaisia. Angularin kanssa testattu.
Näyttää käyttävän pohjalla claude sonnet3.5 ja openai:n 4o:ta. Jos noi ei ratko niin openai:n o1 ja o1-mini on koodingenerointiin yms. vielä pykälää parempia.

Näyttää tosi hienoilta webbisivun pohjalta noi windsurfin agenttiominaisuudet yms. Todella kiva nähdä, että ide puolella kova kilpailu. Puskee nuo vscode(+extensiot copilot yms), windsurf, cursor jne. toisiansa eteenpäin. Ei varmaan muutaman vuoden päästä enää ole kaikkia noita jäljellä ja joku tekee ns. parhaan ide:n mihin maksavat asiakkaat päätyvät.

o1-mini ja o1 ratkoivat päivän advent of code luukun. claude sonnet 3.5 epäonnistui. En jaksanut kokeilla llama3.3:70b:ta lokaalisti, kun se epäonnistui niin dramaattisesti eilen. Joku päivä pitäs kokeilla noita tehtäviä lokaalilla qwen coder:lla.
 
Tulevaisuus on varmaan sellainen, että yritys/projektikohtaisesti hiotaan valittua mallia niin saadaan lopputulos paremmaksi. Samalla ehkä voidaan mallia pienentää niin saadaan avustinta nopeammaksi ja halvemmaksi käyttää. openai julkaisi perjantaina, että heidän o1:sta voi tuunata. SDK/Fameworkkien tekijöiden kannattaisi auttaa kielimallien tuunauksessa Ehkä apple, microsoft, google optimoivat kielimalleja ensin ja helpottavat devaajien elämää.



edit. advent of code jatkuu. 10. päivän luukkua kokeilin cursor+o1 minillä. Ratkaisi laakista. Yllätyksenä cursoriin integroitu o1 mini teki ratkaisulle myös yksikkötestit.
 
Viimeksi muokattu:
Keräsin kaikilta levyiltä ja varmuuskopioista kuva ja mediatiedostot yhteen läjään. Halusin löytää ja poistaa duplikaatit. Kokeilin openai:n o1:lla generoida duplikaatit etsivän python skriptin. Ainakin päällepäin koodia mulkoilemalla ja pienellä datasetillä testattuna tuntuisi olevan toimiva.

prompti
Create a python app that takes in a path and finds all duplicate files. List of duplicates is printed out. Duplicates are defined as option a) files with same name and size or option b) same name, size and checksum based on file content. Use argparse to take in root path for finding duplicates and mode of operation i.e. is duplicate defined in way a or b
Koodi:
import argparse
import os
import hashlib

def file_checksum(path, chunk_size=8192):
    """Compute the SHA-256 checksum of a file."""
    sha256 = hashlib.sha256()
    with open(path, 'rb') as f:
        for chunk in iter(lambda: f.read(chunk_size), b''):
            sha256.update(chunk)
    return sha256.hexdigest()

def find_duplicates(root_path, mode):
    # Dictionary to hold file groups:
    # For mode 'a': key = (filename, size)
    # For mode 'b': key = (filename, size, checksum)
    file_map = {}

    for dirpath, dirnames, filenames in os.walk(root_path):
        for fname in filenames:
            fpath = os.path.join(dirpath, fname)
       
            # Skip non-files
            if not os.path.isfile(fpath):
                continue
       
            size = os.path.getsize(fpath)
            if mode == 'a':
                key = (fname, size)
            else:
                # mode b: also compute checksum
                chksum = file_checksum(fpath)
                key = (fname, size, chksum)
       
            if key not in file_map:
                file_map[key] = [fpath]
            else:
                file_map[key].append(fpath)

    # Extract only groups that have duplicates
    duplicates = [paths for paths in file_map.values() if len(paths) > 1]
    return duplicates

def main():
    parser = argparse.ArgumentParser(description="Find duplicate files.")
    parser.add_argument("root_path", help="Root path to search for duplicates")
    parser.add_argument("--mode", choices=['a', 'b'], default='a',
                        help="Mode of operation: 'a' for name and size, 'b' for name, size, and checksum")
    args = parser.parse_args()

    duplicates = find_duplicates(args.root_path, args.mode)

    if duplicates:
        print("Duplicate files found:")
        for group in duplicates:
            print(" - " + "\n   ".join(group))
            print()
    else:
        print("No duplicates found.")

if __name__ == "__main__":
    main()

Prompti ja toteutus optimoimaan niin ettei tarkistussummaa lasketa ennen kuin löytyy mahdollinen duplikaatti
please optimize so that in mode b checksum is only calculated if a potential duplicate indicated by filename+filesize comparison is found
Koodi:
import argparse
import os
import hashlib

def file_checksum(path, chunk_size=8192):
    """Compute the SHA-256 checksum of a file."""
    sha256 = hashlib.sha256()
    with open(path, 'rb') as f:
        for chunk in iter(lambda: f.read(chunk_size), b''):
            sha256.update(chunk)
    return sha256.hexdigest()

def find_duplicates(root_path, mode):
    # If mode 'a', we just group by (filename, size).
    # If mode 'b', we do a two-step approach:
    #   Step 1: Group by (filename, size)
    #   Step 2: For groups that have more than one file, compute checksums
    #            and refine grouping by (filename, size, checksum).

    # First grouping: by (filename, size)
    first_level_map = {}
    for dirpath, dirnames, filenames in os.walk(root_path):
        for fname in filenames:
            fpath = os.path.join(dirpath, fname)
            if not os.path.isfile(fpath):
                continue
            size = os.path.getsize(fpath)
            key = (fname, size)
            first_level_map.setdefault(key, []).append(fpath)

    if mode == 'a':
        # In mode 'a', duplicates are those with the same (filename, size).
        duplicates = [paths for paths in first_level_map.values() if len(paths) > 1]
        return duplicates

    else:
        # mode 'b':
        # We have candidates from first_level_map. For any entry that has more than one file,
        # we compute checksums to distinguish them.
        second_level_map = {}
        for key, paths in first_level_map.items():
            if len(paths) == 1:
                # Only one file in this group, no duplicates here, skip.
                continue

            # Compute checksums now since multiple files share (fname, size)
            for fpath in paths:
                chksum = file_checksum(fpath)
                # Refine key: (filename, size, chksum)
                refined_key = (key[0], key[1], chksum)
                second_level_map.setdefault(refined_key, []).append(fpath)

        # Now find duplicates from second_level_map
        duplicates = [paths for paths in second_level_map.values() if len(paths) > 1]
        return duplicates

def main():
    parser = argparse.ArgumentParser(description="Find duplicate files.")
    parser.add_argument("root_path", help="Root path to search for duplicates")
    parser.add_argument("--mode", choices=['a', 'b'], default='a',
                        help="Mode of operation: 'a' for name and size, 'b' for name, size, and checksum")
    args = parser.parse_args()

    duplicates = find_duplicates(args.root_path, args.mode)

    if duplicates:
        print("Duplicate files found:")
        for group in duplicates:
            print(" - " + "\n   ".join(group))
            print()
    else:
        print("No duplicates found.")

if __name__ == "__main__":
    main()
 
Viimeksi muokattu:

Statistiikka

Viestiketjuista
261 218
Viestejä
4 534 826
Jäsenet
74 756
Uusin jäsen
Bever

Hinta.fi

Back
Ylös Bottom