diff --git a/project-topics/README.md b/project-topics/README.md index cea751f..94eca29 100644 --- a/project-topics/README.md +++ b/project-topics/README.md @@ -84,26 +84,28 @@ 25. Работа с крайни автомати 26. Работа с размити множества -## AI +## AI / ML / Data Science (пишете ни, ако не намерите подходящ набор от данни (dataset) за вашата идея) (също пишете, ако ви е много интересна някоя тема, но нямате идея как да я реализирате) -26. Trading bot -27. Предсказване на възраст/пол/настроение по снимка -28. Сегментиране на потребители/клиенти -29. Откриване на аномалии/измами -30. Засичане на природни бедствия (наводнения, пожари, нефтени разливи или др.) по сателитни снимки -31. Класифициране на ревюта (на хотели, книги, филми или др.) или коментари/постове в соц. мрежи -32. Препоръчваща система (на книги, филми, музика или др.) -33. Откриване на медицински заболявания (напр. рак, тумори, паркинсон или др.) -34. Машинен превод -35. Генериране на текст (например статии, истории и др.) в нечий стил -36. Fake news detector / fact-checker -37. E-Mail spam detector -38. Предвиждане на цена за кола/имот -39. Чат по собствени файлове или база данни/знания -40. Правен асистент -41. Платформа за създаване на и roleplay чат с различни AI "геройчета" -42. Brainrot video generator (например текст към глас върху видео от игра) -43. Video/podcast summarizer -44. AI софтуерен екип - бизнес анализатор, програмист, QA +27. Trading backtesting система +28. Machine Learning + 1. Предсказване на възраст/пол/настроение по снимка + 2. Сегментиране на потребители/клиенти + 3. Откриване на аномалии/измами + 4. Засичане на природни бедствия (наводнения, пожари, нефтени разливи или др.) или обекти (облаци, ниви, т.н.) по сателитни снимки + 5. Класифициране на ревюта (на хотели, книги, филми или др.) или коментари/постове в соц. мрежи + 6. Откриване на медицински заболявания (напр. рак, тумори, паркинсон или др.) + 7. E-Mail spam detector + 8. Генериране на описания на изображения (image captions) +29. RAG системи + 1. Обобщение на новини и статии от интернет по дадена тема + 2. Асистент за пазарни анализи и финансови новини + 3. Персонализиран гид за пътувания (събира информация за дестинации, атракции, ресторанти) + 4. Асистент за сравнение на продукти и цени от различни онлайн магазини + 5. Чатбот за техническа поддръжка (Support Chatbot) + 6. Персонализиран асистент за учене +30. AI-базирани приложения / агентизирани системи + 1. Brainrot video generator + 2. Video/podcast summarizer + 3. AI софтуерен екип diff --git a/project-topics/ai-ml-data_science/27-trading.md b/project-topics/ai-ml-data_science/27-trading.md new file mode 100644 index 0000000..9a6b824 --- /dev/null +++ b/project-topics/ai-ml-data_science/27-trading.md @@ -0,0 +1,27 @@ +# Тема за проект: Trading backtesting система + +## Описание +Създайте система за backtesting стратегии за търговия на активи на финансови пазари. + +## Основна функционалност +- Зареждане на исторически данни от интернет. Избор за един тип данни от следните видове: акции, крипто, форекс, опции. +- Възможност за дефиниране и изпробване на различни стратегии за търговия, които взимат решения на база на минали данни и технически индикатори (като rolling averages, RSI, MACD и др.). +- Избор на период от време за симулация. +- Задаване на начален размер на портфолиото. +- Изчисляване на ключови показатели за ефективност на стратегията, като обща възвръщаемост за периода (печалба в % от портфолиото, и отделно в % от рискуваните пари), максимална загуба, съотношение на Шарп и други. +- Сравниение на всяка една стратегия с базови стратегии като например "купи и задръж" (просто long позиции по избраните активи за целия период), както и с движението на S&P500 индекса (ticker: [`SPX`](https://finance.yahoo.com/quote/%5ESPX)) за периода. + +## Технически изисквания +- Демо апликация, който да пуска симулацията и да визуализация на резултатите чрез подходящи графики и таблици. +- API с endpoint, който да позволява пускането на backtest симулация с подадени параметри (име на стратегия, период, начален капитал и др.) и връщане на резултатите (метрики) в JSON формат. + +## Препоръчителни технологии +- Зареждане на финансови данни: `alpaca-py`, `yfinance` +- Демо апликация: `streamlit` +- Работа с данни: `pandas`, `numpy` +- Графики: `plotly` (има специални видове графики за финансови данни), `matplotlib`, `seaborn` +- API: `FastAPI`, `Flask` +- LLMs (ако е приложимо): `openai`, `anthropic` и др. - специфичната библиотека зависи от доставчика на модела + +## Бонус функционалности +- Имплементиране на стратегии, която използва API на някой LLM (GPT/Claude/DeepSeek/Kimi/т.н.) за вземане на решения за търговия, чрез анализ на новини/статии/доклади при вземане на решения. \ No newline at end of file diff --git a/project-topics/ai-ml-data_science/28-machine-learning.md b/project-topics/ai-ml-data_science/28-machine-learning.md new file mode 100644 index 0000000..f097f8e --- /dev/null +++ b/project-topics/ai-ml-data_science/28-machine-learning.md @@ -0,0 +1,69 @@ +# Тема за проект: Machine Learning + +## Описание + +Всички от изброените теми изискват използването на machine learning модели за класификация. Целта е на база наличните данни да се предвиди класа (категорията), към който принадлежи нов, непознат пример. + +За реализирането на всяка тема се изисква подходящ набор от данни (dataset). Можете да потърсите и използвате публично достъпни такива (например от [Kaggle](https://www.kaggle.com/datasets), [UCI Machine Learning Repository](https://archive.ics.uci.edu/ml/index.php) или др.), или да съберете свои собствени (например чрез уеб скрейпинг, анкети и др.). Пишете ни, ако не намирите нищо подходящо. + +## Варианти + +1. Предсказване на възраст/пол/настроение по снимка +2. Сегментиране на потребители/клиенти +3. Откриване на аномалии/измами +4. Засичане на природни бедствия (наводнения, пожари, нефтени разливи или др.) по сателитни снимки +5. Класифициране на ревюта (на хотели, книги, филми или др.) или коментари/постове в соц. мрежи +6. Откриване на медицински заболявания (напр. рак, тумори, паркинсон или др.) +7. E-Mail spam detector +8. Генериране на описания на изображения (image captions) + +## Задължителни основни изисквания + +- Избор и подготовка на подходящ набор от данни (dataset). +- Избор на готов machine learning модел, който може да се използва за класификация в дадения контекст. + - Може да намерите и свалите предварително обучен (pre-trained) модел, специално създаден за решаване на конкретната задача. [Hugging Face](https://huggingface.co/models) е добра отправна точка. + - Алтернативно, за задачи с данни в свободен текст и/или снимки, може просто да използвате наготово претренирани големи модели с по-обща насоченост, като например LLM-и (Large Language Models). Има и такива с отворен достъп, но поради големите ресурси, които се изискват за локалното им пускане, препоръчваме директно извикване на модели чрез съответните им API-та (като тези на OpenAI, Anthropic, Google Vertex, DeepSeek, Qwen и др.). (Повечето са платени, но не вярваме повече от един-два долара да изразходите за целите на всички задачи. Все пак внимавайте с броя данни и сметнете очаквания разход по токени преди да пуснете някой платен модел по целия набор от данни.) +- Избор на подходящи метрики за оценка на модела. +- Имплементация на процес за оценка на модела върху тестовите данни, като се използват избраните метрики. Визуализация на резултатите с подходящи графики. +- Кратка демо апликация, която позволява на потребителя да получи предсказание от модела и да го изпробва. + +## Задължителен избор от следните допълнителни изисквания (изберете 1): +### Вариация А +- Трениране на собствен модел. + - Избор и имплементация на подходящ вид модел - напр. дървета, SVM, невронни мрежи (напр. feedforward, CNN, RNN, трансформъри). т.н. За тема 3 (аномалии) е възможен и unsupervised подход. Възможен е и хибриден подход - например фино настройване (fine-tuning) на предварително обучен трансформър модел. + - Разделяне на данните на тренировъчни и тестови (евентуално и валидационни). + - Трениране на модела върху тренировъчните данни с оценка върху валидационните чрез подходяща loss функция. + - Резултати от тренирането - графика на loss за всяка епоха и на избрани метрики. + - Baseline сравнение, както и сравнение с модела избран за предишните изисквания. +- Възможност за селекция в демо апликацията между различните модели. + +### Вариация Б +- Избиране на поне още един готов претрениран модел, който може да бъде използван за целите на задачата. +- Разширяване на оценяващия скрипт с поддръжка на всички модели. Сравнение между тях. +- Създаване на API, което позволява използването на моделите по подадени данни. +- Конфигурация в текстов файл, с която се указва избрания модел, с който да работи API-то (както и параметрите му). + +## ВАЖНО +- Поради големината им, **НЕ ДОБАВЯЙТЕ** наборите от данни, както и файловете с чекпойнти на модели в Git и в Мудъл! Dataset-овете и моделите могат ви стоят локално под различни папки, които да бъдат написани в `.gitignore`, за да не бъдат отразени в git. Но не забравяйте да ги махнете от архива за качване в Мудъл, за да няма гигабайтови зипове. +- Не "хардкодвайте" ключове за API-та (и друга поверителна информация като пароли) в кода! Ако имате `.env` файл с ключове за API-та, също го добавете в `.gitignore`! В противен случай някой може да ви открадне достъпа до тези API-та и да използва парите ви за свои цели (понеже за курса изискваме да качите проектите в публични Github репозиторита). + +## Препоръчителни технологии +- Работа с набори от данни: `pandas`, `numpy` +- Графики: `matplotlib`, `seaborn` +- Локално зареждане на модел: `transformers`, `pytorch` +- Извикване на модели чрез API: `openai`, `anthropic`, т.н. - специфичната библиотека зависи от доставчика на модела +- Метрики: `scikit-learn` или ръчна имплементация +- Демо апликация: `streamlit` +- API: `FastAPI`, `Flask` +- Конфигурация: `yaml` или `json` (вградена) или `configparser` (вградена, за INI файлове) +- Трениране на модели: `scikit-learn` (за традиционни модели), `pytorch` (за невронни мрежи), `transformers` (за fine-tuning на трансформъри) +- Уеб скрейпинг (ако е необходимо за събиране на данни): `requests`, `BeautifulSoup`, `scrapy`, `aiohttp` +- Обработка на изображения (ако е необходимо): `Pillow`, `OpenCV` +- Обработка на текст (ако е необходимо): `nltk`, `spaCy`, `transformers` + +## Незадължителни и бонус елементи +- Notebook с анализ на данните (exploratory data analysis - EDA) преди трениране на модел. +- Notebook с визуализации на резултатите от модела/моделите (например confusion matrix, ROC curve, precision-recall curve и др.). +- Оптимизация на хиперпараметрите (hyperparameter tuning) при трениране на модел. +- Крос-валидация (cross-validation) при трениране на модел. +- Използване на GPU за трениране на модели (ако е приложимо). \ No newline at end of file diff --git a/project-topics/ai-ml-data_science/29-RAG.md b/project-topics/ai-ml-data_science/29-RAG.md new file mode 100644 index 0000000..31ccd51 --- /dev/null +++ b/project-topics/ai-ml-data_science/29-RAG.md @@ -0,0 +1,64 @@ +# Тема за проект: RAG система + +## Описание + +RAG (Retrieval-Augmented Generation) системите са комбинация от големи езикови модели (LLMs) и методи за извличане на информация (retrieval). Те позволяват на моделите да генерират текст, базиран на външни източници на данни, което подобрява качеството и релевантността на отговорите. + +Такива системи работят в две последователни стъпки: +1. **Извличане на информация (Retrieval)**. "Външното знание" на бота. Целта на тази стъпка е да се извлече най-релевантния контекст, който след това да бъде подаден на езиковия модел. Това може да бъде търсене в интернет, ровене из налични локално файлове, търсене в бази данни или бази знания. +2. **Генериране на текст (Generation)**. Отговорът на бота. Извлечените най-релевантни парчета с информация се прикрепят към първоначалната заявка на потребителя и така се подават като цял един user prompt към езиковия модел (LLM). + +## Варианти + +1. Обобщение на новини и статии от интернет по дадена тема +2. Асистент за пазарни анализи и финансови новини +3. Персонализиран гид за пътувания (събира информация за дестинации, атракции, ресторанти) +4. Асистент за сравнение на продукти и цени от различни онлайн магазини +5. Чатбот за техническа поддръжка (Support Chatbot) +6. Персонализиран асистент за учене + +## Задължителни изисквания +- Само за теми 1-4: събиране на информация от интернет по дадена тема чрез публични API-та. Това се случва в стъпката за извличане на информация (retrieval). +- Само за теми 5 и 6: предварително запазване на корпус от документи/файлове, от които да се извлича информацията, с което и отделен скрипт, който да я подготвя (парсва, почиства, разбива на парчета, индексира/векторизира и съхранява в база данни, вж. техническите бележки долу). В стъпката за извличане на информация (retrieval) се търси в тази база данни. +- Използване на голям езиков модел (LLM) за генериране на отговори, като се подава извлечената информация като контекст. +- Указание към езиковия модел да посочва източниците на информация (т.е. линкове към статиите или имената на файловете) при генерирането на отговори, под формата на markdown връзка с валиден линк. Примери: + - `Според статията от (Вестник 24 Часа)[https://24chasa.bg/statiq], ...` + - `Python е динамично-типизиран, интерпретируем език за програмиране. (Лекция 1)[file:///path/to/your/local/files/lecture1.md]` (абсолютният път към файла може да бъде "хардкоднат" в скрипта за обработка на корпуса с файлове) +- Продължаване на диалога (conversation history) между потребителя и системата, като се запазват последните няколко съобщения в разговора (в база данни) и се подават към езиковия модел като контекст при всяка нова заявка. +- API, което позволява на потребителя да взаимодейства с RAG системата чрез подаване на заявки и получаване на отговори: + - задължителен endpoint за подаване на заявка и получаване на отговор от системата чрез streaming (Server-Sent Events) (за повече инфо виж техническите бележки долу) на всеки токен в JSON формата `{"success": true|false, "content": "..."}`, където: + - при успешно генериране на отговор, `success` е `true`, а `content` съдържа следващия токен от отговора; + - при прихваната грешка, `success` е `false`, а `content` съдържа съобщението на грешката; +- Кратко демо/тестово приложение, което освен че позволява на потребителя да изпробва RAG системата, също така дава опция да се промени системния prompt (инструкцията към езиковия модел) и други параметри като температура, максимален брой токени и др. + +## Технически бележки и препоръки + +1. **Retrieval**: + - За задачите, в които се изисква извличане на информация, намираща се в набор от файлове, препоръчваме използването на векторни бази данни (vector databases) като ChromaDB, Pinecone и др. Те предоставят наготово алгоритмите за разбиване на корпуса на парчета от текст (chunking), модели за векторизация на тези парчета (embedding models) и бързо търсене на най-подходящите такива (similarity search), като всичко това може да се случи с [няколко реда код](https://docs.trychroma.com/docs/overview/getting-started). Приложим е и друг по-традиционен метод за постигане на целта с класическо индексиране посредством методи като TF-IDF & BM25 (чрез Elasticsearch например), както и хибриден подход. Имплементирайте който прецените вие с подходяща библиотека. + - Обикновените текстови файлове са по-лесни за парсване и дават по-добри резултати от PDF-и. + - За задачите, в които се изисква извличане на информация от интернет, може да използвате публични API-та като това на DuckDuckGo. Имат и [библиотека](https://pypi.org/project/duckduckgo-search/#4-news)]. Няма нужда да минавате през уеб скрейпинг, освен ако не искате да съберете специфична информация от определени сайтове. Чрез ограчаване на събраната информация до подходящ брой статии/токени, може да я подадете към LLM-а без да има нужда да се разделя и векторизира, както в горния случай. +2. **Generation**: + - Има и такива LLM-и с отворен достъп, но поради големите ресурси, които се изискват за локалното им пускане, препоръчваме директно извикване на модели чрез съответните им API-та (като тези на OpenAI, Anthropic, Google Vertex, DeepSeek, Qwen и др.). (Повечето са платени, но не вярваме повече от един-два долара да изразходите за целите на всички задачи. Все пак внимавайте с броя данни и сметнете очаквания разход по токени преди да изпробвате.) + - Streaming отговорите се реализират чрез Server-Sent Events (SSE). Повечето LLM API-та поддържат такъв режим на работа. Във FastAPI например това се реализира чрез [`StreamingResponse`](https://fastapi.tiangolo.com/advanced/custom-response/?h=streamingresponse#streamingresponse), на който се подава генератор. +3. Prompt engineering: + - LLM-ите имат два различни prompt-a, които се указват: системен (system) и потребителски (user). Системният се подава веднъж в началото на всеки разговор и инструктира модела как да се държи (напр. `Ти си асистент за пазарни анализи и финансови новини...`), а потребителският е самата текуща заявка на потребителя, към която и трябва да се добавя извлечената информация като контекст (напр. `#Context: ... \n\n #User query: Чудя се дали да инвестирам в акции на Nvidia. Искам да ми дадеш пълен анализ относно приходите и разходите на компанията, както и сентимент от последните новини.`). + - Експериментирайте с различни формулировки на системния prompt, за да видите как това влияе на отговорите на модела. Може да се позовавате на официалните ръководства за [GPT-5](https://cookbook.openai.com/examples/gpt-5/gpt-5_prompting_guide) или за [Claude](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/overview?ref=prompt-engineer.com). + - "Reasoning" моделите (например GPT-5 и GPT-5.1) са много по-бавни и често хабят повече токени (следователно и пари). Препоръчваме да започнете с нормален модел (например GPT-4.1) и ако след изчерпателна експериментация не сте доволни от качеството на отговорите, чак тогава да преминете към някой reasoning модел. Понеже, особено при OpenAI, именуването им е безразборно, проверявайте първо в [официалната документация](https://platform.openai.com/docs/models) кой модел е reasoning и кой не, както и дали може да се спира това свойство)) +4. Относно демо приложението: `Streamlit` предлага прост чат интерфейс графичен компонент, с поддръжка на streaming: [тук има инструкции и пример](https://docs.streamlit.io/develop/tutorials/chat-and-llm-apps/build-conversational-apps#build-a-simple-chatbot-gui-with-streaming). + +## **ЗАБРАНЕНИ БИБЛИОТЕКИ** +`langchain`, `langgraph`, `llama_index`, `agno`, `adk`, `pydantic-ai` и всякакви агентизирани библиотеки за работа на по-високо ниво с LLM агенти и RAG системи. С тях просто задачата може да се напише твърде бързо и лесно, без много собствена имплементация и мислене, а и няма какво повече да добавим като изисквания, така че да има как качествено да оценим Python знанията ви. Ако използвате такива библиотеки, максималните точки за критерия "функционалност" ще бъдат наполовина. + +## Препоръчителни технологии +- LLMs: `openai` или `anthropic` и др. - специфичната библиотека зависи от доставчика на модела +- База данни (за запзване на съобщенията в диалога): SQLite (чрез `sqlite3` или `SQLAlchemy`), PostgreSQL (чрез `psycopg2` или `SQLAlchemy`), MongoDB (чрез `pymongo`) или др. +- Secrets management: `pydantic-settings` или `python-dotenv` +- API: `FastAPI` или `Flask` +- Демо апликация: `streamlit` +- Работа с векторни бази данни (ако е приложимо): `chromadb` или `pinecone` +- Работа с класически индекси (ако е приложимо): `elasticsearch` +- Търсене на уебстраници и съдъжрание (ако е приложимо): `duckduckgo-search` +- Scrape-ване на уеб страници (ако е необходимо): `requests`/`aiohttp`, `BeautifulSoup`, `scrapy` + +## Бонус функционалности +- Поддръжка на потребителска автентикация (регистрация и логин) diff --git a/project-topics/ai-ml-data_science/30-agents.md b/project-topics/ai-ml-data_science/30-agents.md new file mode 100644 index 0000000..f04f580 --- /dev/null +++ b/project-topics/ai-ml-data_science/30-agents.md @@ -0,0 +1,39 @@ +# Тема за проект: AI-базирани приложения / агентизирани системи + +## Описание +Създайте приложение, което използва AI модели (включително големи езикови модели (LLMs)) за автоматизиране на задачи чрез агенти, които могат да взаимодействат както помежду си, така и с външни системи и услуги. + +## Варианти + +1. Brainrot video generator +2. Video/podcast summarizer +3. AI софтуерен екип - бизнес анализатор, програмист, QA + +## Задължителни изисквания +- Скрипт, който приема входа на програмата и създава изхода във файл/ове. +- Използване на готови претренирани AI модели (като GPT-4, Claude, DeepSeek, Dall-E, Qwen, Gemini и др.) за изпълнение на задачи. + - В HuggingFace могат да се намерят много безплатни модели за всички видове задачи, които да се свалят и използват локално. + - Можете разбира се (особено при ограничен хардуерен ресурс) да използвате и платени API-та на доставчици като OpenAI, Anthropic, DeepSeek, Google Vertex, Kimi и др. Те имат различни цени, но за целите на проекта не би трябвало да изхарчите повече от няколко долара общо. + - Внимателно проучете възможностите на всеки модел и изберете подходящия за вашата задача. Например LLM-и поддържат и мултимодални входове или изходи (текст, изображения, аудио), докато други са само текстови. + - Предпочитайте специализирани модели за конкретни задачи (като Whisper за speech-to-text, Dall-E за генериране на изображения и др.), вместо да използвате големи езикови модели за всичко - така хем ще постигнете по-добри резултати, хем ще спестите пари. +- Разделяне на имплементацията на различни "агенти", които могат да изпълняват задачи чрез взаимодействие с AI модели. Всеки агент използва един AI модел. Например: + - Един агент може да отговаря за обработката на текст (генериране, обобщение, превод и др.) чрез LLM. + - Друг агент може да се занимава с генериране или обработка на изображения чрез подходящ модел. + - Трети агент може да извършва анализ на аудио файлове (speech-to-text или обратното). + - Агентите трябва да могат да комуникират помежду си, за да изпълняват сложни задачи. +- Запис в лог файл на всички стъпки от изпълнението на програмата, т.е.: входни данни, междинни резултати (резултатите от всеки агент и решенията, които се взимат) и крайни изходи. Това се прави с цел по-лесна проследимост и дебъгване. +- Предефиниране на няколко варианта/весии на агентизирата система (например чрез различни системни prompt-и и/лиили различни модели за агенти). +- Четене от конфигурационен файл на варианта/версията на системата (например "v1", "v2" и т.н.), която да се използва при стартиране на програмата. + +## Препоръчителни технологии +- Локално използване на AI модели: `transformers`, `diffusers`, `whisper`, `torch`, `tensorflow` и др. +- LLM/AI API-та: `openai`, `anthropic` и др., в зависимост от доставчика +- Работа с аудио: `whisper`, `pydub`, `librosa` +- Работа с изображения: `PIL/Pillow`, `opencv-python`, `openai` (за Dall-E), +- Генериране на видео: `moviepy`, `opencv-python` +- API (ако е приложимо): `FastAPI`, `Flask` +- Демо апликация (ако е приложимо): `streamlit` + +## Пожелателни (бонус) функционалности +- API, което позволява на потребителя да взаимодейства с агентизираното приложение чрез подаване на заявки и получаване на отговори, сваляне на файлове и др. +- Демо/тестово приложение, което позволява на потребителя да изпробва агентизираното приложение чрез графичен интерфейс. \ No newline at end of file