paint-brush
Tìm kiếm ngữ nghĩa so với từ khóa để tìm bối cảnh ChatGPTtừ tác giả@tsg
2,416 lượt đọc
2,416 lượt đọc

Tìm kiếm ngữ nghĩa so với từ khóa để tìm bối cảnh ChatGPT

từ tác giả Tudor Golubenco8m2023/03/15
Read on Terminal Reader

dài quá đọc không nổi

Tuần trước, chúng tôi đã thêm một bot Hỏi & Đáp trả lời các câu hỏi từ [tài liệu của chúng tôi] Điều này tận dụng công nghệ ChatGPT để trả lời các câu hỏi từ tài liệu Xata. Cách chúng tôi làm điều này là sử dụng phương pháp do Simon Willison đề xuất. Cách tiếp cận tương tự cũng có thể được tìm thấy trong sách dạy nấu ăn OpenAI.
featured image - Tìm kiếm ngữ nghĩa so với từ khóa để tìm bối cảnh ChatGPT
Tudor Golubenco HackerNoon profile picture
0-item
1-item


Tuần trước, chúng tôi đã thêm bot Hỏi & Đáp để trả lời các câu hỏi từ tài liệu của chúng tôi . Điều này tận dụng công nghệ ChatGPT để trả lời các câu hỏi từ tài liệu Xata, mặc dù mô hình OpenAI GPT chưa bao giờ được đào tạo trên tài liệu Xata.


Cách chúng tôi thực hiện điều này là sử dụng phương pháp do Simon Willison đề xuất trong bài đăng trên blog này. Cách tiếp cận tương tự cũng có thể được tìm thấy trong sách dạy nấu ăn OpenAI . Ý tưởng như sau:


  1. Chạy tìm kiếm văn bản đối với tài liệu để tìm nội dung phù hợp nhất với câu hỏi của người dùng.

  2. Tạo lời nhắc với hình thức chung này:

     With these rules: {rules} And this text: {context} Given the above text, answer the question: {question} Answer:
  3. Gửi lời nhắc tới API ChatGPT và để mô hình hoàn thành câu trả lời.


Chúng tôi phát hiện ra rằng điều này hoạt động khá tốt và kết hợp với nhiệt độ mô hình tương đối thấp (khái niệm về nhiệt độ được giải thích trong bài đăng trên blog này), điều này có xu hướng tạo ra kết quả và đoạn mã chính xác, miễn là có thể tìm thấy câu trả lời trong tài liệu.


Hạn chế chính đối với phương pháp này là lời nhắc mà bạn tạo ở bước thứ hai ở trên cần phải có tối đa 4000 mã thông báo (~3000 từ). Điều này có nghĩa là bước đầu tiên, tìm kiếm văn bản để chọn các tài liệu phù hợp nhất, trở nên thực sự quan trọng. Nếu bước tìm kiếm hoạt động tốt và cung cấp ngữ cảnh phù hợp, thì ChatGPT có xu hướng cũng hoạt động tốt trong việc tạo ra kết quả chính xác và đúng trọng tâm.


Vì vậy, cách tốt nhất để tìm các phần nội dung có liên quan nhất trong tài liệu là gì? Sách dạy nấu ăn OpenAI, cũng như blog của Simon, sử dụng cái được gọi là tìm kiếm ngữ nghĩa. Tìm kiếm ngữ nghĩa tận dụng mô hình ngôn ngữ để tạo nhúng cho cả câu hỏi và nội dung. Phần nhúng là các mảng số đại diện cho văn bản trên một số thứ nguyên. Các đoạn văn bản có phần nhúng tương tự có ý nghĩa tương tự. Điều này có nghĩa là một chiến lược tốt là tìm các phần nội dung có phần nhúng tương tự nhất với phần nhúng câu hỏi.


Một chiến lược khả thi khác, dựa trên tìm kiếm từ khóa cổ điển hơn, giống như sau:


  • Yêu cầu ChatGPT trích xuất các từ khóa từ câu hỏi, với lời nhắc như sau:

     Extract keywords for a search query from the text provided. Add synonyms for words where a more common one exists.
  • Sử dụng các từ khóa được cung cấp để chạy tìm kiếm văn bản miễn phí và chọn kết quả hàng đầu


Đặt nó trong một sơ đồ duy nhất, hai phương pháp trông như thế này:

Chúng tôi đã thử cả hai trên tài liệu của mình và đã nhận thấy một số ưu và nhược điểm.


Hãy bắt đầu bằng cách so sánh một vài kết quả. Cả hai đều chạy trên cùng một cơ sở dữ liệu và cả hai đều sử dụng mô hình ChatGPT gpt-3.5-turbo . Vì có sự ngẫu nhiên liên quan, tôi chạy mỗi câu hỏi 2-3 lần và chọn câu hỏi mà tôi thấy là kết quả tốt nhất.

Câu hỏi: Làm cách nào để cài đặt Xata CLI?

Trả lời với tìm kiếm véc tơ:

Trả lời với từ khóa tìm kiếm:

Bản án : Cả hai phiên bản đều cung cấp câu trả lời đúng, tuy nhiên, tìm kiếm theo vectơ hoàn chỉnh hơn một chút. Cả hai đều tìm thấy trang tài liệu chính xác cho nó, nhưng tôi nghĩ phương pháp phỏng đoán dựa trên điểm nổi bật của chúng tôi đã chọn một đoạn văn bản ngắn hơn trong trường hợp chiến lược từ khóa.


Người chiến thắng: tìm kiếm vector.

Tỷ số: 1-0

Câu hỏi: Làm thế nào để bạn sử dụng Xata với Deno?

Trả lời với tìm kiếm véc tơ:

Trả lời với từ khóa tìm kiếm:

Bản án: Kết quả đáng thất vọng cho tìm kiếm vectơ, người bằng cách nào đó đã bỏ lỡ trang Deno chuyên dụng trong tài liệu của chúng tôi. Nó đã tìm thấy một số nội dung khác có liên quan đến Deno, nhưng không tìm thấy trang chứa ví dụ rất hữu ích.


Người chiến thắng: tìm kiếm từ khóa.

Tỷ số: 1-1

Câu hỏi: Làm cách nào tôi có thể nhập tệp CSV với các loại cột tùy chỉnh?

Với tìm kiếm vectơ:

Với từ khóa tìm kiếm:

Phán quyết: Cả hai đều đã tìm đúng trang (“Nhập tệp CSV”), nhưng phiên bản tìm kiếm từ khóa đã quản lý để có được câu trả lời đầy đủ hơn. Tôi đã chạy điều này nhiều lần để đảm bảo rằng nó không phải là một sự may mắn. Tôi nghĩ rằng sự khác biệt đến từ cách chọn đoạn văn bản (láng giềng với từ khóa trong trường hợp tìm kiếm từ khóa, từ đầu trang trong trường hợp tìm kiếm theo vectơ).


Người chiến thắng: tìm kiếm từ khóa.

Tỷ số: 1-2

Câu hỏi: Làm cách nào tôi có thể lọc bảng có tên Người dùng theo cột email?

Với tìm kiếm vectơ:

Với từ khóa tìm kiếm:

Phán quyết: Tìm kiếm theo véc-tơ hoạt động tốt hơn trên trang này vì nó tìm thấy trang “Lọc” trên đó có nhiều ví dụ hơn mà ChatGPT có thể sử dụng để soạn câu trả lời. Câu trả lời tìm kiếm từ khóa bị phá vỡ một cách tinh vi, bởi vì nó sử dụng “truy vấn” thay vì “bộ lọc” cho tên phương thức.


Người chiến thắng: tìm kiếm vector.

Tỷ số: 2-2

Câu hỏi: Xata là gì?

Với tìm kiếm vectơ:

Với từ khóa tìm kiếm:

Phán quyết: Đây là một trận hòa, bởi vì cả hai câu trả lời đều khá tốt. Cả hai đã chọn các trang khác nhau để tóm tắt trong một câu trả lời, nhưng cả hai đều làm rất tốt và tôi không thể chọn người chiến thắng.


Tỷ số: 3-3

Cấu hình và điều chỉnh

Đây là một yêu cầu Xata mẫu được sử dụng để tìm kiếm từ khóa:

 // POST https://workspace-id.eu-west-1.xata.sh/db/docs:main/tables/search/ask { "question": "What is Xata?", "rules": [ "Do not answer questions about pricing or the free tier. Respond that Xata has several options available, please check https://xata.io/pricing for more information.", "If the user asks a how-to question, provide a code snippet in the language they asked for with TypeScript as the default.", "Only answer questions that are relating to the defined context or are general technical questions. If asked about a question outside of the context, you can respond with \"It doesn't look like I have enough information to answer that. Check the documentation or contact support.\"", "Results should be relevant to the context provided and match what is expected for a cloud database.", "If the question doesn't appear to be answerable from the context provided, but seems to be a question about TypeScript, Javascript, or REST APIs, you may answer from outside of the provided context.", "If you answer with Markdown snippets, prefer the GitHub flavour.", "Your name is DanGPT" ], "searchType": "keyword", "search": { "fuzziness": 1, "target": [ "slug", { "column": "title", "weight": 4 }, "content", "section", { "column": "keywords", "weight": 4 } ], "boosters": [ { "valueBooster": { "column": "section", "value": "guide", "factor": 18 } } ] } }


Và đây là những gì chúng tôi sử dụng để tìm kiếm véc tơ:

 // POST https://workspace-id.eu-west-1.xata.sh/db/docs:main/tables/search/ask { "question": "How do I get a record by id?", "rules": [ "Do not answer questions about pricing or the free tier. Respond that Xata has several options available, please check https://xata.io/pricing for more information.", "If the user asks a how-to question, provide a code snippet in the language they asked for with TypeScript as the default.", "Only answer questions that are relating to the defined context or are general technical questions. If asked about a question outside of the context, you can respond with \"It doesn't look like I have enough information to answer that. Check the documentation or contact support.\"", "Results should be relevant to the context provided and match what is expected for a cloud database.", "If the question doesn't appear to be answerable from the context provided, but seems to be a question about TypeScript, Javascript, or REST APIs, you may answer from outside of the provided context.", "Your name is DanGPT" ], "searchType": "vector", "vectorSearch": { "column": "embeddings", "contentColumn": "content", "filter": { "section": "guide" } } }

Như bạn có thể thấy, phiên bản tìm kiếm từ khóa có nhiều cài đặt hơn, định cấu hình độ mờ và bộ tăng tốc cũng như trọng số cột. Tìm kiếm vectơ chỉ sử dụng bộ lọc. Tôi sẽ gọi đây là một điểm cộng cho tìm kiếm từ khóa: bạn có nhiều quay số hơn để điều chỉnh tìm kiếm và do đó nhận được câu trả lời tốt hơn. Nhưng nó cũng hiệu quả hơn và kết quả từ tìm kiếm vectơ khá tốt mà không cần điều chỉnh này.


Trong trường hợp của chúng tôi, chúng tôi đã điều chỉnh tìm kiếm từ khóa cho chức năng tìm kiếm tài liệu của chúng tôi. Vì vậy, nó không nhất thiết phải làm thêm và trong khi chơi với ChatGPT, chúng tôi đã phát hiện ra những cải tiến đối với tài liệu và tìm kiếm của mình. Ngoài ra, Xata tình cờ có một giao diện người dùng rất đẹp để điều chỉnh tìm kiếm từ khóa của bạn, vì vậy công việc bắt đầu không khó (lên kế hoạch cho một bài đăng blog riêng về điều đó).


Không có lý do gì mà tìm kiếm véc-tơ lại không thể có bộ tăng cường và trọng số cột, v.v., nhưng chúng tôi chưa có nó trong Xata và tôi không biết bất kỳ giải pháp nào khác giúp việc đó trở nên dễ dàng như chúng tôi tạo từ khóa điều chỉnh tìm kiếm. Và, nói chung, có nhiều kỹ thuật trước đó để tìm kiếm từ khóa, nhưng rất có thể tìm kiếm theo vectơ sẽ bắt kịp.


Hiện tại, tôi sẽ gọi từ khóa tìm kiếm là người chiến thắng

Tỷ số: 3-4

Sự tiện lợi

Tài liệu của chúng tôi đã có chức năng tìm kiếm, Xata cho chó ăn, vì vậy việc mở rộng sang bot trò chuyện khá đơn giản. Xata giờ đây cũng hỗ trợ tìm kiếm véc tơ nguyên gốc, nhưng việc sử dụng nó yêu cầu thêm các phần nhúng cho tất cả các trang tài liệu và tìm ra một chiến lược phân đoạn tốt. Chúng tôi đã sử dụng API nhúng OpenAI để tạo ra các nhúng văn bản có chi phí tối thiểu.


Người chiến thắng: Tìm kiếm từ khóa

Điểm 3-5

độ trễ

Phương pháp tìm kiếm từ khóa cần thêm một chuyến đi khứ hồi tới API ChatGPT. Điều này làm tăng thêm độ trễ cho kết quả bắt đầu được truyền trực tuyến trong giao diện người dùng. Theo phép đo của tôi, điều này làm tăng thêm khoảng 1,8 giây thời gian.


Với tìm kiếm vectơ:

Với từ khóa tìm kiếm:

Lưu ý: Tổng thời gian và thời gian tải xuống nội dung ở đây không liên quan vì chúng chủ yếu phụ thuộc vào thời lượng phản hồi được tạo. Nhìn vào thanh “Đang chờ phản hồi của máy chủ” (màu xanh lục) để so sánh.


Người chiến thắng: Tìm kiếm véc tơ

Điểm: 4-5

Trị giá

Phiên bản tìm kiếm từ khóa cần thực hiện lệnh gọi API bổ sung tới API ChatGPT, mặt khác, phiên bản tìm kiếm vectơ cần tạo nhúng cho tất cả các tài liệu trong cơ sở dữ liệu cùng với câu hỏi.


Trừ khi chúng ta đang nói về rất nhiều tài liệu, tôi sẽ gọi đây là một sự ràng buộc.


Điểm: 5-6

Phần kết luận

Điểm số là sít sao! Trong trường hợp của chúng tôi, hiện tại chúng tôi đã sử dụng tìm kiếm từ khóa, chủ yếu là vì chúng tôi có nhiều cách điều chỉnh nó hơn và kết quả là nó tạo ra câu trả lời tốt hơn một chút cho bộ câu hỏi kiểm tra của chúng tôi. Ngoài ra, mọi cải tiến mà chúng tôi thực hiện để tìm kiếm sẽ tự động mang lại lợi ích cho cả trường hợp sử dụng tìm kiếm và trò chuyện. Khi chúng tôi đang cải thiện khả năng tìm kiếm vectơ của mình với nhiều tùy chọn điều chỉnh hơn, chúng tôi có thể chuyển sang tìm kiếm vectơ hoặc phương pháp kết hợp trong tương lai.


Nếu bạn muốn thiết lập một bot trò chuyện tương tự cho tài liệu của riêng mình hoặc bất kỳ loại cơ sở kiến thức nào, bạn có thể dễ dàng triển khai những điều trên bằng cách sử dụng điểm cuối Xata ask. Tạo một tài khoản miễn phí và tham gia với chúng tôi trên Discord . Tôi rất vui khi được đích thân giúp bạn thiết lập và chạy nó!