Cây Tư Duy (Tree Of Thoughts - ToT)
Các kỹ thuật gợi ý (prompt) đang không ngừng phát triển và sự phát triển này đòi hỏi các cấu trúc hỗ trợ để đưa các gợi ý phức tạp hơn vào hoạt động. Bài viết này xem xét các nguyên tắc cơ bản của ToT cùng với một ví dụ minh họa sử dụng LangChain.
Tác giả: Cobus Greyling
Giới thiệu
Gần đây, chúng ta đã chứng kiến sự phát triển của kỹ thuật gợi ý từ việc gợi ý trực tiếp đơn giản, với một suy nghĩ duy nhất được gửi đến Mô hình Ngôn ngữ (LM).
Sau đó, Chuỗi Suy Nghĩ (Chain-Of-Thought - CoT) đã mang lại một cuộc cách mạng trong thực hành kỹ thuật gợi ý với hàng loạt biến thể dựa trên nguyên tắc cơ bản của CoT.
Các nguyên tắc cơ bản của Chuỗi Suy Nghĩ (CoT) là vô cùng mạnh mẽ, đến mức có thể chịu đựng được trọng lượng của các biến thể với bốn thành phần cốt lõi:
- Đối tượng Cầu nối
- Mẫu Ngôn ngữ
- Tính nhất quán
- Sự liên quan
Cũng có những phương pháp mà một số kết quả được tạo ra và một hệ thống bầu chọn quyết định câu trả lời chính xác và phù hợp nhất.
Điều này dẫn chúng ta đến ToT...
Cây Tư Duy (Tree-Of-Thoughts - ToT)
Các nguyên tắc cơ bản của ToT là...
- Khi một Mô hình Ngôn ngữ Lớn (LLM) đối mặt với một vấn đề phức tạp cần giải quyết, nó bị giới hạn trong quá trình suy luận từ trái sang phải ở mức độ token.
- Yêu cầu của người dùng phải được chia nhỏ thành các suy nghĩ riêng biệt, và những suy nghĩ này cần được khám phá theo cách tiếp cận ma trận, trái ngược với cách tiếp cận CoT cơ bản tuyến tính hơn.
- LLMs nên được cho phép khám phá trên một tập hợp các đơn vị văn bản nhất quán, cấu thành các suy nghĩ.
- Các yếu tố chính mà ToT giới thiệu là khám phá các giải pháp khả thi và một yếu tố của tầm nhìn chiến lược.
- Một phần của quá trình nên là một bộ kiểm tra dựa trên quy tắc, đưa ra một trong ba lựa chọn trong phản hồi; hợp lệ, không hợp lệ hoặc hợp lệ một phần.
- ToT tạo ra một vài lựa chọn thay vì chỉ chọn một và đánh giá trạng thái hiện tại của nó và chủ động nhìn về phía trước hoặc quay lại để đưa ra các quyết định toàn cầu hơn.
- Mã LangChain sau trong bài viết này minh họa tốt cách một chuỗi ToT có thể được khởi tạo, chạy và số lượng tối đa các tương tác và suy nghĩ con có thể được thiết lập.
- Điều này cho phép một mức độ kiểm soát về chi phí sử dụng token, tổng thời gian truy vấn của tác nhân và các chi phí khác.
- Tất cả điều này được hỗ trợ bởi việc tận dụng Học Tập Trong Ngữ Cảnh (In-Context Learning - ICL).
ToT cho phép LMs thực hiện quyết định có chủ ý bằng cách xem xét nhiều con đường lý luận khác nhau và tự đánh giá các lựa chọn để quyết định hành động tiếp theo, cũng như nhìn về phía trước hoặc quay lại khi cần thiết để đưa ra các lựa chọn toàn cầu.
Nguyên tắc Cơ bản
Nghiên cứu về giải quyết vấn đề của con người cho thấy rằng mọi người điều hướng không gian vấn đề như một cái cây, nơi các nút đại diện cho các giải pháp một phần và các nhánh đại diện cho các hành động sửa đổi chúng.
Các phương pháp heuristic (phương pháp phỏng đoán) hướng dẫn nhánh nào cần thực hiện, hướng người giải quyết về phía giải pháp.
Điều này làm nổi bật hai thiếu sót chính của các phương pháp hiện tại sử dụng LMs để giải quyết vấn đề:
- Chúng không khám phá các con đường khác nhau trong một quá trình suy nghĩ (các nhánh cây).
- Chúng thiếu kế hoạch, tầm nhìn xa, hoặc quay lại để đánh giá các lựa chọn khác nhau, không giống như tìm kiếm được hướng dẫn bởi cách giải quyết vấn đề dựa trên kinh nghiệm của con người.
Một quá trình giải quyết vấn đề thực sự liên quan đến việc sử dụng lặp đi lặp lại thông tin có sẵn để bắt đầu khám phá, điều này lần lượt tiết lộ nhiều thông tin hơn cho đến khi cuối cùng tìm ra cách đạt được giải pháp. —Newell và cộng sự.
Một hiện thực cụ thể của ToT liên quan đến việc trả lời bốn câu hỏi:
- Làm thế nào để phân chia quá trình trung gian thành các bước suy nghĩ.
- Làm thế nào để tạo ra các suy nghĩ tiềm năng từ mỗi trạng thái.
- Làm thế nào để đánh giá các trạng thái theo phương pháp heuristic (phương pháp phỏng đoán).
- Sử dụng thuật toán tìm kiếm nào.
Ví dụ Hoạt động của LangChain
Cài đặt và import…
#############################
!pip install langchain_openai
!pip install langchain
!pip install langchain_experimental
#############################
import os
import openai
import os
os.environ['OPENAI_API_KEY'] = str("Your API Key Goes here")
from langchain_openai import OpenAI
llm = OpenAI(temperature=1, max_tokens=512, model="gpt-3.5-turbo-instruct")
Thiết lập các giá trị…
sudoku_puzzle = "3,*,*,2|1,*,3,*|*,1,*,3|4,*,*,1"
sudoku_solution = "3,4,1,2|1,2,3,4|2,1,4,3|4,3,2,1"
problem_description = f"""
{sudoku_puzzle}
- This is a 4x4 Sudoku puzzle.
- The * represents a cell to be filled.
- The | character separates rows.
- At each step, replace one or more * with digits 1-4.
- There must be no duplicate digits in any row, column or 2x2 subgrid.
- Keep the known digits from previous valid thoughts in place.
- Each thought can be a partial or the final solution.
""".strip()
print(problem_description)
Kiểm tra Dựa trên Quy tắc
Mỗi suy nghĩ được đánh giá bởi bộ kiểm tra suy nghĩ và được gán một loại tính hợp lệ:
- hợp lệ,
- không hợp lệ hoặc
- một phần.
Một bộ kiểm tra đơn giản có thể dựa trên quy tắc. Ví dụ, trong trường hợp của một câu đố sudoku, bộ kiểm tra có thể kiểm tra xem câu đố có hợp lệ, không hợp lệ hay một phần.
Trong đoạn mã sau, chúng tôi triển khai một bộ kiểm tra đơn giản dựa trên quy tắc cho một câu đố sudoku 4x4 cụ thể.
from typing import Tuple
from langchain_experimental.tot.checker import ToTChecker
from langchain_experimental.tot.thought import ThoughtValidity
class MyChecker(ToTChecker):
def evaluate(
self, problem_description: str, thoughts: Tuple[str, ...] = ()
) -> ThoughtValidity:
last_thought = thoughts[-1]
clean_solution = last_thought.replace(" ", "").replace('"', "")
regex_solution = clean_solution.replace("*", ".").replace("|", "\\|")
if sudoku_solution in clean_solution:
return ThoughtValidity.VALID_FINAL
elif re.search(regex_solution, sudoku_solution):
return ThoughtValidity.VALID_INTERMEDIATE
else:```
Test bộ kiểm tra dưới đây:
```checker = MyChecker()
assert (
checker.evaluate("", ("3,*,*,2|1,*,3,*|*,1,*,3|4,*,*,1",))
== ThoughtValidity.VALID_INTERMEDIATE
)
assert (
checker.evaluate("", ("3,4,1,2|1,2,3,4|2,1,4,3|4,3,2,1",))
== ThoughtValidity.VALID_FINAL
)
assert (
checker.evaluate("", ("3,4,1,2|1,2,3,4|2,1,4,3|4,3,*,1",))
== ThoughtValidity.VALID_INTERMEDIATE
)
assert (
checker.evaluate("", ("3,4,1,2|1,2,3,4|2,1,4,3|4,*,3,1",))
== ThoughtValidity.INVALID
)
Chuỗi Cây Tư Duy được khởi tạo và chạy chuỗi ToT, với số lượng tương tác tối đa k được đặt là 20 và số lượng suy nghĩ con tối đa c được đặt là 3.
tot_chain = ToTChain(
llm=llm, checker=MyChecker(), k=20, c=3, verbose=True, verbose_llm=False
)
tot_chain.run(problem_description=problem_description)
Với đầu ra và câu trả lời cuối cùng:
Kết luận
Framework Cây Tư Duy (ToT) chuyển đổi cách hiểu về giải quyết vấn đề cổ điển thành các phương pháp thực tiễn cho các Mô hình Ngôn ngữ hiện đại.
Ngoài ra, các Mô hình Ngôn ngữ khắc phục một điểm yếu của các phương pháp cổ điển bằng cách giải quyết các vấn đề phức tạp, khó hình thức hóa như viết sáng tạo.
Sự giao thoa này của các Mô hình Ngôn ngữ với các phương pháp tiếp cận AI cổ điển đại diện cho một hướng đi mới đầy thú vị.
Nguồn: https://cobusgreyling.medium.com/tree-of-thoughts-prompting-tot-08555b04123e