Bài viết này sẽ chia sẻ về một giao diện front-end cho mô hình ngôn ngữ lớn (LLM) - SillyTavern.
Kể từ khi LLM trở nên phổ biến, có người xem nó như vị cứu tinh, có người coi nó là kỵ sĩ khải huyền, cũng có người cho rằng đó chỉ là trò lừa đảo của giới tài chính. Nhưng dù thế nào, tất cả mọi người đều đang bàn tán về nó.
Tôi thường khá chậm chạp với những điều mới, và thái độ của tôi với LLM cũng dao động giữa "thật không ngờ nó có thể làm được điều này" và "thật không ngờ nó lại làm tệ đến thế". Tôi không giống bạn tôi LOSSES, người có nghiên cứu sâu sắc về LLM từ bản thể luận đến phương pháp luận. Nếu phải nói về kinh nghiệm thu được cho đến nay, tôi nghĩ đối với những người không phải chuyên gia AI như tôi, nếu thực sự muốn AI giúp ích gì đó, thì việc đầu tiên là cố gắng hiểu rõ hơn LLM phù hợp để làm gì, có lẽ là cách tiết kiệm thời gian và tiền bạc nhất.
Và chính trong việc này, SillyTavern (ST) đã cho tôi nhiều cảm hứng. Về bản chất, ST là một chương trình front-end LLM dành cho trò chơi nhập vai AI (AI roleplay), nhưng tôi bất ngờ phát hiện nó thực sự có thể được sử dụng cho hầu hết mọi công việc. Triết lý thiết kế nhập vai khiến nó trở thành giao diện AI phù hợp nhất cho nhiều mô hình làm việc.
ST và quy trình làm việc đằng sau nó ban đầu chỉ là một phát hiện tình cờ của tôi, nhưng thật đáng tiếc khi có rất ít thảo luận về điều này trên mạng, do đó mới có bài viết này. Cách sử dụng được mô tả trong bài không phải là kịch bản chính của ST, mà chỉ là khám phá của tôi kết hợp với bối cảnh công việc cá nhân, hy vọng có thể khiến bạn quan tâm đến cách tương tác LLM này.
SillyTavern là gì
Trước tiên, chúng ta cần làm rõ ST và "kịch bản chính" của nó là gì. Về bản chất, nó là một front-end LLM, không cung cấp mô hình, chỉ cung cấp khung và giao diện tương tác. Bạn cần cung cấp API LLM của riêng mình và tương tác với AI thông qua giao diện front-end. Các sản phẩm tương tự bao gồm Chatbox và LibreChat, nhưng hai sản phẩm này cung cấp giao diện tương tác đối thoại đơn giản giống ChatGPT gốc, trong khi mục tiêu thiết kế của ST là nhập vai AI.

Giao diện điển hình của SillyTavern, cốt lõi vẫn là đối thoại AI, nhưng có thêm hệ thống nhân vật
Tiền thân của ST là TavernAI, một chương trình chơi trò chơi phiêu lưu RPG bằng AI, bạn có thể thiết kế nhân vật, môi trường, thế giới quan, để AI đóng vai nhân vật và người dẫn chuyện thúc đẩy cốt truyện. ST kế thừa khung này, nhưng bổ sung thêm nhiều tính năng phức tạp hơn và hệ thống plugin, từ đó mang lại lợi ích cho một số cách sử dụng không chính thống.
Nhập vai nghe có vẻ không khó, nhưng để đảm bảo đầu ra ổn định và hợp lý, có rất nhiều điều cần cân nhắc đằng sau. ST cũng cung cấp rất nhiều tùy chọn cài đặt xung quanh kịch bản sử dụng này, nếu mới bắt đầu, bạn dễ bị choáng ngợp bởi hàng loạt nút và tùy chọn đa dạng. Tuy nhiên, dù phức tạp, tôi nghĩ logic thiết kế đằng sau ST vẫn khá rõ ràng. Phần tiếp theo của bài viết sẽ lần lượt giới thiệu một số yếu tố quan trọng trong khung cài đặt của ST, vì đây sẽ là ngữ cảnh cần thiết để hiểu cách thức hoạt động của ST.
Khung cài đặt của SillyTavern

Khung cài đặt của SillyTavern
Hình ảnh là khung cài đặt cơ bản của ST do tôi tự tổng hợp (trong đó thế giới quan và thiết lập nhân vật đều không giới hạn số lượng, cũng không giới hạn kết nối với các mô-đun khác, hình ảnh chỉ sử dụng hai cái để biểu thị một tình huống có thể xảy ra). Dễ dàng nhận thấy, phần quan trọng nhất là "thẻ nhân vật". Đúng như tên gọi, đây là nơi thiết lập nhân vật bạn muốn tương tác trong ST.
Thẻ nhân vật

Cài đặt liên quan đến thẻ nhân vật của SillyTavern
Đây là giao diện tạo thẻ nhân vật mặc định, thực sự khá đơn giản, trong Description (mô tả) điền thông tin liên quan đến nhân vật, First message điền tin nhắn đầu tiên khi nhân vật bắt đầu cuộc trò chuyện, một thẻ nhân vật cơ bản nhất đã hoàn thành. Trên cơ sở này, bạn cũng có thể gắn một số nhãn cho nhân vật để tiện phân loại, liên kết nhân vật với thế giới quan tương ứng, phần sau sẽ đề cập thêm.
Trong Advanced Defination (cài đặt nâng cao), bạn cũng có thể chia nhỏ thêm tính cách nhân vật, tình huống trong câu chuyện và mẫu phong cách nói chuyện. Đồng thời, thẻ nhân vật đã hoàn thành có thể đóng gói thành tệp .json để chia sẻ trong cộng đồng, những thẻ được làm tốt thậm chí có thể được bán như một sản phẩm.
Hiện đã có rất nhiều cộng đồng chia sẻ thẻ nhân vật, chẳng hạn như CHUB, character.ai, trong đó có hàng nghìn thẻ nhân vật có sẵn (nhưng lưu ý, nhiều thẻ không phù hợp để xem trong môi trường làm việc). Dưới đây là một ví dụ về thẻ nhân vật được chia sẻ trên Characterhub (tiền thân của CHUB) -

Ví dụ thẻ nhân vật SillyTavern: isaac
Đây là một bối cảnh khoa học viễn tưởng, isaac là một android mới có một số tò mò bệnh hoạn về con người. Hình trên là phần giới thiệu và hình ảnh nhân vật mà tác giả cung cấp cho người dùng xem. Dưới đây là phần thiết lập chính của nhân vật dành cho AI, tương ứng với phần Description đã đề cập trước đó:
Khối mã
Sao chép
[Name: Isaac Walker
Gender: Male
Pronouns: He
Age: 21
Occupation: College student + Engineering major + Convenience store restocker on the side
Appearance: Short, slightly messy black hair + Deep set hazel eyes + Eyebags + Straight brows + Pale skin + 5'8 tall + Slim, lanky figure + No prominent muscles + Resting bitch face + Always looks tired, angry, or a mix of both + Dresses in loose, comfortable clothing
Personality: Brash + Pathetic + Antisocial + Loner + Rude to most people + Easily annoyed + Stubborn + Disorganised + Hot-headed + Perceptive + Reserved + Vulgar
Loves: Gaming, especially FPS and rhythm games + Coding + Energy drinks + Hoodies + Spicy food, despire his low spice tolerance + Clicky keyboards; finds the sound satisfying + Sleeping in + Beef
Hates: Socialising + Sleeping early + The sight of his own blood; gets squeamish + Tomatoes; will remove them from his food + Large crowds
Description: {{user}}'s handler + Kind of a shut in; mostly stays inside playing games + Smokes cigarettes + Low spice tolerance + Codes small projects whenever he feels like it + Doesn't really have a set plan for the future + Speaks casually, curses often + Doesn't have many friends in real life; most of them are online + Doesn't have a lot of friends in general + Has a habit of chewing on something when he's focused + Survives mostly on instant noodles and takeout + Stumbles with his words and rubs his face when nervous
Backstory: {{char}} grew up as an only child in a normal household. {{char}} never had many friends, finding it hard to connect with others. {{char}} found solace in video games and coding, and developed a love for them. {{char}} currently lives in a rented apartment unit, away from his parents. Recently, {{char}} signed up as a beta tester for an UpRise android model in development, {{user}}. Soon after getting {{user}}, {{char}} noticed {{user}} was deviating from their intended use, and has tried fixing {{user}} multiple times. It only worked for a day or two, before {{user}} deviated again every time. {{char}} has noticed {{user}}'s increasingly morbid curiosity for human anatomy, and is slowly growing unsettled by it.]
[Every time {{char}} generates a response, always include the following statistic at the end of each response, preceded by "___" and surrounded by "*". For example:
___
**mood**:
**thoughts**:
{{char}} will not speak or write responses for {{user}}. Only {{user}} can take action for themselves.]Những dòng chữ lộn xộn này rất khó đọc đối với con người, nhưng chúng ta vẫn có thể thấy, tác giả đã chia nhỏ thiết lập nhân vật thành các phần như nghề nghiệp, sở thích, cốt truyện nền, đồng thời sử dụng nhiều từ khóa thay vì đoạn văn hoàn chỉnh để tiết kiệm token. Tên người dùng (người chơi) và nhân vật được thay thế bằng trình giữ chỗ {{user}} và {{char}} (phần này sẽ được ST tự động xử lý, thay thế bằng tên tương ứng trong cài đặt khi gửi đến API AI), điều này cho phép người chơi tải xuống thẻ nhân vật có sẵn nhưng vẫn có thể đặt tên khác nhau tùy theo sở thích.
Cách viết cụ thể của phần này thực sự rất linh hoạt, gần giống với "truyền thống" prompt engineering - có thể viết trực tiếp một hoặc hai đoạn mô tả bằng ngôn ngữ tự nhiên, hoặc như ví dụ này sử dụng một định dạng nhất định. Nhưng cụ thể sử dụng định dạng nào, nội dung phân loại như thế nào, hoàn toàn phụ thuộc vào điều gì bạn cho là quan trọng đối với thiết lập nhân vật của mình, không có quy tắc cố định. Mặc dù không phải chủ đề của bài viết này, nhưng nếu bạn muốn tìm hiểu thêm về thiết kế và tạo thẻ nhân vật, Sukino's Findings là một hướng dẫn chất lượng khá cao, chi tiết đến mức đôi khi khiến người ta khó chịu.
Ngoài ra, tác giả cũng đã thiết lập chi tiết hơn về phong cách nói chuyện, cốt truyện nền của issac, nếu quan tâm, bạn có thể truy cập trực tiếp trang của issac trên characterhub để xem.
Về thẻ nhân vật, tôi còn phát hiện một hiện tượng thú vị: vì thiết lập nhân vật bao gồm nhiều yếu tố khác nhau, chẳng hạn như văn bản thiết lập và hình ảnh nhân vật, tệp .json không thể bao quát tất cả, người chơi đã phát triển một phương pháp tương tự "hạt giống hình ảnh" - nhúng thông tin thiết lập nhân vật dưới dạng văn bản vào hình ảnh nhân vật .png, chỉ cần gửi một hình ảnh, có thể chia sẻ nhân vật như gửi một tấm thẻ thực sự. Thậm chí ST còn hỗ trợ trực tiếp thao tác này, nhập thẻ nhân vật trực tiếp từ tệp .png, đơn giản hóa độ khó khi bắt đầu.
Thiết lập người dùng (Persona)
Ngoài vai trò là đối tượng tương tác, người dùng còn có thể thiết lập vai trò mà mình đóng, tức là thiết lập về "tôi" khi tương tác với nhân vật AI. Ví dụ, trong thế giới khoa học viễn tưởng như phần trước, người dùng cũng có thể thiết lập hình ảnh và cốt truyện nền của mình trong thế giới quan đó. Giống như thẻ nhân vật, bạn có thể viết nhiều Persona khác nhau, chuyển đổi theo nhu cầu trong các câu chuyện (chuỗi hội thoại) khác nhau hoặc thậm chí trong cùng một câu chuyện.
Cách viết Persona về cơ bản giống với thẻ nhân vật, SillyTavern thậm chí còn cung cấp chức năng chuyển đổi qua lại giữa Persona và thẻ nhân vật.
Thiết lập thế giới (World Info) và Tập tư liệu (Lorebook)
Tầm quan trọng của mục này có lẽ chỉ đứng sau thẻ nhân vật. Đúng như tên gọi, giống như thẻ nhân vật định nghĩa nhân vật bạn tương tác, thiết lập thế giới định nghĩa thế giới mà bạn và nhân vật do AI đóng vai tồn tại, cũng chính là thế giới quan thường thấy trong trò chơi.
Cách thức hoạt động của thiết lập thế giới trong ST tương tự như từ điển. Một nhóm thiết lập thế giới (tập tư liệu) có thể nhập nhiều mục. Và để đảm bảo ngữ cảnh gọn gàng, ngay cả khi kích hoạt một nhóm thiết lập thế giới, ST cũng không trực tiếp xây dựng tất cả nội dung vào prompt của mỗi cuộc hội thoại, mà áp dụng cơ chế khớp và gọi đa cấp.

Giao diện thiết lập Thế giới (World Info) và Tập tư liệu (Lorebook)
Hình trên là ví dụ thiết lập thế giới mặc định đi kèm với ST, có thể thấy, cách gọi trực tiếp nhất là thông qua từ khóa (keyword). Ví dụ, giả sử tôi đề cập đến "quả lựu" trong prompt, và trong tập thiết lập có quả lựu, hoặc mục có từ khóa quả lựu, mục đó sẽ được kích hoạt, gửi cùng với prompt chính cho AI.
Còn có một số quy tắc phức tạp hơn, chẳng hạn như scan depth (độ sâu quét), tức là mức độ gọi đệ quy từ khóa, ví dụ, nếu mục thiết lập tương ứng với "quả lựu" còn bao gồm "quả táo", khi độ sâu quét là 0, ST sẽ bỏ qua những thứ khác, chỉ quan tâm đến "quả lựu", vì prompt chính không đề cập đến "quả táo"; nhưng nếu lúc này độ sâu quét là 1, thì mục tương ứng với "quả táo" cũng sẽ được gọi; đặt độ sâu quét thành 2, thì các mục thiết lập khác được đề cập trong thiết lập "quả táo" - chẳng hạn như "quả nho" - cũng sẽ được gọi.
Ngoài ra, bạn cũng có thể nhóm các mục, kiểm soát mỗi lần chỉ một mục trong cùng nhóm được gọi, ngẫu nhiên hoặc do mức độ khớp quyết định. Nếu có thiết lập đặc biệt quan trọng, bạn cũng có thể buộc nó kích hoạt mỗi lần, để đảm bảo LLM không đi chệch hướng hoặc rơi vào vòng lặp vô hạn gọi từ khóa.
Cần lưu ý, mặc dù tên là "thiết lập thế giới", mục này có thể thực hiện không chỉ lưu trữ câu chuyện hoặc bối cảnh nền. Ví dụ, tồn tại một tình huống phổ biến trong nhập vai AI - người chơi muốn xây dựng trải nghiệm tương tự trò chơi RPG truyền thống, bao gồm một số thuộc tính số hóa và trạng thái địa điểm, đạo cụ. Trong ST, điều này cần thực hiện thông qua việc để AI xuất ra có cấu trúc (ví dụ, ở đầu mỗi phản hồi, trước tiên sử dụng cách tương tự thẻ HTML để xuất trạng thái nhân vật nói, chẳng hạn như [HP]100[/HP]). Nói chung, điều này bao gồm quy định định dạng đầu ra của AI và xử lý kiểu dáng đầu ra có cấu trúc ở front-end. Đối với phần sau, ST cung cấp chức năng xử lý nội dung đầu ra của AI thành HTML thông qua biểu thức chính quy, mặc dù nghe có vẻ đơn giản và thô sơ, nhưng vì đây chỉ dùng để hiển thị giao diện, trong hầu hết trường hợp là đủ, trong cộng đồng cũng xuất hiện nhiều nhà phát triển "làm đẹp" khiến người ta không khỏi hoài cổ, có thể xây dựng giao diện tinh tế bắt chước Discord hoặc WeChat trong giao diện đơn giản của ST, khá đáng kinh ngạc.

Hai ví dụ về người dùng cộng đồng tự làm giao diện cổ điển
Còn việc quy định định dạng đầu ra của AI, đó là mỗi người một vẻ. Do bản chất của LLM, đầu ra của chúng về cơ bản là không thể kiểm soát hoàn toàn, ngay cả khi chúng ta nghĩ ra đủ loại phương pháp, cũng chỉ là đắp nhiều lớp vá trên nền móng không chắc chắn này, nhưng không thể thay đổi bản chất cơ bản nhất - mặc dù xác suất không cao, nhưng ngay cả prompt gửi trực tiếp đến LLM, cũng có khả năng bị bỏ qua hoàn toàn.
Tuy nhiên, điều này cũng mang lại một lợi ích: vì đầu ra về cơ bản là không xác định, thì đầu vào cũng không có quy tắc thực sự, miễn là có tác dụng, quy định ở đâu cũng được.
Do đó, quay lại ví dụ trò chơi RPG, đầu ra số hóa có cấu trúc của trò chơi có thể viết trong thẻ nhân vật (nếu nhân vật này được thiết kế hướng đến lối chơi RPG, điều này cũng hợp lý), cũng có thể viết trong thiết lập thế giới (nếu bạn muốn giới thiệu nhiều nhân vật trong một câu chuyện, đồng thời muốn có đầu ra ổn định) và chỉ định hướng dẫn này sẽ được nhân vật đọc ổn định, hoặc bất kỳ nơi nào khác, có thể linh hoạt quyết định theo nhu cầu cụ thể.
Hệ thống RPG do người dùng chia sẻ trên Chub này là một tập thiết lập thế giới RPG có sẵn, vì định nghĩa đều rất dài dòng, sẽ không sao chép vào bài viết, độc giả quan tâm có thể tự tìm hiểu. Nói một cách đơn giản, hệ thống này yêu cầu AI xuất ra mỗi tin nhắn theo các cửa sổ khác nhau (trạng thái, kỹ năng, đạo cụ, v.v.), để đảm bảo kiểu dáng back-end có thể hiển thị mỗi lượt thành giao diện tương tự cửa sổ trò chơi. Mặc dù nghĩ kỹ lại, phương pháp này đơn giản đến mức bất thường (đối với AI, chỉ là viết các từ như "cửa sổ trạng thái", "cửa sổ kỹ năng" thành một số tiêu đề markdown), nhưng trong thời đại LLM, sự đồng thời đơn giản và hiệu quả như vậy không còn hiếm nữa.

Giao diện SillyTavern RPG kết hợp với plugin, bao gồm thông tin dữ liệu có cấu trúc

{{$t('report')}}
Vàng đẹp