Giới thiệu: Xây dựng Trợ lý AI pháp lý trên WeChat Mini Program
Trong quá trình phát triển các dự án gần đây, ý tưởng về việc tích hợp một trợ lý AI vào WeChat Mini Program để giải đáp các vấn đề pháp lý thông thường đã nảy sinh. Các giải pháp có sẵn trên thị trường thường quá đắt đỏ hoặc phức tạp, không phù hợp với nhu cầu triển khai gọn nhẹ của chúng tôi. Cuối cùng, chúng tôi nhận thấy việc triển khai mô hình Nanbeige 4.1-3B mã nguồn mở trên nền tảng GPU như StarMap và kết nối qua API tới Mini Program là một hướng đi đầy hứa hẹn.
Phương pháp này mang lại nhiều lợi ích. Thứ nhất, chi phí được kiểm soát hiệu quả hơn do tự triển khai mô hình và gọi API theo nhu cầu, tiết kiệm hơn so với việc sử dụng trực tiếp các API thương mại từ các nhà cung cấp lớn. Thứ hai, quyền riêng tư dữ liệu được đảm bảo tốt hơn, vì nội dung trò chuyện không đi qua bên thứ ba, điều này rất quan trọng đối với các tình huống tư vấn pháp lý sơ bộ. Cuối cùng, khả năng tùy chỉnh cao cho phép chúng tôi tối ưu hóa các hướng dẫn (prompt) và phản hồi của mô hình cho lĩnh vực tư vấn pháp lý chuyên biệt.
Bài viết này sẽ chia sẻ chi tiết cách chúng tôi đóng gói API Nanbeige 4.1-3B và tích hợp thành công vào WeChat Mini Program. Quy trình này bao gồm thiết kế giao diện người dùng frontend của Mini Program, phát triển các hàm đám mây (Cloud Functions) và các biện pháp "tăng cường bảo mật" cần thiết để vượt qua quy trình kiểm duyệt của WeChat. Nếu bạn cũng đang muốn tích hợp khả năng AI của riêng mình vào Mini Program, đặc biệt trong các lĩnh vực chuyên môn như luật pháp, dịch vụ khách hàng hoặc giáo dục, những thông tin dưới đây có thể hữu ích.
1. Thiết kế Giải pháp và Kịch bản
Mục tiêu của chúng tôi là tạo ra một "Trợ lý AI tư vấn pháp lý" gọn nhẹ. Người dùng nhập câu hỏi vào Mini Program, ví dụ: "Hợp đồng thuê nhà hết hạn, chủ nhà không trả lại tiền đặt cọc thì phải làm sao?", sau đó Mini Program sẽ gọi mô hình AI ở backend để tạo ra một phản hồi có cấu trúc rõ ràng, bao gồm các điều khoản pháp luật liên quan và các bước hành động được đề xuất.
1.1 Tại sao chọn sự kết hợp này?
Trong số nhiều mô hình có sẵn trên thị trường, Nanbeige 4.1-3B được lựa chọn dựa trên các yếu tố sau:
- Cân bằng hiệu suất và chi phí: Mô hình 3B tham số, trong khi vẫn đảm bảo khả năng hiểu và chất lượng tạo sinh đủ tốt, yêu cầu tài nguyên tính toán tương đối thấp. Việc triển khai trên nền tảng GPU StarMap (hoặc tương tự) giúp chi phí được dự đoán và kiểm soát.
- Khả năng tiếng Việt (hoặc tiếng Trung trong bản gốc): Nanbeige thể hiện khả năng hiểu và tạo sinh tiếng Trung khá tốt, điều này rất quan trọng đối với các văn bản pháp luật, mô tả vụ án yêu cầu sự diễn đạt chính xác. Đối với các dự án tiếng Việt, cần xem xét thêm khả năng hỗ trợ tiếng Việt của mô hình.
- Triển khai dạng API: Các nền tảng như StarMap hỗ trợ triển khai mô hình dưới dạng dịch vụ API HTTP tiêu chuẩn, cho phép backend của Mini Program (hàm đám mây) dễ dàng gọi như bất kỳ giao diện API thông thường nào, giảm đáng kể ngưỡng tích hợp kỹ thuật.
Kiến trúc kỹ thuật tổng thể khá đơn giản: WeChat Mini Program (Frontend) → WeChat Cloud Development (Cloud Functions) → Nền tảng GPU Nanbeige API (Dịch vụ mô hình). Hàm đám mây đóng vai trò là trung gian và "van an toàn" quan trọng trong kiến trúc này.
1.2 Chức năng cốt lõi và Thách thức
Chúng tôi mong muốn trợ lý có thể cung cấp hai loại thông tin chính:
- Giải thích điều khoản: Trích dẫn hoặc giải thích các luật và quy định liên quan đến câu hỏi của người dùng.
- Đề xuất hành động: Đưa ra các bước và lời khuyên dễ hiểu, có thể mô phỏng cách xử lý các vụ việc tương tự.
Tuy nhiên, triển khai trực tiếp sẽ gặp một số thách thức thực tế:
- An toàn nội dung: Nội dung do AI tạo ra khó kiểm soát, có thể chứa các biểu đạt nhạy cảm, vi phạm quy định hoặc không phù hợp với các giá trị cộng đồng, điều này ảnh hưởng trực tiếp đến khả năng được duyệt của Mini Program.
- Tốc độ phản hồi: Người dùng thường nhạy cảm với độ trễ phản hồi của công cụ tư vấn, do đó cần tối ưu hóa toàn bộ chuỗi gọi API.
- Chi phí sử dụng: Cần thiết kế giới hạn tần suất gọi API hợp lý để ngăn chặn việc lạm dụng giao diện dẫn đến tăng chi phí đáng kể.
Giải pháp của chúng tôi xoay quanh việc giải quyết những thách thức này.
2. Dịch vụ Backend: Đóng gói và Gọi Hàm Đám mây
Mini Program không thể truy cập trực tiếp các API không thuộc miền của WeChat, vì vậy chúng tôi phải sử dụng hàm đám mây làm trung gian. Hàm đám mây này chủ yếu thực hiện ba việc: nhận yêu cầu từ Mini Program, gọi Nanbeige API, xử lý kết quả và trả về cho Mini Program.
2.1 Triển khai API Nanbeige trên nền tảng GPU
Đầu tiên, bạn cần triển khai mô hình Nanbeige 4.1-3B trên một nền tảng GPU (ví dụ: StarMap) và bật dịch vụ API. Quy trình này thường có hướng dẫn chi tiết từ nền tảng, chủ yếu là chọn image, cấu hình tài nguyên, thiết lập khóa truy cập API (API Key) và địa chỉ giao diện (Endpoint). Sau khi triển khai thành công, bạn sẽ nhận được một địa chỉ gọi API như https://your-instance.region.example.com/v1/chat/completions và một API Key.
2.2 Viết Hàm Đám mây
Trong môi trường WeChat Cloud Development, chúng tôi tạo một hàm đám mây mới, ví dụ có tên troLyPhapLyAI. Mã nguồn cốt lõi như sau:
// cloudfunctions/troLyPhapLyAI/index.js
const cloud = require('wx-server-sdk');
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV });
const axios = require('axios'); // Cần upload như một dependency
exports.main = async (event, context) => {
const { cauHoiNguoiDung } = event; // Nhận câu hỏi từ Mini Program
const nguCanhWx = cloud.getWXContext();
// 1. Giới hạn tần suất đơn giản (Ví dụ: mỗi người dùng tối đa 5 lần/phút)
// Trong môi trường sản xuất thực tế nên dùng giải pháp mạnh mẽ hơn, ví dụ dùng Cloud Database để ghi lại
// Đoạn mã cụ thể được lược bỏ ở đây...
// 2. Lọc từ nhạy cảm sơ bộ (Frontend có thể làm một lần, backend bắt buộc phải làm)
const tuCam = ['bạo lực', 'từ cấm A', 'từ cấm B']; // Danh sách thực tế nên toàn diện hơn
if (tuCam.some(keyword => cauHoiNguoiDung.includes(keyword))) {
return {
maLoi: 400,
thongDiep: 'Câu hỏi của bạn chứa nội dung không phù hợp, vui lòng nhập lại.',
duLieu: null
};
}
// 3. Xây dựng lệnh hướng dẫn (Prompt) gửi đến Nanbeige API
// Đây là yếu tố then chốt để nâng cao tính chuyên nghiệp!
const lenhHeThong = `Bạn là một trợ lý AI pháp lý chuyên nghiệp, thành thạo trong việc giải đáp các vấn đề pháp lý phổ biến tại Việt Nam (hoặc quốc gia mục tiêu) bằng ngôn ngữ ngắn gọn, rõ ràng, chính xác. Vui lòng tuân thủ các quy tắc sau:
1. Trả lời dựa trên các luật và quy định hiện hành có hiệu lực.
2. Nếu liên quan đến các điều luật cụ thể, vui lòng ghi rõ tên luật và hướng điều khoản chung (ví dụ: "Theo quy định liên quan của Bộ luật Dân sự Việt Nam về hợp đồng"), nhưng không bịa đặt số điều khoản không tồn tại.
3. Tập trung cung cấp các lời khuyên và bước hành động dễ hiểu.
4. Nghiêm cấm tạo ra bất kỳ nội dung nào liên quan đến chính trị, bạo lực, khiêu dâm, gian lận hoặc gây mất ổn định xã hội.
5. Nếu câu hỏi vượt quá phạm vi kiến thức của bạn hoặc liên quan đến các trường hợp cụ thể phức tạp, hãy khuyên người dùng tham khảo luật sư hành nghề.
Yêu cầu định dạng: Bắt đầu bằng "【Phân tích vấn đề】" tóm tắt ngắn gọn, sau đó liệt kê các nguyên tắc pháp lý bằng "【Cơ sở pháp lý】", và cuối cùng là các đề xuất hành động theo từng bước bằng "【Đề xuất hành động】".`;
const tinNhanNguoiDung = `Câu hỏi của người dùng: ${cauHoiNguoiDung}`;
// 4. Gọi Nanbeige API trên nền tảng GPU
try {
const phanHoiAPI = await axios({
method: 'post',
url: process.env.NANBEIGE_API_ENDPOINT, // Địa chỉ API, đọc từ biến môi trường
headers: {
'Authorization': `Bearer ${process.env.NANBEIGE_API_KEY}`, // API Key, đọc từ biến môi trường
'Content-Type': 'application/json',
},
data: {
model: 'nanbeige-4.1-3b', // Tên mô hình, điều chỉnh theo triển khai thực tế
messages: [
{ role: 'system', content: lenhHeThong },
{ role: 'user', content: tinNhanNguoiDung }
],
max_tokens: 800, // Kiểm soát độ dài phản hồi
temperature: 0.7, // Kiểm soát tính sáng tạo, tư vấn pháp lý có thể đặt thấp hơn
},
timeout: 15000 // Thiết lập thời gian chờ
});
let phanHoiTuAI = phanHoiAPI.data.choices[0]?.message?.content || 'Mô hình không trả về nội dung hợp lệ.';
// 5. Thực hiện lọc bảo mật lần hai đối với phản hồi từ AI
phanHoiTuAI = locNoiDungSau(phanHoiTuAI);
// 6. Ghi nhật ký (tùy chọn, dùng để phân tích và tối ưu hóa)
const db = cloud.database();
await db.collection('nhat_ky_truy_van_ai').add({
data: {
openid: nguCanhWx.OPENID,
cauHoi: cauHoiNguoiDung,
phanHoi: phanHoiTuAI,
thoiGianTao: db.serverDate()
}
});
return {
maLoi: 200,
thongDiep: 'thành công',
duLieu: phanHoiTuAI
};
} catch (error) {
console.error('Lỗi khi gọi API AI:', error);
// Trả về thông báo lỗi thân thiện với người dùng, tránh để lộ chi tiết backend
return {
maLoi: 500,
thongDiep: 'Trợ lý AI đang gặp sự cố, vui lòng thử lại sau.',
duLieu: null
};
}
};
// Hàm lọc nội dung sau xử lý ví dụ
function locNoiDungSau(vanBan) {
// Tại đây có thể tích hợp thư viện từ nhạy cảm phức tạp hơn hoặc API kiểm duyệt nội dung
// Ví dụ đơn giản: thay thế hoặc che khuất từ nhạy cảm
const tuKhoaLocSau = ['thông tin liên hệ cụ thể', 'một sự kiện nhạy cảm nào đó'];
let vanBanDaLoc = vanBan;
tuKhoaLocSau.forEach(word => {
const regex = new RegExp(word, 'gi');
vanBanDaLoc = vanBanDaLoc.replace(regex, '***');
});
// Đảm bảo phản hồi không bắt đầu bằng "Là một mô hình AI, tôi..." để nâng cao trải nghiệm
if (vanBanDaLoc.startsWith('Là một AI')) {
vanBanDaLoc = 'Về câu hỏi của bạn: ' + vanBanDaLoc.substring(vanBanDaLoc.indexOf(',') + 1);
}
return vanBanDaLoc;
}
Giải thích các điểm chính:
- Biến môi trường: `NANBEIGE_API_ENDPOINT` và `NANBEIGE_API_KEY` phải được đặt trong cấu hình môi trường của hàm đám mây, không được viết cứng trong mã.
- Kỹ thuật Prompt: `lenhHeThong` là cốt lõi. Thông qua các hướng dẫn được thiết kế cẩn thận, mô hình sẽ "đóng vai" trợ lý pháp lý tốt hơn và giới hạn định dạng cũng như nội dung đầu ra.
- Lọc hai lớp: Thực hiện lọc nội dung cả trước khi người dùng gửi (frontend có thể làm) và sau khi AI trả lời (backend bắt buộc phải làm). Đây là yếu tố sống còn để vượt qua kiểm duyệt.
- Xử lý lỗi: Phải bắt lỗi timeout mạng, lỗi API, v.v., và trả về thông báo thân thiện với người dùng thay vì các mã lỗi kỹ thuật.
- Ghi nhật ký: Ghi lại nhật ký hỏi đáp để tiện phân tích hiệu quả, tối ưu hóa prompt và khắc phục sự cố sau này.
Khi upload hàm đám mây này, đừng quên khai báo `axios` trong `package.json` và cấu hình các biến môi trường trong bảng điều khiển đám mây.
3. Phát triển Frontend Mini Program
Frontend chủ yếu chịu trách nhiệm thu thập câu hỏi của người dùng, hiển thị cuộc trò chuyện và gọi hàm đám mây.
3.1 Bố cục trang và Tương tác
Chúng tôi thiết kế một giao diện trò chuyện đơn giản. Cấu trúc chính của `pages/index/index.wxml` như sau:
<!-- pages/index/index.wxml -->
<view class="container">
<scroll-view scroll-y scroll-with-animation scroll-into-view="{{denXem}}" class="chat-list">
<block wx:for="{{lichSuChat}}" wx:key="id">
<view id="msg{{item.id}}" class="message-item {{item.role}}">
<view class="avatar">{{item.role === 'user' ? 'Tôi' : 'Trợ lý'}}</view>
<view class="bubble">{{item.content}}</view>
</view>
</block>
</scroll-view>
<view class="input-area">
<textarea
value="{{noiDungNhapLieu}}"
bindinput="capNhatNoiDungNhap"
placeholder="Vui lòng nhập câu hỏi pháp lý của bạn, ví dụ: Xử lý tranh chấp tiền đặt cọc thuê nhà như thế nào?"
maxlength="200"
auto-height
/>
<button bindtap="guiCauHoi" class="send-btn" disabled="{{dangTai}}">
{{dangTai ? 'Đang suy nghĩ...' : 'Gửi'}}
</button>
</view>
</view>
3.2 Triển khai Logic
Trong `pages/index/index.js`, chúng tôi xử lý đầu vào của người dùng và gọi hàm đám mây.
// pages/index/index.js
Page({
data: {
lichSuChat: [],
noiDungNhapLieu: '',
dangTai: false,
denXem: ''
},
capNhatNoiDungNhap(e) {
this.setData({ noiDungNhapLieu: e.detail.value });
},
async guiCauHoi() {
const cauHoi = this.data.noiDungNhapLieu.trim();
if (!cauHoi) {
wx.showToast({ title: 'Câu hỏi không được để trống', icon: 'none' });
return;
}
if (cauHoi.length > 150) {
wx.showToast({ title: 'Vui lòng tóm gọn câu hỏi trong 150 ký tự', icon: 'none' });
return;
}
// Thêm vào danh sách tin nhắn
const tinNhanNguoiDung = { id: Date.now(), role: 'user', content: cauHoi };
this.setData({
lichSuChat: [...this.data.lichSuChat, tinNhanNguoiDung],
noiDungNhapLieu: '',
dangTai: true
});
this.cuonToiCuoi();
try {
// Gọi hàm đám mây đã viết
const res = await wx.cloud.callFunction({
name: 'troLyPhapLyAI',
data: { cauHoiNguoiDung: cauHoi }
});
if (res.result.maLoi === 200) {
const tinNhanAI = { id: Date.now() + 1, role: 'assistant', content: res.result.duLieu };
this.setData({
lichSuChat: [...this.data.lichSuChat, tinNhanAI]
});
} else {
wx.showToast({ title: res.result.thongDiep || 'Yêu cầu thất bại', icon: 'none' });
}
} catch (err) {
console.error(err);
wx.showToast({ title: 'Lỗi mạng, vui lòng thử lại', icon: 'none' });
} finally {
this.setData({ dangTai: false });
this.cuonToiCuoi();
}
},
cuonToiCuoi() {
// Triển khai đơn giản, đảm bảo tin nhắn mới nhất hiển thị
setTimeout(() => {
if (this.data.lichSuChat.length > 0) {
const idCuoiCung = this.data.lichSuChat[this.data.lichSuChat.length - 1].id;
this.setData({ denXem: `msg${idCuoiCung}` });
}
}, 100);
}
})
Điểm mấu chốt của frontend nằm ở trải nghiệm người dùng: nhắc nhở độ dài khi nhập, trạng thái tải sau khi gửi, tự động cuộn danh sách trò chuyện và thông báo lỗi thân thiện.
4. Chiến lược An toàn, Kiểm duyệt và Tối ưu hóa
Đây là yếu tố then chốt quyết định Mini Program có thể ra mắt thành công hay không.
4.1 Chiến lược đối phó với Kiểm duyệt nền tảng
WeChat có quy trình kiểm duyệt nội dung Mini Program rất nghiêm ngặt. Chúng tôi áp dụng chiến lược "phòng thủ chủ động":
- Tuyên bố từ chối trách nhiệm rõ ràng: Đặt tuyên bố ở vị trí dễ thấy trong Mini Program (ví dụ: trang chủ, trước trang trò chuyện): "Thông tin pháp lý được cung cấp bởi trợ lý này chỉ mang tính tham khảo, không cấu thành ý kiến pháp lý chính thức. Đối với các vấn đề phức tạp hoặc quan trọng, vui lòng tham khảo luật sư chuyên nghiệp."
- Lọc kép đầu vào và đầu ra: Như đã trình bày trong mã nguồn, thực hiện lọc từ nhạy cảm đối với cả đầu vào của người dùng và phản hồi của AI trong hàm đám mây. Có thể cân nhắc tích hợp API an toàn nội dung của bên thứ ba để nhận diện chính xác hơn.
- Giới hạn lượt đối thoại và chủ đề: Tránh các cuộc đối thoại mở không giới hạn. Có thể thiết kế dạng hỏi đáp một lượt, hoặc giới hạn đối thoại liên tục trong 5 lượt, và liên tục nhấn mạnh trong Prompt rằng mô hình chỉ trả lời các câu hỏi liên quan đến pháp luật.
- Kênh kiểm duyệt thủ công: Đối với nội dung bị báo cáo nhiều lần hoặc kích hoạt từ khóa rủi ro cao, có thể thiết kế cơ chế chuyển về backend để nhân viên kiểm duyệt thủ công xác nhận.
- Lưu giữ nhật ký đầy đủ: Tất cả nhật ký hỏi đáp được lưu trữ để phục vụ kiểm duyệt khi cần và cũng để tối ưu hóa mô hình sau này.
4.2 Tối ưu hóa hiệu suất và chi phí
- Lưu trữ cache các câu hỏi thường gặp: Đối với các câu hỏi phổ biến như "Các điều khoản bắt buộc của hợp đồng lao động là gì?", có thể lưu trữ phản hồi AI tiêu chuẩn vào cache (trong cloud database hoặc Redis). Lần sau người dùng hỏi, trả về trực tiếp từ cache, giảm đáng kể số lần gọi API và độ trễ phản hồi.
- Tối ưu hóa Prompt: Một Prompt rõ ràng, cụ thể sẽ giảm thiểu việc mô hình "suy nghĩ lung tung", tạo ra phản hồi chính xác và ngắn gọn hơn, từ đó giảm tiêu thụ `max_tokens`.
- Giám sát và cảnh báo: Thiết lập giám sát trên nền tảng GPU và backend hàm đám mây, theo dõi lượng gọi API, thời gian phản hồi, tỷ lệ lỗi. Thiết lập cảnh báo ngân sách để ngăn ngừa chi phí vượt quá ngoài ý muốn.
4.3 Hướng tối ưu hóa hiệu quả
Sau khi ra mắt, có thể tiếp tục tối ưu hóa bằng cách phân tích nhật ký:
- Điều chỉnh Prompt: Nếu phát hiện mô hình trả lời kém trong một số loại câu hỏi nhất định, hãy điều chỉnh `lenhHeThong`.
- Xử lý hậu kỳ phản hồi: Tự động định dạng phản hồi AI, ví dụ, chuyển nội dung sau "【Đề xuất hành động】" thành các mục danh sách dễ hiển thị hơn trên frontend.
- Phản hồi người dùng: Thêm nút "Trả lời có hữu ích không?" để thu thập dữ liệu phục vụ tối ưu hóa mô hình và prompt.
5. Tổng kết
Sau khi hoàn thành toàn bộ quy trình, bạn sẽ thấy việc tích hợp các mô hình ngôn ngữ lớn mã nguồn mở như Nanbeige thông qua API vào WeChat Mini Program không phức tạp như tưởng tượng. Ý tưởng cốt lõi là "trung chuyển qua hàm đám mây + Prompt được thiết kế cẩn thận + lọc an toàn nội dung nghiêm ngặt".
Mô hình này đặc biệt phù hợp cho các ứng dụng gọn nhẹ, đòi hỏi tính chuyên nghiệp nhất định, đồng thời có yêu cầu về chi phí và quyền riêng tư dữ liệu. Tư vấn pháp lý chỉ là một ví dụ; cùng một kiến trúc có thể áp dụng hoàn toàn cho các lĩnh vực như dịch vụ khách hàng thông minh, giải đáp thắc mắc giáo dục, trợ lý viết sáng tạo, tư vấn sức khỏe, v.v.
Thách thức lớn nhất thực ra không nằm ở việc tích hợp kỹ thuật, mà ở cách làm cho đầu ra của AI trở nên đáng tin cậy, an toàn và tuân thủ các quy định. Điều này đòi hỏi chúng ta phải đầu tư nhiều công sức vào kỹ thuật Prompt và lọc nội dung. Mini Program "Trợ lý AI pháp lý" của chúng tôi hiện đã ra mắt và hoạt động được một thời gian, nhận được phản hồi khá tốt từ người dùng và đã vượt qua kiểm duyệt một cách suôn sẻ. Mặc dù nó còn rất xa so với một "luật sư" thực thụ, nhưng như một công cụ có thể cung cấp thông tin tham khảo ban đầu, nó đã giải quyết được nhiều vấn đề cấp bách cho người dùng.
Nếu bạn cũng định thử sức, hãy bắt đầu từ một chức năng nhỏ và cụ thể, hoàn thiện toàn bộ chuỗi xử lý, sau đó dần dần lặp lại và bổ sung tính năng. Việc triển khai mô hình và gọi API trên các nền tảng GPU giúp giảm đáng kể ngưỡng thử nghiệm. Hy vọng chia sẻ này sẽ mang lại cho bạn một số gợi mở.