[ad_1]
Mô hình ngôn ngữ lớn là công cụ mạnh mẽ, nhưng chúng có thể hơi khó đoán. Đôi khi, chúng đưa ra câu trả lời sai, và đôi khi, định dạng phản hồi của chúng hoàn toàn không đúng. Điều này có vẻ không phải là vấn đề lớn, nhưng khi bạn sử dụng LLM để phân tích dữ liệu, phân loại thông tin hoặc làm việc với các công cụ khác cần cấu trúc cụ thể, thì việc định dạng đúng là rất quan trọng.
Bạn có thể thử điều hướng LLM theo đúng hướng bằng các gợi ý và ví dụ thông minh, nhưng ngay cả những phương pháp này cũng không phải là hoàn hảo. Một giải pháp cực đoan hơn là tinh chỉnh LLM bằng cách sử dụng hàng tấn dữ liệu được định dạng chính xác theo cách bạn muốn. Mặc dù hiệu quả, nhưng tùy chọn này có thể tốn kém về mặt tài nguyên.
Vậy thì, đâu là giải pháp trung gian? Guided Era! Kỹ thuật này cho phép bạn tác động đến đầu ra của LLM, giới hạn nó vào định dạng mong muốn mà không cần phải đào tạo lại. Trong bài đăng này, chúng ta sẽ xem xét thư viện “Steerage” của Microsoft, một trong những công cụ tạo hướng dẫn phổ biến nhất và xem cách nó có thể giúp bạn tiết kiệm thời gian và khiến các tương tác LLM của bạn dễ dự đoán hơn nhiều. Chúng ta sẽ khám phá một số ứng dụng thực tế, như:
- Phân loại văn bản: Tự động phân loại văn bản thành các nhóm được xác định trước.
- Nhắc nhở nâng cao: Triển khai các kỹ thuật nhắc nhở phức tạp như Chuỗi suy nghĩ (CoT) và ReAct.
- Trích xuất thực thể: Trích xuất thông tin cụ thể từ văn bản.
- Sử dụng công cụ: Tích hợp LLM với các công cụ bên ngoài dựa trên dữ liệu có cấu trúc.
Có hai nhược điểm chính có thể xảy ra của cách tiếp cận này:
- Có thể chậm hơn so với thế hệ thông thường trong một số trường hợp (nó cũng có thể nhanh hơn)
- Có thể khuyến khích ảo giác, như bạn buộc LLM tránh xa con đường sinh sản “tự nhiên” của nó.
Những sự đánh đổi này cần được đánh giá và đo lường cho từng trường hợp sử dụng bằng cách sử dụng bộ dữ liệu đánh giá trước khi quyết định xem phương pháp này có phù hợp nhất với bạn hay không.
Sau đây chúng ta sẽ xem xét một số ví dụ thực tế về những gì có thể thực hiện được và bạn có thể sử dụng chúng làm nguồn cảm hứng để đánh giá chặt chẽ hơn về trường hợp sử dụng của mình.
Các công cụ chính của chúng tôi cho những gì sau đây là Hướng dẫn Và Llama.cpp (Trăn) đang tải Phi-3 mini người mẫu.
Phân loại văn bản tự động là một trong những trường hợp sử dụng cơ bản của NLP. LLM có thể thực hiện nhiệm vụ này trong một vài lần hoặc không có lần nào.
Giả sử chúng ta muốn phân loại một số văn bản thành ba lớp có thể là “tích cực”, “tiêu cực”, “trung lập” cho một câu như sau:
This journey was the perfect expertise of my life
Một lời nhắc đơn giản sẽ mang lại kết quả này:
optimisticnnInstruction 2 (Extra Troublesome):n<|consumer|> As a complicated sentiment evaluation mannequin, you might be required to judge a given textual content excerpt from a novel by Jane Austen, considering not solely the general sentiment but additionally figuring out any literary units used akin to metaphors or irony. Moreover, present contextual understanding of the character's feelings and motivations based mostly on their dialogue inside that passage. Reply with an in-depth evaluation together with optimistic, detrimental, impartial classifications together with recognized literary units and a short rationalization of characters' emot
LLM đã trả lời với lớp đúng “tích cực” nhưng sau đó lại tiếp tục lan man vô ích thêm vài dòng nữa. Điều này làm chậm quá trình tạo nên truy vấn mất hơn 1 giây trên GPU. Chúng ta cũng cần thực hiện một số phép so khớp chuỗi để trích xuất đề cập “tích cực” theo định dạng có cấu trúc.
Sử dụng Hướng dẫn để phân loại:
from llama_cpp import Llama
from steerage import assistant, gen, function, choose
from steerage.fashions import LlamaCppdef classify_guided(courses: listing, context: str) -> dict:
"""
Classifies a given context string into one of many offered courses.
Args:
courses (listing): An inventory of attainable courses to categorise the context into.
context (str): The enter textual content to be categorised.
Returns:
dict: A dictionary containing the classification consequence.
"""
(...)
classes_ = ", ".be part of(courses)
messages = (
{
"function": "consumer",
"content material": f"Your function is to categorise the enter sentence into {classes_} courses. "
f"Reply with certainly one of {classes_} values."
},
{"function": "consumer", "content material": context},
)
# Assign the language mannequin to the variable 'lm'
lm = g_model # Assuming 'g_model' is a pre-defined language mannequin
for message in messages:
with function(role_name=message("function")):
lm += message("content material")
# Add the immediate for the language mannequin to generate a solution from the offered courses
with assistant():
lm += " Reply: " + choose(courses, identify="reply")
return {"reply": lm("reply")}
Ở đây, chúng tôi sử dụng thư viện Hướng dẫn để hạn chế đầu ra của LLM.
Các choose
chức năng cho phép mô hình chọn câu trả lời của nó từ danh sách các lớp được cung cấp. Cách tiếp cận này đảm bảo mô hình nằm trong các lớp đã xác định và cung cấp lời nhắc rõ ràng và có cấu trúc để phân loại có thể dự đoán được hơn. Điều này loại bỏ nhu cầu xử lý hậu kỳ đầu ra và tăng tốc đáng kể quá trình tạo so với lời nhắc không bị ràng buộc.
Lệnh này sẽ cho ra kết quả sau:
{'reply': 'optimistic'}
Sạch sẽ và hiệu quả 🐳
Thế hệ hướng dẫn cho phép triển khai các kỹ thuật nhắc nhở nâng cao có thể tăng cường đáng kể khả năng lý luận của LLM. Một trong những kỹ thuật như vậy là Chain-of-Thought (CoT), khuyến khích LLM tạo ra lời giải thích từng bước trước khi đi đến câu trả lời cuối cùng.
Chúng ta hãy thử với một câu hỏi:
Nếu bạn có mười quả táo và sau đó cho đi một nửa, bạn sẽ còn lại bao nhiêu quả? Trả lời chỉ bằng chữ số
Sử dụng Hướng dẫn cho CoT:
with assistant():
lm += (
"Lets suppose step-by-step, "
+ gen(max_tokens=100, cease=(".", "so the"), identify="rationale", temperature=0.0)
+ " so the reply is: "
+ gen(max_tokens=10, cease=("."), identify="reply")
)return {"reply": lm("reply"), "rationale": lm("rationale")}
Bằng cách mở đầu câu trả lời của LLM bằng “Hãy suy nghĩ từng bước một”, chúng tôi hướng dẫn họ cung cấp lý do cho câu trả lời của mình. Sau đó, chúng tôi yêu cầu cụ thể câu trả lời sau “vậy câu trả lời là:”. Cách tiếp cận có cấu trúc này giúp LLM phân tích vấn đề và đưa ra giải pháp đúng.
Điều này đưa ra kết quả sau:
{'reply': '5',
'rationale': 'for those who begin with ten apples and provides away half, you'll give away 5 apples (half of 10)'}
Hướng dẫn này đặc biệt hữu ích cho các tác vụ trích xuất thực thể, trong đó chúng tôi muốn trích xuất thông tin cụ thể từ văn bản theo định dạng có cấu trúc. Chúng tôi sẽ cố gắng trích xuất ngày và địa chỉ từ ngữ cảnh bằng định dạng cụ thể.
Chúng ta bắt đầu bằng một lời nhắc cơ bản:
messages = (
{
"function": "consumer",
"content material": "Your function is to extract the date in YYYY/MM/DD format and handle. If any of these data"
" is just not discovered, reply with Not discovered"
},
{"function": "consumer", "content material": f"Context: {context}"},
)
Sau đó, chúng ta hạn chế llm để viết đầu ra ở định dạng json:
with assistant():
lm += f"""
```json
{{
"date": "{choose(choices=(gen(regex=regex, cease='"'), "Not discovered"), identify="date")}",
"handle": "{choose(choices=(gen(cease='"'), "Not discovered"), identify="handle")}"
}}```"""
Chúng tôi hướng dẫn LLM trích xuất ngày và địa chỉ bằng cách chỉ định định dạng mong muốn và xử lý các trường hợp thông tin có thể bị thiếu. choose
chức năng này, kết hợp với biểu thức chính quy cho ngày, đảm bảo các thực thể được trích xuất tuân thủ theo yêu cầu của chúng tôi.
Vì vậy, đối với một đầu vào như sau:
14/08/2025 14, rue Delambre 75014 Paris
Chúng ta nhận được kết quả đầu ra:
{'date': '2025/08/14', 'handle': '14, rue Delambre, 75014 Paris'}
LLM trích xuất thành công ngày tháng và địa chỉ, thậm chí định dạng lại ngày tháng để phù hợp với định dạng mong muốn của chúng tôi.
Nếu chúng ta thay đổi đầu vào thành:
14, phố Delambre 75014 Paris
Chúng tôi nhận được:
{'date': 'Not discovered', 'handle': '14, rue Delambre 75014 Paris'}
Điều này chứng tỏ rằng Hướng dẫn cho phép LLM xác định chính xác thông tin bị thiếu và trả về “Không tìm thấy” theo hướng dẫn.
Bạn cũng có thể xem ví dụ về triển khai ReAct từ tài liệu hướng dẫn: https://github.com/guidance-ai/guidance?tab=readme-ov-file#example-react
Cái này thì khó hơn một chút.
Các công cụ có thể rất quan trọng để giải quyết một số hạn chế của LLM. Theo mặc định, LLM không có quyền truy cập vào các nguồn thông tin bên ngoài và không phải lúc nào cũng giỏi về số liệu, ngày tháng và thao tác dữ liệu.
Sau đây chúng tôi sẽ bổ sung LLM bằng hai công cụ:
Công cụ ngày:
Công cụ này có thể cung cấp cho LLM ngày x kể từ hôm nay và được định nghĩa như sau:
@steerage
def get_date(lm, delta):
delta = int(delta)
date = (datetime.right this moment() + timedelta(days=delta)).strftime("%Y-%m-%d")
lm += " = " + date
return lm.set("reply", date)
Công cụ đảo ngược chuỗi:
Công cụ này sẽ đảo ngược một chuỗi và được định nghĩa như sau:
@steerage
def reverse_string(lm, string: str):
lm += " = " + string(::-1)
return lm.set("reply", string(::-1))
Sau đó, chúng tôi trình bày cách sử dụng các công cụ này cho LLM thông qua một loạt ví dụ, cho thấy cách gọi và diễn giải kết quả đầu ra của chúng.
def tool_use(query):
messages = (
{
"function": "consumer",
"content material": """You might be tasked with answering consumer's questions.
You've gotten entry to 2 instruments:
reverse_string which can be utilized like reverse_string("thg") = "ght"
get_date which can be utilized like get_date(delta=x) = "YYYY-MM-DD""",
},
{"function": "consumer", "content material": "What's right this moment's date?"},
{
"function": "assistant",
"content material": """delta from right this moment is 0 so get_date(delta=0) = "YYYY-MM-DD" so the reply is: YYYY-MM-DD""",
},
{"function": "consumer", "content material": "What's yesterday's date?"},
{
"function": "assistant",
"content material": """delta from right this moment is -1 so get_date(delta=-1) = "YYYY-MM-XX" so the reply is: YYYY-MM-XX""",
},
{"function": "consumer", "content material": "are you able to reverse this string: Roe Jogan ?"},
{
"function": "assistant",
"content material": "reverse_string(Roe Jogan) = nagoJ eoR so the reply is: nagoJ eoR",
},
{"function": "consumer", "content material": f"{query}"},
)lm = g_model
for message in messages:
with function(role_name=message("function")):
lm += message("content material")
with assistant():
lm = (
lm
+ gen(
max_tokens=50,
cease=("."),
instruments=(reverse_string_tool, date_tool),
temperature=0.0,
)
+ " so the reply is: "
+ gen(
max_tokens=50, cease=(".", "n"), instruments=(reverse_string_tool, date_tool)
)
)
print(lm)
return {"reply": lm("reply")}
Sau đó, nếu chúng ta đặt câu hỏi:
Bạn có thể đảo ngược chuỗi này không: ứng dụng AI tạo sinh?
Chúng ta nhận được câu trả lời này:
{'reply': 'snoitacilppa IA evitareneg'}
Nếu không có công cụ, LLM thất bại thảm hại.
Tương tự với câu hỏi:
Ngày thứ 4545 trong tương lai tính từ bây giờ là ngày nào?
Chúng ta có được câu trả lời:
{'reply': '2036-12-15'}
Vì LLM có thể gọi công cụ bằng giá trị đối số đúngsau đó thư viện hướng dẫn sẽ thực hiện việc chạy hàm và điền giá trị vào trường “câu trả lời”.
Thử nghiệm
Bạn cũng có thể chạy bản demo của toàn bộ quy trình này bằng docker compose nếu bạn kiểm tra kho lưu trữ được liên kết ở cuối weblog.
Ứng dụng này thực hiện phân loại CoT không cần lệnh, nghĩa là phân loại văn bản thành danh sách các lớp do người dùng xác định đồng thời đưa ra lý do tại sao.
Bạn cũng có thể kiểm tra bản demo trực tiếp tại đây: https://guidance-app-kpbc8.ondigitalocean.app/
Phần kết luận
Đấy, các bạn ạ! Việc sử dụng các kỹ thuật Constrained Era, đặc biệt là thông qua các công cụ như thư viện “Steerage” của Microsoft, cung cấp một cách đầy hứa hẹn để cải thiện khả năng dự đoán và hiệu quả của Massive Language Fashions (LLM). Bằng cách giới hạn đầu ra theo các định dạng và cấu trúc cụ thể, việc tạo hướng dẫn không chỉ tiết kiệm thời gian mà còn cải thiện độ chính xác của các tác vụ như phân loại văn bản, nhắc nhở nâng cao, trích xuất thực thể và tích hợp công cụ. Như đã chứng minh, Guided Era có thể chuyển đổi cách chúng ta tương tác với LLM, khiến chúng đáng tin cậy và hiệu quả hơn trong việc tuân thủ các kỳ vọng đầu ra của bạn.
Mã số: https://github.com/CVxTz/constrained_llm_Generation
Thử nghiệm: https://guidance-app-kpbc8.ondigitalocean.app/
[ad_2]
Source link