Researcher-builder working on language models, reasoning, evaluation, and AI systems. Writing, projects, publications, and talks by Pittawat Taveekitworachai.
AI is transcending the boundaries of linguistics, forging a 'common language' that unites disparate disciplines. As we enter a new era where questions matter more than answers.
AI promises a more efficient future for companies, but its endgame is often substitution rather than assistance. Once our work, voice, and behavior can be copied, we are pushed into a deeper question: what, exactly, makes a person a person?
A collaborative research project exploring whether small models can outperform frontier models—like Gemini 2.5 Pro—when trained to produce ranked lists that better reflect real clinical reasoning.
In recent years, large language models (LLMs) have evolved beyond text-based chatbots into agents capable of executing tools—functions that let them gather new information, interact with external systems, or even take actions that affect the real world.
Learn how to extend Typhoon's capabilities using the Model Context Protocol (MCP). This article covers integrating Typhoon with any MCP server, building a weather-aware trip consultant, exploring Typhoon's own MCP server with built-in prompt templates, and trying it all live in the Typhoon playground.
Natural language agents like Siri and Alexa are evolving through generative models and transformers, generating human-like responses and revolutionizing language processing. The future of these agents involves multi-modal capabilities for interacting with the physical world in healthcare and disaster relief. Responsible development and ethical use are important due to the agents' potential and…
Life is a journey full of twists and turns, ups and downs, and unexpected surprises. It is a journey that is shaped by various factors, including our personal experiences, values, and skills. Throughout my life, I have learned that there are certain skills and philosophies that have significantly influenced and driven my journey. These skills and philosophies have helped me navigate through the…
When working with large datasets in CSV format, it can be challenging to process them efficiently. One solution to this problem is to split the large CSV file into smaller files with an equal number of rows using the Pandas library. This tutorial will show you how to split a large CSV file into smaller ones based on the given code.
Wisdom is a familiar word, but its meaning is less obvious than it first appears. What exactly is wisdom? How is it different from knowledge? And can it be categorized in a meaningful way?
Google I/O, Google's annual flagship update event, showcases new innovations for everyday users and developers alike. This year (2021) brought several exciting Flutter updates that paint a compelling picture for the framework's future.
Events are fundamental to JavaScript in the browser. To understand why multiple handlers may run from a single click, you need to understand event bubbling and capture.
Flutter Engage, the annual flagship event for Flutter, is just around the corner—bringing updates and plenty of new announcements. Now's the perfect time to speculate on what we might see.
In this session, Masashi Sugiyama discussed three main topics: trends in machine learning research, his group's current work, and where ML research may be heading next.
If you've started using Flask with Jinja as your template engine and need to handle forms, you're probably familiar with `request.form.get("name")` and similar approaches to access data sent from the front-end. Of course, once we receive that data, we need to validate or verify that it matches our expected format before processing it further. At a high level, the workflow looks something like…
The `built_value` package is powerful, but some of its error messages are far less helpful than they should be. One of the most confusing is `Deserializing failed due to Error: Bad State No element`.
built_value is a beloved package and one of the most popular source generators among Flutter developers. However, working with it isn't always straightforward, and not every error message is easy to decipher.
Software development is not merely a science that requires knowledge, but also an art of weaving words together to command machines to work as we intend. Of course, when developing software alone, you can write code however you like in whatever style—no one will complain. But when working in a team, your coding style might leave others stunned.
When developing with Dart, especially when using third-party packages or following tutorials, you've probably come across the `..` symbol followed by property or method names. But what exactly does this `..` or Cascade Notation do?
Often we have content larger than the screen or parent widget, but we don't want users to lose information they might need. For example, we might have a huge table where the text becomes tiny. We'd need to zoom in to see clearly, but that would cut off data outside the viewport. Wouldn't it be better if users could pan and scroll to see the off-screen content? That's exactly what InteractiveViewer…
In unsupervised learning, clustering is essential for uncovering natural groupings in data, helping us gain new insights. Two of the most common approaches are K-Means Clustering and Hierarchical Clustering—but how do they actually differ under the hood?
Even though smartphones today come with increasingly larger storage every year — most now ship with 64–128GB (2020) — developers must always remember that this space isn't reserved solely for our apps. That storage belongs to users: for their photos, videos, and important documents that shape their daily lives. This is precisely why app size matters, and it's something Flutter has consistently…
BuildContext appears almost everywhere in our code, and it's something Flutter developers simply have to live with. Many times, some people may not understand why we use Context at all, but this isn't a new concept. In many languages, Context appears just the same.
built_value is a beloved package and one of the most popular source generators among Flutter developers. However, working with it isn't always straightforward, and not every error message is easy to decipher.
In early 2020, Flutter revamped its release system and version numbering scheme to make things clearer for developers and easier for contributors to participate in Flutter's development.
Separating different types of errors—such as those from external APIs your app connects to versus errors originating from your own application—can be handled with if-else blocks, but wouldn't it be nicer to have a clean, ready-to-use function instead?
The two main approaches we typically use to keep our widget trees organized are extracting code into a widget (Extract as a Widget) and extracting code into a method (Extract as a Method). Both clearly help us achieve reusable code, but which one should you use, and when? What factors deserve consideration? This article will help answer those questions.
Programming and bugs are practically inseparable. Whether we like it or not, bugs come in many shapes and forms. Syntax errors or compile-time errors are relatively easy to fix since the compiler points out exactly where we went wrong and sometimes even suggests a fix. But what about when our program behaves in ways we never intended?
Flutter 1.20 was one of the largest updates the framework had released at the time, shipping not only framework changes but also Dart 2.9.0, a new DevTools release, and IDE plugin updates.
Using third-party libraries is essential in modern development. Yet we often find ourselves thinking, "I wish this library exposed one more helper" or "I wish this API behaved a little differently." When it's our own code, we can just change it. But what about libraries we don't control? Dart's Extension Methods, introduced in version 2.7, offer an elegant solution.
The world of product and service development today has seen many new methodologies emerge to help businesses operate more effectively. Dogfooding is one such methodology.
If you've ever browsed Flutter's Issues on GitHub, you've probably noticed the sheer number of labels—some immediately clear, others rather cryptic. This post breaks down what each one means, whether you're curious about what's coming in the next Flutter release or looking to contribute.
About a month ago, Apple held WWDC2020, where they unveiled new operating system versions for their various products, releasing Beta versions for developers to test whether iOS 14 would cause issues with existing applications. Within the Flutter developer community, several interesting developments have emerged regarding the upcoming iOS 14. Let's take a look at what's in store.
Shortly after bloc v5 and flutter_bloc v5 were released—with the major change of introducing cubit as the foundation for state management and building bloc on top of it—Felix Angelov quickly followed up with bloc and flutter_bloc v6. The key change in this version brings cubit inside bloc itself, rather than having it as a dependency that bloc calls upon. Along with other improvements and bug…
Building a responsive site is not only about layout. Readability matters too, and one of the easiest ways to improve line breaking in difficult phrases is a small HTML tag called ` `.
Every programming language comes with its own best practices and syntax conventions to help us write better code. Of course, making a system work isn't particularly difficult. But writing good code involves many different elements that go far beyond mere functionality.
Digimon, a beloved childhood cartoon for so many of us, and one that many grew up alongside. Digimon Adventure: Last Evolution Kizuna serves as a meaningful conclusion to over 20 years of journey between the chosen children and their Digimon. This animated film is part of the Digimon 20th anniversary celebration project.
pub.dev, the go-to website for developers using the Dart language and frameworks like Flutter to search for packages and plugins to use in their applications without having to write all the code themselves, has received a major update today. Not only has the look and feel changed, but new convenience features have been added as well!
One of the most common user-initiated patterns for loading fresh data—especially on Android and apps following Material Guidelines—is the Swipe to Refresh gesture. Typically, you have a list that you can pull down from the top, release, and see a spinning indicator showing that new data is being downloaded. Once complete, the indicator disappears and the list updates with fresh content.
Almost every program we write involves changing the type of variables or values (type conversion)—whether to make operations easier or to integrate with third-party libraries. In reality, type conversion falls into two main categories: Casting and Coercing. This article explores how these two approaches differ.
If you use BLoC for application state management, chances are you also rely on the `bloc` and `flutter_bloc` packages. Version 5 was a major release, and it came with several API and architectural changes worth knowing about.
A great application is one that everyone can access and use. Accessibility is an important topic that not only demonstrates our belief in equality, but also represents a business opportunity to expand our customer base. In this article, we'll explore Semantics, one of the Widgets related to Accessibility, especially for users who rely on screen readers.
Sometimes we want our Widget to take up all the remaining space in a Column or Row, or we may want each Widget within a Column/Row to share space equally. The two Widgets commonly used to handle these situations are undoubtedly Flexible and Expanded. So what's the difference between them?
When we write programs in certain languages, we often need a compiler to translate that language into another—for example, TypeScript being compiled into JavaScript, or Java being compiled into Java Bytecode (which then runs on the JVM). The two types of compilers we commonly encounter are JIT Compiler and AOT Compiler. This article will walk you through how they differ.
One of the key advantages of developing mobile applications with Flutter is Hot Reload, which makes UI development in the mobile app world significantly smoother. You can see the results (almost) instantly when you save your code files. This stems from the fact that the Flutter team originally came from a web development background, where instant feedback upon saving was the norm, and they wanted…
Not every button and card that Flutter provides out of the box will cover all our design needs. Flutter recognizes this well, which is why it offers a widget called GestureDetector to give developers as much flexibility as possible in crafting beautiful UIs. However, despite its many capabilities, GestureDetector doesn't always fit the bill.
If you need short text input from users in Flutter, it is easy to wonder whether you should use `TextField` or `TextFormField`. The answer becomes clearer once you look at what each widget is designed for.
Every computer system needs fast-access storage for data, and that's exactly what Main Memory is. However, we all know that Main Memory comes at a steep price per gigabyte compared to Hard Disk Drives (HDD). Because of this, the Operating System (OS) must do everything it can to manage Main Memory as cost-effectively as possible.
In today's software development landscape, it's rare to find any program that doesn't rely on public dependencies. At the very least, we regularly use utility libraries in our projects—take lodash, the famous Node.js package that many of our dependencies likely pull in even when we don't use it directly.