paint-brush
Xây dựng một sản phẩm hỗ trợ nhúng để tìm kiếm các bài luận của Paul Graham bằng Siritừ tác giả@anotherai
746 lượt đọc
746 lượt đọc

Xây dựng một sản phẩm hỗ trợ nhúng để tìm kiếm các bài luận của Paul Graham bằng Siri

từ tác giả Embedbase11m2023/02/14
Read on Terminal Reader

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

“Phần nhúng” là một khái niệm trong máy học cho phép bạn so sánh dữ liệu. “Embedbase” là một API nguồn mở để xây dựng, lưu trữ và truy xuất các phần nhúng. Chúng tôi sẽ xây dựng một công cụ tìm kiếm cho các bài tiểu luận của Paul Graham mà chúng tôi sẽ sử dụng với Phím tắt Siri của Apple.
featured image - Xây dựng một sản phẩm hỗ trợ nhúng để tìm kiếm các bài luận của Paul Graham bằng Siri
Embedbase HackerNoon profile picture
0-item


Embedbase là một API nguồn mở để xây dựng, lưu trữ và truy xuất các phần nhúng.


Hôm nay chúng ta sẽ xây dựng một công cụ tìm kiếm cho các bài tiểu luận của Paul Graham mà chúng ta sẽ sử dụng với Apple Siri Shortcuts, ví dụ như đặt câu hỏi cho Siri về các bài tiểu luận này.


“Phần nhúng” là một khái niệm trong máy học cho phép bạn so sánh dữ liệu.

Hôm nay chúng ta sẽ không đi sâu vào chủ đề kỹ thuật nhúng.


Một cách để nghĩ về "sự nhúng" giống như đặt những thứ tương tự vào một cái túi. Vì vậy, nếu bạn có một túi đồ chơi và bạn muốn tìm một món đồ chơi nào đó, bạn nhìn vào trong túi và xem những đồ chơi khác ở gần nó để tìm ra món đồ chơi bạn muốn. Một máy tính có thể làm điều tương tự với các từ, đặt các từ tương tự lại với nhau trong một cái túi, sau đó tìm từ mà nó muốn dựa trên các từ khác ở gần nó.


https://towardsdatascience.com/creating-word-embeddings-coding-the-word2vec-algorithm-in-python-using-deep-learning-b337d0ba17a8


Khi bạn muốn sử dụng các phần nhúng trong phần mềm sản xuất của mình, bạn cần có khả năng lưu trữ và truy cập chúng một cách dễ dàng.


Có nhiều cơ sở dữ liệu vectơ và mô hình NLP để lưu trữ và tính toán các lần nhúng. Ngoài ra còn có một số thủ thuật bổ sung để xử lý việc nhúng.


Ví dụ: việc tính toán lại có thể trở nên tốn kém và không hiệu quả khi không cần thiết, ví dụ: nếu ghi chú chứa “con chó” và sau đó là “con chó”, bạn không nhất thiết muốn tính toán lại vì thông tin đã thay đổi có thể không hữu ích.


Ngoài ra, các cơ sở dữ liệu vectơ này đòi hỏi một đường cong học tập dốc và nhu cầu hiểu về máy học.


Embedbase cho phép bạn đồng bộ hóa và tìm kiếm dữ liệu theo ngữ nghĩa mà không cần biết gì về máy học, cơ sở dữ liệu vectơ và tối ưu hóa các phép tính trong một vài dòng mã.

Tìm kiếm các bài tiểu luận của Paul Graham với Siri


Theo thứ tự, chúng tôi sẽ:


  1. Triển khai Embedbase cục bộ hoặc trên Google Cloud Run
  2. Xây dựng trình thu thập thông tin cho các bài tiểu luận của Paul Graham bằng cách sử dụng Crawlee để nhập dữ liệu vào Embedbase
  3. Xây dựng Lối tắt Apple Siri cho phép bạn tìm kiếm các bài tiểu luận của Paul Graham thông qua Embedbase bằng giọng nói và ngôn ngữ tự nhiên

Xây dựng thời gian!

ngăn xếp công nghệ


Nhân bản repo


 git clone https://github.com/another-ai/embedbase cd embedbase


Thiết lập hình nón

Truy cập trang web Pinecone , đăng nhập và tạo chỉ mục:

Tạo chỉ mục Pinecone



Chúng tôi sẽ đặt tên cho nó là “paul” và sử dụng thứ nguyên “1536” ( điều quan trọng là phải hiểu đúng con số này , về cơ bản, đó là “kích thước” của cấu trúc dữ liệu OpenAI “nhúng”), các cài đặt khác ít quan trọng hơn.


Cấu hình chỉ mục Pinecone


Bạn cần lấy khóa API Pinecone để cho phép Embedbase giao tiếp với Pinecone:


Nhận khóa API Pinecone



Định cấu hình OpenAI


Bây giờ, bạn cần lấy cấu hình OpenAI của mình tại https://platform.openai.com/account/api-keys (tạo tài khoản nếu cần).


Nhấn “Tạo khóa mới”:

Tạo khóa OpenAI


Ngoài ra, hãy lấy ID tổ chức của bạn tại đây:

Nhận ID tổ chức OpenAI


Tạo cấu hình Embedbase của bạn


Bây giờ hãy viết và điền các giá trị vào tệp “config.yaml” ( trong thư mục embedbase ):

 # embedbase/config.yaml # https://app.pinecone.io/ pinecone_index: "my index name" # replace this with your environment pinecone_environment: "us-east1-gcp" pinecone_api_key: "" # https://platform.openai.com/account/api-keys openai_api_key: "sk-xxxxxxx" # https://platform.openai.com/account/org-settings openai_organization: "org-xxxxx"


Chạy Embedbase


🎉 Bạn có thể chạy Embedbase ngay bây giờ!

Khởi động Docker, nếu bạn không có nó, vui lòng cài đặt nó bằng cách làm theo hướng dẫn trên trang web chính thức .

Khởi động Docker trên Mac

Bây giờ hãy chạy Embedbase:

 docker-compose up

(Tùy chọn) Triển khai đám mây

Nếu có động lực, bạn có thể triển khai Embedbase lên Google Cloud Run. Đảm bảo có dự án Google Cloud và đã cài đặt dòng lệnh “gcloud” thông qua tài liệu chính thức .


 # login to gcloud gcloud auth login # Get your Google Cloud project ID PROJECT_ID=$(gcloud config get-value project) # Enable container registry gcloud services enable containerregistry.googleapis.com # Enable Cloud Run gcloud services enable run.googleapis.com # Enable Secret Manager gcloud services enable secretmanager.googleapis.com # create a secret for the config gcloud secrets create EMBEDBASE_PAUL_GRAHAM --replication-policy=automatic # add a secret version based on your yaml config gcloud secrets versions add EMBEDBASE_PAUL_GRAHAM --data-file=config.yaml # Set your Docker image URL IMAGE_URL="gcr.io/${PROJECT_ID}/embedbase-paul-graham:0.0.1" # Build the Docker image for cloud deployment docker buildx build . --platform linux/amd64 -t ${IMAGE_URL} -f ./search/Dockerfile # Push the docker image to Google Cloud Docker registries # Make sure to be authenticated https://cloud.google.com/container-registry/docs/advanced-authentication docker push ${IMAGE_URL} # Deploy Embedbase to Google Cloud Run gcloud run deploy embedbase-paul-graham \ --image ${IMAGE_URL} \ --region us-central1 \ --allow-unauthenticated \ --set-secrets /secrets/config.yaml=EMBEDBASE_PAUL_GRAHAM:1


Xây dựng trình thu thập thông tin của các bài tiểu luận của Paul Graham

Trình thu thập dữ liệu web cho phép bạn tải xuống tất cả các trang của một trang web, đây là thuật toán cơ bản được Google sử dụng.


Sao chép kho lưu trữ và cài đặt các phụ thuộc:

 git clone https://github.com/another-ai/embedbase-paul-graham cd embedbase-paul-graham npm i


Hãy xem mã, nếu bạn bị choáng ngợp với tất cả các tệp cần thiết cho một dự án Bản mô tả, đừng lo lắng và bỏ qua chúng.


 // src/main.ts // Here we want to start from the page that list all Paul's essays const startUrls = ['http://www.paulgraham.com/articles.html']; const crawler = new PlaywrightCrawler({ requestHandler: router, }); await crawler.run(startUrls);


Bạn có thể thấy rằng trình thu thập thông tin được khởi tạo với “các tuyến đường”, những tuyến đường bí ẩn này là gì?


 // src/routes.ts router.addDefaultHandler(async ({ enqueueLinks, log }) => { log.info(`enqueueing new URLs`); await enqueueLinks({ // Here we tell the crawler to only accept pages that are under // "http://www.paulgraham.com/" domain name, // for example if we find a link on Paul's website to an url // like "https://ycombinator.com/startups" if it will ignored globs: ['http://www.paulgraham.com/**'], label: 'detail', }); }); router.addHandler('detail', async ({ request, page, log }) => { // Here we will do some logic on all pages under // "http://www.paulgraham.com/" domain name // for example, collecting the page title const title = await page.title(); // getting the essays' content const blogPost = await page.locator('body > table > tbody > tr > td:nth-child(3)').textContent(); if (!blogPost) { log.info(`no blog post found for ${title}, skipping`); return; } log.info(`${title}`, { url: request.loadedUrl }); // Remember that usually AI models and databases have some limits in input size // and thus we will split essays in chunks of paragraphs // split blog post in chunks on the \n\n const chunks = blogPost.split(/\n\n/); if (!chunks) { log.info(`no blog post found for ${title}, skipping`); return; } // If you are not familiar with Promises, don't worry for now // it's just a mean to do things faster await Promise.all(chunks.flatMap((chunk) => { const d = { url: request.loadedUrl, title: title, blogPost: chunk, }; // Here we just want to send the page interesting // content into Embedbase (don't mind Dataset, it's optional local storage) return Promise.all([Dataset.pushData(d), add(title, chunk)]); })); });


thêm() là gì?


 const add = (title: string, blogPost: string) => { // note "paul" in the URL, it can be anything you want // that will help you segment your data in // isolated parts const url = `${baseUrl}/v1/paul`; const data = { documents: [{ data: blogPost, }], }; // send the data to Embedbase using "node-fetch" library fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(data), }).then((response) => { return response.json(); }).then((data) => { console.log('Success:', data); }).catch((error) => { console.error('Error:', error); }); };


Bây giờ bạn có thể chạy trình thu thập thông tin, sẽ mất chưa đầy một phút để tải xuống và nhập mọi thứ trong Embedbase.

Tín dụng OpenAI sẽ được sử dụng với giá dưới <$1

chi phí OpenAI


 npm start


Nếu bạn đã triển khai Embedbase lên đám mây, vui lòng sử dụng


 # you can get your cloud run URL like this: CLOUD_RUN_URL=$(gcloud run services list --platform managed --region us-central1 --format="value(status.url)" --filter="metadata.name=embedbase-paul-graham") npm run playground ${CLOUD_RUN_URL}


Bạn sẽ thấy một số hoạt động trong thiết bị đầu cuối của mình (cả bộ chứa Embedbase Docker và quy trình nút) mà không có lỗi ( vui lòng liên hệ để được trợ giúp nếu không ).


(Tùy chọn) Tìm kiếm thông qua Embedbase trong thiết bị đầu cuối của bạn

Trong kho lưu trữ ví dụ, bạn có thể nhận thấy “ src/playground.ts ” là một tập lệnh đơn giản cho phép bạn tương tác với Embedbase trong thiết bị đầu cuối của mình, mã này rất đơn giản:

 // src/playground.ts const search = async (query: string) => { const url = `${baseUrl}/v1/paul/search`; const data = { query, }; return fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(data), }).then((response) => { return response.json(); }).then((data) => { console.log('Success:', data); }).catch((error) => { console.error('Error:', error); }); }; const p = prompt(); // this is an interactive terminal that let you search in paul graham // blog posts using semantic search // It is an infinite loop that will ask you for a query // and show you the results const start = async () => { console.log('Welcome to the Embedbase playground!'); console.log('This playground is a simple example of how to use Embedbase'); console.log('Currently using Embedbase server at', baseUrl); console.log('This is an interactive terminal that let you search in paul graham blog posts using semantic search'); console.log('Try to run some queries such as "how to get rich"'); console.log('or "how to pitch investor"'); while (true) { const query = p('Enter a semantic query:'); if (!query) { console.log('Bye!'); return; } await search(query); } }; start();


Bạn có thể chạy nó như thế này nếu bạn đang chạy Embedbase cục bộ:

 npm run playground


Hoặc, như thế này, nếu bạn đã triển khai Embedbase lên đám mây:

 npm run playground ${CLOUD_RUN_URL}


Kết quả:

(Tùy chọn) Xây dựng phím tắt Apple Siri

Thời gian vui vẻ! Hãy xây dựng Phím tắt Apple Siri để có thể đặt câu hỏi cho Siri về các bài tiểu luận của Paul Graham 😜


Trước tiên, hãy bắt đầu Phím tắt của Apple:


Bắt đầu phím tắt của Apple


Tạo lối tắt mới:

Tạo một phím tắt Apple Siri mới


Chúng tôi sẽ đặt tên cho phím tắt này là “Tìm kiếm Paul” (lưu ý rằng đó sẽ là cách bạn yêu cầu Siri bắt đầu Phím tắt, vì vậy hãy chọn một cái gì đó dễ dàng)


Nói một cách đơn giản bằng tiếng Anh, lối tắt này hỏi người dùng một truy vấn và gọi Embedbase cùng với nó, đồng thời yêu cầu Siri phát âm to các bài tiểu luận mà nó tìm thấy.


Phần đầu tiên của phím tắt


  1. “Văn bản đọc chính tả” cho phép bạn đặt truy vấn tìm kiếm bằng giọng nói (chọn ngôn ngữ tiếng Anh)
  2. Chúng tôi lưu trữ điểm cuối của Embedbase trong “Văn bản” để rõ ràng, thay đổi theo thiết lập của bạn ("https://localhost:8000/v1/search” nếu bạn chạy Embedbase cục bộ)
  3. Chúng tôi đặt lại điểm cuối trong một biến cho rõ ràng
  4. Tương tự đối với văn bản chính tả
  5. Bây giờ, "Lấy nội dung của" sẽ thực hiện một yêu cầu HTTP POST tới Embedbase bằng cách sử dụng chúng tôi đã xác định trước đó trong quá trình thu thập dữ liệu "vault_id" là "paul" và sử dụng biến "query" cho thuộc tính "query"


Phần cuối cùng của phím tắt


  1. “Get for in” sẽ trích xuất thuộc tính “tương tự” từ phản hồi Embedbase

  2. “Lặp lại với từng mục trong” ý chí, đối với mỗi điểm tương đồng:

    1. Lấy thuộc tính “document_path”
    2. Thêm vào một biến “đường dẫn” (một danh sách)
  3. “Kết hợp” sẽ “nối” các kết quả với một dòng mới

  4. (Tùy chọn, sẽ hướng dẫn cách thực hiện bên dưới) Đây là một thủ thuật thú vị mà bạn có thể thêm vào phím tắt để tăng độ hấp dẫn, sử dụng OpenAI GPT3 để chuyển đổi một chút văn bản kết quả để nghe hay hơn khi Siri phát âm nó

  5. Chúng tôi tập hợp kết quả thành một “Văn bản” để thân thiện với giọng nói

  6. Yêu cầu Siri nói nó


Bạn có thể chuyển đổi kết quả thành văn bản đẹp hơn bằng phím tắt GPT3 chức năng này


(điền giá trị “Ủy quyền” với “Người mang [Khóa OPENAI CỦA BẠN]”)


Phím tắt GPT3 chức năng để chuyển đổi mọi thứ



Với Embedbase, bạn có thể nhanh chóng xây dựng một sản phẩm hỗ trợ ngữ nghĩa mà không phải đau đầu xây dựng, lưu trữ và truy xuất các phần nhúng trong khi vẫn giữ được chi phí thấp.

Phần kết luận

Vui lòng dùng thử Embedbase, bỏ một sự cố và nếu bạn không phiền thì hãy hỗ trợ nỗ lực này và gắn dấu sao cho kho lưu trữ ❤️