Showing posts with label Mã nguồn mở. Show all posts
Showing posts with label Mã nguồn mở. Show all posts

Robot chat thông minh

Tuesday, January 26, 2010 3 phản hồi

Có những ý tưởng ra đời từ sự điên rồ pha lẫn chút lãng mạn.

Có đôi lúc, tôi tự hỏi mình: khi buồn, vui mình sẽ nói với ai. Dù là người bạn thân nhất cũng không thể hiểu được hết chính mình. Tôi muốn tạo cho mình một người bạn - có thể giúp tôi trong công việc, cũng như có thể cho tôi những điều thú vị những lúc tôi cần.

Ngày cuối tuần lang thang, tôi nhớ lại những năm tháng sinh viên. Ngày đó, một người bạn gợi cho tôi cảm hứng viết một chú robot chat từ học kì thứ 3 ĐH. Chúng tôi loay hoay gần 3h đồng hồ để release một sản phẩm robot chat biết học và trả lời những câu hỏi - viết bằng C++. Cả phòng kí túc xá đông nghẹt những khán giả muốn thử "trí thông minh" của con robot này. Chương trình chỉ dựa trên sự so khớp độ chính xác giữa câu hỏi input và những dữ liệu có sẵn rồi đưa ra câu trả lời tương ứng. Sau đó, chúng tôi bỏ đi uống cafe và để lại con robot cho mọi người tha hồ thử nghiệm. Khi trở về, tôi thử chat lại với con robot thì ... than ôi, mỗi câu hỏi của tôi đều bị nó trả lời bằng những câu chửi hết sức bậy bạ (vì đã được train sau gần 2 tiếng đồng hồ). Chúng tôi bật cười và xem như đây là 1 thử nghiệm thất bại. Sau đó vì bận học, nên chúng tôi cũng dần quên đi ý tưởng này.


Đêm cuối tuần, tôi research một số lý thuyết về xử lý ngôn ngữ và những hướng tiếp cận của robot chat. AIML (ngôn ngữ đặc tả trí thông minh nhân tạo) là hướng tiếp cận phổ biến nhất hiện tại trên TG. Có một số hướng khác để hỗ trợ phân tích ngữ nghĩa cuộc thoại, máy học được bổ trợ để làm cho robot chat thông minh hơn. Tuy nhiên các cách tiếp cận này vẫn còn đang được nghiên cứu.

Tôi download được một bộ AIML parser viết trên C# và bắt tay vào những dòng code đầu tiên. Tôi release version 0.1 của robotchat với các tính năng để xử lý một cuộc thoại cơ bản chỉ có chào hỏi. Robot có thể nói với người về những đặc điểm riêng của chủ nó.

Ngày thứ hai, tôi phát hiện AIML vẫn thiếu những syntax mà tôi cần để phát triển ý tưởng. Tôi bắt tay customize AIML parser và hỗ trợ thêm một số tag cần thiết.

...
Dưới đây là các version tôi đã release internal sau 2 ngày coding:
v0.2: robot có thể tìm kiến thức trên wiki/google để trả lời cho người hỏi về những lĩnh vực nó không biết.









v0.3: nếu chủ nó buồn, hoặc vui (tùy theo tâm trạng lúc chat), robot có thể tìm ngẫu nhiên các bài hát, video vui nhộn để play giúp chủ nó relax.


Sản phẩm này sẽ open source vì tôi tin rằng còn có nhiều người điên rồ hơn có thể giúp tôi phát triển thành công sản phẩm này. Và hơn tất cả, tôi luôn tin rằng sự chia sẻ có thể đem lại những giá trị hữu ích cho con người.
Thời điểm công bố bản public release sẽ được thông báo sau. :)

Những cân nhắc khi xây dựng một phần mềm nguồn mở

Sunday, April 5, 2009 0 phản hồi

Phần mềm nguồn mở đang là một xu hướng phát triển trong những thập niên gần đây. Tuy nhiên việc xây dựng phần mềm nguồn mở có nhiều khó khăn đòi hỏi bạn phải suy nghĩ thật kĩ trước khi bắt tay vào hiện thực. Trước đây, tôi có cơ hội làm việc với một số nhóm phát triền mã nguồn mở (phần lớn là do tôi tự thành lập hoặc tham gia part time như một thành viên phát triển). Có một vài kinh nghiệm tôi muốn chia sẻ với các bạn.

Trong bài viết này, tôi liệt kê những điều bạn cần cân nhắc trong bước đầu tiên xây dựng phần mềm nguồn mở:
(Từ phần mềm trong bài này để chỉ chung các sản phẩm/ thư viện/ tiện ích)

Mục tiêu của phần mềm

Sự ra đời của một phần mềm phải giải quyết được bài toán/ vấn đề trong thực tế. Hãy xem xét đánh giá những giải pháp tồn tại trên thị trường để xác định lý do tồn tại phần mềm của bạn. Nếu không xác định chính xác mục tiêu, phần mềm của bạn rất dễ bị "đào thải" trong quá trình phát triển. Dưới đây là một số mục tiêu mà tôi cho rằng dễ làm bạn bị thất bại:

1. Trên thị trường đã có phần mềm tương tự, tuy nhiên nó không "mở" để cho tôi phát triển tiếp. => Cẩn thận, để chiến thắng được đối thủ - bạn phải làm tốt hơn họ. Nếu chọn mục tiêu này, bạn phải chạy đua với đối thủ đã vượt qua mặt bạn khá xa - nếu bạn phải xây lại từ đầu.

2. Tôi muốn xây dựng một giải pháp của riêng tôi để không bị phụ thuộc vào những phần mềm khác. => Nhu cầu nghiệp vụ của bạn có đủ lớn về giá trị kinh tế để phải suy nghĩ về mục tiêu này? Google có thể bỏ ra 5-10 triệu USD xây dựng lại cái bánh xe để đáp ứng được mục tiêu kinh doanh. Tuy nhiên, bạn có lớn như google? Hãy thử so sánh chi phí giữa việc xây dựng từ đầu và mua phần mềm xem nó có sự chênh lệch quá lớn hay không trước khi đi tiếp.

3. Tôi xây dựng phần mềm này để cống hiến cho cộng đồng => Ít ai có thể sống được bằng niềm tin và đam mê. Liệu đội ngũ phát triển của bạn có thể đi tiếp nếu họ không có đủ "thực" để vực được "đạo".

...

Lợi nhuận từ phần mềm


Không ai có thể phủ nhận được kinh tế là điều cốt lõi của cuộc sống. Phát triển phần mềm không thể tồn tại nếu không có nguồn đầu tư và lợi nhuận.
Hãy đặt cho mình 2 câu hỏi lớn cho cân nhắc này:
1/ Ai sẽ đầu tư cho phần mềm?
2/ Những cách để kiếm tiền từ phần mềm?

Giấy phép bản quyền

Trong cộng đồng nguồn mở, giấy phép bản quyền (license) là một yếu tố rất quan trọng. Nó chính là giấy thông hành để giúp bạn phân phối, kinh doanh, tìm kiếm cộng đồng đóng góp cho phần mềm.

Bạn cũng có thể tạo ra một license của riêng bạn. Tuy nhiên nên tham khảo một số license phổ biến trước khi quyết định.

Đây là link liệt kê các license mã nguồn mở mà bạn có thể tham khảo.

Những license phổ biến 1
Những license phổ biến 2
So sánh đặc điểm của một số license phổ biến

Những thư viện cần sử dụng

Ngày nay, không ai đi xây một căn nhà bắt đầu từ việc sản xuất xi măng, gạch và vữa. Phần mềm cũng vậy. Hãy lựa chọn những thư viện, công nghệ cần thiết cho phần mềm của bạn để giảm đi chi phí phát triển.

Một điều lưu ý là: nếu thư viện bạn dùng là mã nguồn mở - hãy xem xét xem license của nó có mâu thuẫn với license mà bạn đang chọn hay không? Trước đây khi làm một dự án với một trong những hãng viễn thông hàng đầu của Nhật, tôi ngạc nhiên khi thấy họ lựa chọn rất cẩn thận những thư viện trong quá trình phát triển. Tôi và một người bạn đồng nghiệp phải viết lại từ đầu một thư viện taglib gần giống như DisplayTag (một thư viện rất nổi tiếng để hiển thị lưới dữ liệu trên web của Java) - chỉ vì một lý do đơn giản: license của nó là GPL. Đây là license không phù hợp với tôn chỉ của họ.

Đường hướng phát triển của phần mềm (Roadmap)

Đường hướng phát triển là một trong những yếu tố quan trọng để bạn định hướng cho phần mềm. Nó giúp bạn:
+ Giữ cho phần mềm của mình không đi lệch mục tiêu so với ban đầu.
+ Giúp cho đội ngũ phát triển biết được mình cần làm gì để đạt được mục tiêu.
+ Đối tượng sử dụng phần mềm đánh giá đúng để lựa chọn sản phẩm
+ Tạo ra niềm tin và kì vọng cho đối tượng sử dụng phần mềm
Đường hướng phát triển của phần mềm không nên được ấn định cứng nhắc ngay từ thời điểm ban đầu. Nó nên được cập nhật sau mỗi phiên bản phát hành từ những ý kiến và đóng góp của cộng đồng.

Đội ngũ phát triển


Có 3 nhóm đối tượng chính của đội ngũ phát triển phần mềm nguồn mở

1/ Nhóm phát triển chính: là những người đóng góp chính cho phần mềm
2/ Lập trình viên tự do: là những người tham gia đóng góp những sửa đổi nhỏ, không thường xuyên qua các dạng phản hồi hoặc các tiện ích liên quan.
3/ Người dùng phần mềm: người dùng phần mềm cũng được xem là đối tượng của đội ngũ phát triển. Họ đóng góp cho phần mềm thông qua những phản hồi, báo lỗi, yêu cầu cải tiến, ...

Một phần mềm nguồn mở nên được phát triển bởi một đội ngũ phát triển chính có tâm huyết và cùng chí hướng. Vì vậy, người trưởng nhóm cần lựa chọn cẩn thận những thành viên phù hợp trước khi bắt tay xây dựng.

Công cụ và môi trường phát triển


Dưới đây là một số yếu tố liên quan đến công cụ và môi trường phát triển cần được cân nhắc trong quá trình phát triền phần mềm nguồn mở:

+ Công cụ quản lý phiên bản (SVN và CVS là 2 công cụ được ưa chuộng nhất hiện này)
+ Forum để trao đổi, thảo luận giữa nhóm phát triển và cộng đồng, hoặc giữa các thành viên của nhóm
+ Wiki: được dùng như nơi để ghi nhận các khái niệm, hướng dẫn sử dụng, tài liệu kĩ thuật được công bố.
+ Bug/issue tracker: công cụ để quản lý các bug/issue diễn ra trong quá trình phát triển. Yêu cầu/ phản hồi/ task cũng được xem xét như là một issue trên công cụ này.

Phương pháp luận và quy trình phát triển

Đây là yếu tố quy định linh hồn của việc phát triển phần mềm. Mỗi nhóm phát triển có thể chọn cho mình một phương pháp luận riêng. Tuy nhiên các phương pháp luận trong trường phái Agile rất được ưa chuộng trong giới phát triển nguồn mở.
2 best practice trong Agile thường được áp dụng là

1/ Tích hợp liên tục
2/ Test first

Tôi sẽ chia sẻ với các bạn nhiều hơn về phần mềm nguồn mở trong những bài viết sau.