Vào năm 2024, không thiếu các ứng dụng dựa trên LLM. Các công ty công nghệ lớn như Microsoft và Google đang thúc đẩy các phiên bản mạnh mẽ hơn bao giờ hết của các mẫu ChatGPT và Gemini hàng đầu của họ, đồng thời những công ty chuyên nghiệp như Anthropic đang thúc đẩy các dịch vụ cạnh tranh có tích hợp bổ sung. Trong thế giới LLM ứng dụng, các công ty và thậm chí cả chính phủ đang thử nghiệm các ứng dụng trò chuyện cho nhiều bối cảnh khác nhau.
Bất chấp nguồn năng lượng kinh doanh khổng lồ đổ vào LLM, hầu hết các ứng dụng cao cấp vẫn bị hạn chế do tập trung vào các giao diện giống như trò chuyện, tiếp nhận và trả về văn bản mà con người có thể đọc được. Điều này có thể hiểu được - xét cho cùng, một trong những bước phát triển thú vị nhất của LLM là khả năng hiểu và tạo ra ngôn ngữ của con người, cho phép tạo ra giao diện người dùng đàm thoại. Tuy nhiên, giao diện trò chuyện bỏ qua một trường hợp sử dụng rất quan trọng khác đối với LLM - xử lý văn bản như một bước trung gian trong đường dẫn dữ liệu lớn hơn.
Hôm nay, chúng ta sẽ khám phá trường hợp sử dụng này và xem LLM có thể hữu ích như thế nào như một phần của đường dẫn dữ liệu, không chỉ như một trình tạo ngôn ngữ tự nhiên.
Để sử dụng LLM như một phần của đường truyền dữ liệu, chúng ta cần thay đổi định dạng đầu ra của LLM - thay vì tạo các đoạn văn cho con người đọc, mô hình phải tạo ra thứ gì đó mà máy tính có thể đọc được. Thông thường, điều này có nghĩa là đầu ra có cấu trúc ở định dạng dữ liệu như JSON hoặc hướng dẫn bằng ngôn ngữ lập trình như Python hoặc SQL. Các định dạng đầu ra này khó tha thứ hơn nhiều so với ngôn ngữ tự nhiên, vì thiếu dấu ngoặc kép hoặc dấu ngoặc có thể làm hỏng toàn bộ quy trình. Do đó, chúng tôi sẽ cần dựa vào các phương pháp và tính năng chuyên dụng đã được phát triển để hỗ trợ trường hợp sử dụng này. Các tính năng này được gọi chung là gọi hàm vì đầu ra có xu hướng gọi hàm hoặc được sử dụng trong các lệnh gọi hàm.
Tuy nhiên, trước khi đi sâu vào các phương pháp này, trước tiên chúng ta hãy khám phá sâu hơn một chút tại sao các tính năng gọi hàm lại được phát triển ngay từ đầu.
Kết nối với các dịch vụ bên ngoài
Trường hợp sử dụng ban đầu và đơn giản nhất để gọi hàm là kết nối với các dịch vụ bên ngoài. Khi OpenAI ban đầu phát hành GPT-4, nó cũng cập nhật API với một tính năng cho phép người dùng cung cấp cho mô hình một tập hợp các hàm kiểu python mà mô hình có thể gọi để hoàn thành mục tiêu của mình. Ví dụ, mô hình có thể được cho biết rằng nó có thể gọi một hàm bên ngoài để tính giá của một chứng khoán phức tạp. Sử dụng thông tin này, mô hình sẽ có thể viết mã tính toán giá trị của danh mục đầu tư được tạo thành từ những chứng khoán này mà không cần phải có kiến thức chuyên môn về định giá chứng khoán.
Gọi các hàm kiểu python chỉ là phần nổi của tảng băng trôi. Sau khi tầm quan trọng của việc gọi hàm đã được chứng minh trên thị trường, OpenAI và các nhà cung cấp LLM khác bắt đầu hỗ trợ các định dạng đầu ra khác, chẳng hạn như JSON hoặc SQL. Điều quan trọng là các mô hình này xuất ra các kết quả đầu ra có thể đọc được bằng máy và các quy trình khác có thể đọc được một cách đáng tin cậy.
Những độc giả tinh tường có thể nhận ra rằng chúng tôi đã làm điều gì đó tương tự trong các bài viết trước, sử dụng LLM để tạo dữ liệu huấn luyện , SQL hoặc JSON . Trong các bài viết này, chúng tôi đã hoàn thành việc này bằng cách sử dụng kỹ thuật nhanh chóng và kiểm tra đầu ra, nhưng giờ đây, việc gọi hàm là một tính năng được hỗ trợ rộng rãi, chúng tôi có thể thực hiện việc này dễ dàng hơn bằng cách dựa vào các tính năng cấp mô hình này.
Chuỗi LLM
Việc gọi hàm đã tạo ra những khả năng mới cho các ứng dụng đa LLM và ngay sau đó các nhà phát triển đã thử nghiệm việc xâu chuỗi các LLM để tạo ra các hệ thống phức tạp. Một số hệ thống này được gọi là đại lý , có thể tìm kiếm trên web một cách độc lập, thu thập dữ liệu mới và gọi một LLM khác với thông tin mới. Các quy trình này có khả năng tự chủ đáng kinh ngạc và có khả năng giải quyết các vấn đề phức tạp với rất ít đầu vào, mặc dù vẫn có những hạn chế, chẳng hạn như chi phí API và các biện pháp bảo vệ hành vi, ngăn cản các tác nhân được áp dụng rộng rãi.
Sử dụng LLM làm đầu vào và xử lý trung gian
Một trường hợp sử dụng khác của LLM gọi hàm là xử lý dữ liệu đầu vào và trung gian. LLM có thể được sử dụng để phân tích các đầu vào phi cấu trúc thành dữ liệu có cấu trúc có thể được sử dụng để xử lý tiếp theo. Mặc dù nhiều nhiệm vụ trong số này có xu hướng được chuyển sang các công nghệ NLP “truyền thống”, nhưng tính chất linh hoạt của các mô hình dựa trên máy biến áp có nghĩa là một mô hình được đào tạo cụ thể có thể thực hiện các nhiệm vụ này tốt hơn nhiều so với các công nghệ NLP khác. Do đó, nhiều nhà phát triển đang cố gắng tận dụng các mô hình chuyên biệt này trong đường dẫn dữ liệu của họ.
Bây giờ chúng ta đã quen với lý thuyết đằng sau việc gọi hàm, hãy xem ứng dụng mà chúng ta sẽ xây dựng hôm nay.
Trong bài viết trước , tôi đã tạo một ứng dụng RAG đơn giản để trả lời các câu hỏi bằng ngôn ngữ tự nhiên về bản tin phổ biến của CB Insights. Trong bài viết hôm nay, chúng tôi sẽ xây dựng một ứng dụng trả lời câu hỏi tương tự, nhưng thay vì dựa vào việc nhúng tìm kiếm và GPT3.5, chúng tôi sẽ sử dụng nhận dạng thực thể làm phương pháp lập chỉ mục chính. Ngoài ra, chúng tôi sẽ sử dụng DRAGON làm công cụ tóm tắt để có thể chạy toàn bộ ứng dụng trên máy tính xách tay của mình mà không cần dịch vụ đám mây.
Tại sao nên sử dụng nhận dạng thực thể?
Trước khi đi sâu vào việc triển khai, trước tiên chúng ta hãy khám phá những lợi thế của việc sử dụng NER làm công nghệ truy xuất thay vì nhúng tìm kiếm. Trong quá trình sản xuất, chúng tôi muốn sử dụng từng kỹ thuật tùy theo nhu cầu của tình huống cụ thể, NER cung cấp một số lợi thế so với hệ thống dựa vào việc nhúng tìm kiếm.
Khả năng sửa lỗi: Bởi vì nhận dạng thực thể là một nhiệm vụ có thể xác minh dễ dàng nên toàn bộ quy trình có khả năng sửa lỗi cao hơn nhiều. Thật dễ dàng để kiểm tra xem mô hình có xác định chính xác tất cả các thực thể hay không, đồng thời dễ dàng xây dựng và cải thiện thuật toán so khớp dựa trên các thực thể này. Ngược lại, việc xác minh rằng thuật toán nhúng đang xác định chính xác những điểm tương đồng và khác biệt trong các đoạn văn sẽ khó khăn hơn nhiều.
Tính linh hoạt: Bằng cách tách biệt nhận dạng và lọc, chúng tôi làm cho quy trình linh hoạt hơn nhiều so với thuật toán tìm kiếm dựa trên nhúng. Chúng tôi có thể thêm siêu dữ liệu bổ sung, thay đổi thuật toán tìm kiếm dựa trên loại thực thể và thậm chí sử dụng thuật toán nhúng trên đầu kết quả tìm kiếm dựa trên NER. Điều này cho phép phát triển các tính năng mạnh mẽ hơn nhiều dựa trên sự kết hợp của các công nghệ.
Ví dụ: quy trình dựa trên NER có thể sử dụng tìm kiếm dựa trên thực thể để thu hẹp một tập hợp tài liệu, sau đó sử dụng thuật toán nhúng để thu hẹp hơn nữa trong không gian tìm kiếm. Điều này có xu hướng làm cho việc tìm kiếm nhanh hơn và hiệu quả hơn nhiều.
Sức mạnh nhận dạng: Do có thể có được mức độ kiểm soát thủ công, các đường dẫn NER phù hợp hơn nhiều cho các tác vụ tìm kiếm và truy xuất nhất định. Việc nhúng tìm kiếm dựa trên mức độ gần nhau của các đoạn trong dữ liệu huấn luyện, tính toán xác suất hai tài liệu đến từ cùng một tài liệu lớn hơn. Trong một số trường hợp sử dụng, điều này sẽ khiến tìm kiếm nhúng bỏ lỡ các tài liệu quan trọng.
Bây giờ chúng ta đã hiểu lợi ích của việc sử dụng NER trong quy trình RAG, hãy cùng tìm hiểu sâu hơn về các công nghệ cụ thể mà chúng ta đang sử dụng trong ứng dụng của mình.
Nhận dạng thực thể LLM
Nhận dạng thực thể là một công nghệ NLP “truyền thống” để trích xuất dữ liệu có cấu trúc từ dữ liệu ngôn ngữ phi cấu trúc. Sau đó, dữ liệu được trích xuất có thể được sử dụng trong quá trình xử lý tuyến dưới hoặc làm siêu dữ liệu cho đoạn văn đang được phân tích.
Trong lịch sử, điều này được thực hiện bằng cách sử dụng các thuật toán học máy nhỏ, được xây dựng có mục đích, trước tiên gắn thẻ các phần của lời nói, sau đó là lần chuyển thứ hai để xác định xem các danh từ riêng được xác định có phải là thực thể được đặt tên hay không.
Với LLM gọi hàm, chúng ta có thể hoàn thành nhiệm vụ tương tự với một số lợi thế bổ sung.
Bởi vì kiến trúc máy biến áp có thể hiểu cấu trúc ngôn ngữ tốt hơn các mô hình NLP nhỏ hơn nên hiệu suất có thể sẽ mạnh mẽ hơn, chẳng hạn như trong trường hợp đoạn văn được định dạng không đúng.
Vì LLM đang được cập nhật với dữ liệu đào tạo mới nhất nên hệ thống nhận dạng thực thể có thể luôn cập nhật hơn các mô hình nhận dạng thực thể nguồn mở khác.
Các kỹ thuật kỹ thuật nhanh chóng có thể được sử dụng để nhúng dữ liệu bổ sung và đưa ra các hướng dẫn bổ sung, cho phép thực hiện hành vi linh hoạt hơn ngay cả trong các mô hình có sẵn.
DRAGON Chúng tôi đã đề cập đến Dragon trong bài viết trước, trong đó chúng tôi đã nêu bật hiệu suất ấn tượng của nó trong việc tóm tắt dữ liệu ngôn ngữ tự nhiên. Chúng tôi sẽ sử dụng Dragon để thực hiện bước phân tích cuối cùng, trong đó chúng tôi sẽ tóm tắt tất cả các bài viết có liên quan đến các thực thể đã chọn.
SLIM SLIM là một dòng mới gồm các mô hình thu nhỏ, có thể chạy cục bộ của LLMWare - không có gì bí mật khi tôi là người hâm mộ công việc thu nhỏ của họ - chuyên về chức năng gọi hàm. Các mô hình này đã được tinh chỉnh cụ thể để tạo ra kết quả đầu ra có thể được máy giải thích, cho phép người dùng tận dụng những phát triển gần đây trong kiến trúc gọi hàm mà không cần phải dựa vào API bên ngoài.
Hôm nay chúng ta sẽ sử dụng mô hình SLIMs-NER, mô hình này sẽ thực hiện Nhận dạng thực thể được đặt tên trên các bài viết bản tin. Ngoài NER, còn có các mô hình SLIM để phân tích tình cảm, tạo SQL và tác nhân nhiều bước.
Bây giờ chúng ta đã hiểu công nghệ rồi, hãy triển khai ứng dụng thôi!
Hãy bắt đầu bằng cách tải xuống các bài viết của CB Insights. Hãy nhập các phụ thuộc:
import requests from bs4 import BeautifulSoup import os import pandas as pd import json import re
Và bây giờ là mã để tải xuống kho lưu trữ bản tin:
res = requests.get('https://www.cbinsights.com/newsletter/') soup = BeautifulSoup(res.text) article_links = [[i.text, i['href']] for i in soup.find_all('a') if 'campaign-archive' in i['href'] ] article_soups = [BeautifulSoup(requests.get(link).text) for title, link in article_links]
Bây giờ chúng ta đã tải xuống kho lưu trữ bản tin, hãy xử lý nó thành định dạng JSON
result_json = {} for soup_meta, soup_art in zip(article_links, article_soups): article_tables = [] cur_article = [] for table in soup_art.find_all('table'): if table.attrs.get('mc:variant') == 'Section_Divider': article_tables.append(get_deduped_article_tables(cur_article)) cur_article = [] else: cur_article.append(table.text) article_tables.append(get_deduped_article_tables(cur_article)) result_json[soup_meta[0]] = article_tables articles_with_meta = [] for name, tables in result_json.items(): print(name, pd.to_datetime(tables[0][1].strip())) articles_with_meta.append({ 'name': name, 'date': pd.to_datetime(tables[0][1].strip()).strftime('%Y-%m-%d'), 'tables': tables }) df = pd.DataFrame(articles_with_meta)
Bây giờ chúng ta đang ở vị trí giống như trong bài viết trước. Tuy nhiên, thay vì đi thẳng vào cấu trúc RAG bằng cách tạo các phần nhúng, thay vào đó, chúng tôi sẽ chạy một bước nhận dạng thực thể.
Trước tiên, hãy nhập các phần phụ thuộc để chạy SLIM, một bộ mô hình mới từ LLMWare cho phép chúng tôi thực hiện nhận dạng thực thể cục bộ trên máy của mình:
from llmware.agents import LLMfx from llmware.parsers import WikiParser from collections import defaultdict # define a function for identifying all the named entities def run_ner(text): agent = LLMfx() agent.load_work(text) agent.load_tool("ner") named_entities = agent.ner() ner_dict= named_entities["llm_response"] return ner_dict
Bây giờ chúng ta có thể chạy nhận dạng thực thể được đặt tên trên tất cả các bài viết:
date_entities = defaultdict(dict) for _, row in df.iterrows(): for idx, t in enumerate(row['tables'][1:]): if 'Start Your Free Trial' in t: t = t[:t.index('Start Your Free Trial')] date_entities[row['date']][idx] = run_ner('\n'.join(t))
Có thể mất vài phút để quy trình NER hoàn tất, nhưng đây là tất cả những gì bạn cần để nhận dạng các thực thể bằng cách sử dụng LLM thu nhỏ hiện đại.
Bạn có thể kiểm tra từ điển date_entities bằng cách in một số mục kiểm tra. Ví dụ: mã:
date_entities[list(date_entities.keys())[0]]
Nên tạo ra đầu ra dưới đây:
{0: {'people': ['Yahoo!'], 'place': [], 'company': ['Databricks', 'MosaicML'], 'misc': []}, 1: {'people': [], 'place': ['New York'], 'company': ['CB Insights'], 'misc': []}}
Hiển thị tất cả các thực thể khác nhau đã được mô hình SLIM phát hiện.
Bây giờ các thực thể đã được phát hiện, hãy xây dựng quy trình làm việc trả lời câu hỏi thể hiện sức mạnh của kỹ thuật này. Trong ví dụ của chúng tôi, chúng tôi sẽ sử dụng câu hỏi kiểm tra: OpenAI đóng vai trò gì trong chiến lược AI của Microsoft?
Hãy bắt đầu bằng cách nhập các gói thích hợp để chạy DRAGON:
from llmware.prompts import Prompt query = "What role does OpenAI play in Microsoft's AI strategy?" model_name = "llmware/dragon-llama-7b-gguf" prompter = Prompt().load_model(model_name)
Bây giờ, chúng ta có thể xây dựng hàm trả lời câu hỏi bằng cách sử dụng nhận dạng thực thể. Để tận dụng dữ liệu NER của chúng tôi, chúng tôi sẽ muốn triển khai quy trình làm việc sau:
Đây là quy trình làm việc ở dạng mã:
def answer_question_with_ner(query): ner_results = run_ner(query) # run NER on the user query search_entities = [] for ent_type, ent_list in ner_results.items(): search_entities.extend(ent_list) # create a list of entities to search for search_entities = list(set(search_entities)) # now perform a lookup for articles that mention the identified entities, using set arithmetic. articles = set(entity_to_place_map[search_entities[0]]) for se in search_entities: articles &= set(entity_to_place_map[se]) # now process the corpus into a prompt and feed it to the question-answering LLM. article_content = [] for article in articles: article_content.extend(df[df['date'] == article[0]].iloc[0]['tables'][article[1]+1]) response = prompter.prompt_main(query, context='\n'.join(article_content), prompt_name="default_with_context", temperature=0.3) return response # return the response.
Chạy hàm với truy vấn từ khối mã đầu tiên và bạn sẽ thấy kết quả sau:
Microsoft has poured billions of dollars into ChatGPT developer OpenAI. However, it's also placed a number of bets on other GenAI startups across computing, mapping, and gaming.
Bạn cũng có thể thấy trong phần “bằng chứng” của đối tượng phản hồi rằng thực tế là hai bài viết từ kho lưu trữ CB Insights đề cập đến Microsoft và OpenAI đã được truy xuất và câu trả lời của LLM dựa trực tiếp vào bằng chứng.
Lưu ý rằng vì chúng tôi đang thực hiện nhận dạng thực thể rõ ràng nên quá trình truy xuất cực kỳ minh bạch và có thể sửa lỗi. Nếu có câu hỏi đặt ra là tại sao mô hình lại truy xuất những mẩu thông tin cụ thể này từ kho văn bản - tất cả những gì cần làm là một câu lệnh in đơn giản để thấy rằng mô hình đã chọn bài viết vì truy vấn đề cập đến “Microsoft” và “OpenAI” và hai phần bản tin được truy xuất là những phần duy nhất đề cập đến cả hai thực thể.
Ngoài ra, khi so sánh với tìm kiếm vectơ dựa trên nhúng, phương pháp tra cứu NER cung cấp câu trả lời chính xác hơn nhiều. Trong các thử nghiệm của tôi, các bài viết được chọn nằm trong top 10 bài viết phù hợp nhất được xếp hạng theo thuật toán ada của OpenAI, nhưng không phải là bài viết được xác định là có độ sát gần nhất với câu hỏi hiện tại. Do đó, có thể một ứng dụng sử dụng tính năng tìm kiếm nhúng có thể đã không trả lời chính xác câu hỏi và việc thiếu khả năng sửa lỗi sẽ chỉ góp phần gây ra sự nhầm lẫn.
Và cùng với đó, chúng tôi đã xây dựng một ứng dụng trả lời câu hỏi bằng cách sử dụng tra cứu NER, cải thiện chất lượng của quy trình trong quy trình!
Hôm nay, chúng tôi đã xây dựng một ứng dụng sử dụng chức năng gọi hàm, một tính năng LLM mới thú vị. Các mô hình gọi hàm được thu nhỏ, có thể chạy cục bộ là một sự phát triển mang tính cách mạng giúp mở ra một lớp ứng dụng AI mới và chúng ta mới chỉ thấy phiên bản đầu tiên của những công nghệ này. Sẽ rất thú vị để xem các nhà phát triển ứng dụng sẽ tạo ra những ứng dụng gì bằng những công nghệ này trong những tháng tới.
Nếu bạn có một ý tưởng trong không gian AI mà bạn muốn triển khai hoặc chỉ đơn giản là muốn trò chuyện về công nghệ, vui lòng liên hệ trên Github hoặc LinkedIn .
Nếu bạn muốn tìm hiểu thêm về LLMWare, công ty đứng sau SLIM và DRAGON, bạn có thể tìm thấy chúng trên HugginFace hoặc Github .