Kể từ khi ChatGPT ra mắt vào tháng 11/2022, các Chatbot dùng LLM đã xuất hiện nổi bật trong nhiều trường hợp sử dụng khác nhau.
Ý tưởng về chatbot không mới. Chúng ta đều từng thấy những chatbot vô dụng ở khắp nơi, phải cấu hình quá sâu đến mức gần như là kịch bản với các quy tắc if-else. Việc bảo trì trở thành ác mộng và chúng không giúp người dùng cuối; thực tế còn gây bực bội cho họ.
Nhưng đến năm 2024, Chatbot đã trở lại, nhờ các Mô hình ngôn ngữ lớn (LLM).
Trong bài viết này, bạn sẽ học:
Kỹ thuật Retrieval Augmented Generation là gì
Mô hình ngôn ngữ lớn là gì
Cách sử dụng OpenAI GPT và các API khác
Vector Database là gì và vì sao cần đến nó?
Xây dựng Chatbot của riêng bạn bằng Pinecone và OpenAI trong Python
Các Mô hình ngôn ngữ lớn (LLM) như GPT-4 là những thuật toán máy học tiên tiến tận dụng kỹ thuật học sâu, đặc biệt là kiến trúc transformer, để hiểu và tạo sinh ngôn ngữ tự nhiên.
Chúng được huấn luyện trên các bộ dữ liệu khổng lồ chứa hàng nghìn tỷ từ lấy từ nhiều loại văn bản trên internet như sách, bài báo, trang web và kho mã. Quá trình huấn luyện rộng lớn này cho phép chúng thực hiện nhiều tác vụ phức tạp liên quan đến xử lý ngôn ngữ.
Một trong những điểm nổi bật của LLM là khả năng tạo văn bản về hầu như mọi chủ đề. Năng lực này mở rộng qua nhiều phong cách và định dạng, từ sáng tác cho đến tài liệu kỹ thuật.
LLM thành thạo các tác vụ như tóm tắt, nơi chúng có thể cô đọng tài liệu dài thành bản tóm tắt ngắn gọn, và hội thoại AI, cho phép tương tác tự nhiên, trôi chảy với người dùng. Chúng cũng giỏi dịch thuật giữa các ngôn ngữ, thậm chí nắm bắt được sắc thái như tiếng lóng và phương ngữ.
Tuy nhiên, LLM không phải không có thách thức. Một vấn đề đáng kể là LLM có thể "ảo giác" hoặc tạo ra thông tin nghe có vẻ hợp lý nhưng sai hoặc vô nghĩa, đặc biệt khi xử lý các câu hỏi ngoài phạm vi dữ liệu huấn luyện hoặc lời nhắc mơ hồ.
Một vấn đề quan trọng khác là nguy cơ thiên kiến trong đầu ra của LLM, bắt nguồn từ thiên kiến hiện diện trong dữ liệu huấn luyện hoặc được đưa vào trong quá trình phát triển mô hình.
LLM đại diện cho bước tiến lớn trong AI, mang lại tiềm năng đổi mới và hiệu quả to lớn trong nhiều lĩnh vực, nhưng cũng đòi hỏi quản trị cẩn trọng để giảm thiểu rủi ro như thiên kiến và thông tin sai lệch
Dù mạnh mẽ, LLM vẫn có những giới hạn nhất định. Chúng có thể cung cấp thông tin lỗi thời, chung chung, hoặc thậm chí sai sự thật nếu truy vấn vượt quá phạm vi dữ liệu huấn luyện.
Chúng cũng có thể tạo thông tin sai sự thật hoặc vô nghĩa nhưng được mô hình trình bày như đúng đắn, hiện tượng này được biết đến rộng rãi là Ảo giác.
RAG nhằm giảm thiểu các vấn đề này bằng cách hướng LLM truy xuất thông tin liên quan từ các nguồn được xác định trước. Cách tiếp cận này tăng cường niềm tin của người dùng vì đầu ra chính xác hơn và có thể quy chiếu tới nguồn tin cậy.
Nó cũng mang lại cho nhà phát triển nhiều quyền kiểm soát hơn đối với phản hồi do LLM tạo ra, cải thiện chất lượng và tính phù hợp tổng thể của hệ thống.
Quy trình RAG
Bạn có thể tìm hiểu thêm về retrieval augmented generation trong hướng dẫn riêng của chúng tôi. Tuy nhiên, dưới đây là các bước chính của quy trình.
Tạo dữ liệu bên ngoài: RAG bắt đầu bằng việc chuẩn bị các nguồn dữ liệu bên ngoài nằm ngoài bộ dữ liệu huấn luyện gốc của LLM. Dữ liệu này, có thể gồm nghiên cứu cập nhật, tin tức hoặc thống kê, được chuyển đổi sang định dạng (embeddings) mà LLM có thể hiểu và sử dụng.
Lưu trữ embeddings: Sau khi dữ liệu văn bản thô được chuyển thành embeddings bằng một mô hình, chúng được lưu trong một loại cơ sở dữ liệu gọi là Vector Database. Nó được thiết kế để lưu trữ và truy xuất dữ liệu vector hiệu quả và rất phù hợp cho ứng dụng RAG. Pinecone là một trong những vector database phổ biến nhất.
Truy xuất thông tin liên quan: Sau đó mô hình thực hiện tìm kiếm ngữ nghĩa bằng cách truy vấn vector database. Khi người dùng nhập truy vấn, nó được chuyển thành biểu diễn vector và so khớp với dữ liệu bên ngoài đã được vector hoá. Quá trình này đảm bảo truy xuất được thông tin phù hợp và cập nhật nhất.
Tăng cường lời nhắc cho LLM: Dữ liệu truy xuất, cùng với truy vấn gốc của người dùng, được dùng để tăng cường prompt gửi tới LLM. Prompt giàu ngữ cảnh này giúp mô hình tạo ra phản hồi chính xác và phù hợp hơn.
Cập nhật liên tục dữ liệu bên ngoài: Để duy trì tính liên quan và chính xác, các nguồn dữ liệu bên ngoài được cập nhật thường xuyên, bảo đảm LLM có quyền truy cập thông tin mới nhất.
Vector database là loại cơ sở dữ liệu chuyên biệt để xử lý các vector có số chiều cao, vốn là biểu diễn toán học của thuộc tính hay đặc trưng dữ liệu. Tuỳ độ phức tạp và mức chi tiết của dữ liệu, các vector có thể từ vài chục đến hàng nghìn chiều.
Loại cơ sở dữ liệu này đặc biệt giỏi trong việc thực hiện tìm kiếm và truy xuất theo độ tương đồng nhanh và chính xác dựa trên khoảng cách hoặc độ tương tự giữa các vector, cho phép cách truy vấn dữ liệu theo ngữ nghĩa hay ngữ cảnh thay vì dựa vào khớp chính xác hay tiêu chí định sẵn truyền thống.
Trong thực tế, vector database có thể được dùng cho nhiều mục đích. Ví dụ, tìm các hình ảnh giống một hình ảnh cho trước dựa trên nội dung và phong cách thị giác, tìm các tài liệu tương tự một tài liệu cụ thể dựa trên chủ đề và cảm xúc, hoặc xác định các sản phẩm tương tự một sản phẩm nào đó dựa trên đặc trưng và đánh giá.
Quy trình truy vấn trong vector database sử dụng một vector truy vấn đại diện cho thông tin hay tiêu chí mong muốn và áp dụng thước đo tương tự để xác định mức độ gần nhau của các vector trong không gian vector. Kết quả là danh sách xếp hạng các vector có điểm tương tự cao với vector truy vấn, cho phép truy cập dữ liệu thô tương ứng với mỗi vector.
Vector database được vận hành bởi nhiều thuật toán như chỉ mục k-láng giềng gần nhất (k-NN) và được xây dựng với các phương pháp như Hierarchical Navigable Small World (HNSW) và Inverted File Index (IVF).
Vector database là thành phần thiết yếu của các ứng dụng retrieval augmented generation (RAG). Chúng cung cấp khả năng tìm kiếm tương tự hiệu quả, mở rộng nội dung, đa dạng hoá và truy xuất dữ liệu đa phương thức động. Năng lực này rất quan trọng trong AI tạo sinh, nơi việc truy cập các bộ dữ liệu quy mô lớn, đa dạng là cốt yếu để giảm thiên kiến và ảo giác trong các mô hình AI.
Pinecone là một vector database phổ biến nổi bật nhờ hiệu quả và dễ sử dụng, đặc biệt trong các kịch bản dữ liệu quy mô lớn. Nó được thiết kế cho nhà phát triển và nhà khoa học dữ liệu muốn triển khai khả năng tìm kiếm vector trong nhiều ứng dụng.
Pinecone sử dụng các kỹ thuật lập chỉ mục tiên tiến như product quantization và locality-sensitive hashing, cho phép tìm kiếm tương tự hiệu quả và chính xác trong không gian vector nhiều chiều. Điều này khiến nó đặc biệt hữu ích cho ứng dụng RAG. Bạn có thể tìm hiểu thêm về làm chủ vector database với Pinecone trong hướng dẫn riêng của chúng tôi.
Trong hướng dẫn này, chúng ta sẽ dùng Pinecone làm vector database.
OpenAI API
Nền tảng API của OpenAI cung cấp quyền truy cập vào tất cả các mô hình do OpenAI huấn luyện và công bố. Bao gồm GPT, DALL-E, Whisper và các mô hình khác.
API được truy cập thông qua các yêu cầu HTTP, nên bạn có thể tích hợp bằng bất kỳ ngôn ngữ lập trình nào hỗ trợ gửi yêu cầu HTTP. Tuy nhiên, với Python, có một thư viện tên openai mà bạn có thể cài bằng pip install openai để làm việc với các API này dễ dàng hơn nữa.
import os
os.environ["OPENAI_API_KEY"]=" "from openai import OpenAI
client = OpenAI()
completion = client.chat.completions.create(
model="gpt-4",
messages=[{"role":"system","content":"You are expert in Machine Learning."},{"role":"user","content":"Explain how does random forest works?."}])print(completion.choices[0].message)Được hỗ trợ bởi
LangChain
LangChain là một framework để phát triển các ứng dụng vận hành bởi mô hình ngôn ngữ. Nó cung cấp mức trừu tượng nhất định giúp việc phát triển nguyên mẫu trở nên dễ dàng và nhanh chóng, cũng như đẩy nhanh quá trình từ nguyên mẫu đến sản xuất. Mức độ phát triển và phổ biến của framework này thể hiện qua số lượng sao trên trang Github của họ.
Đây là một framework tuyệt vời. Tuy nhiên, lưu ý là hiện vẫn chưa ổn định. API thay đổi liên tục và có thể đến lúc bạn đọc phần mã ở mục tiếp theo thì nó không còn chạy được nữa. Điều này là bình thường vì thư viện vẫn ở trạng thái pre-release. Tại thời điểm viết bài, phiên bản mới nhất của LangChain là 0.1.4.
Ví dụ End-to-End bằng Python: Hướng dẫn từng bước xây dựng ứng dụng Chatbot LLM dùng OpenAI GPT-4 API và Pinecone Vector Store
Để triển khai back-end RAG, chúng ta cần embeddings của dữ liệu bên ngoài. Nếu bắt đầu từ dữ liệu thô, chúng ta sẽ phải nhúng (embed) dữ liệu bằng OpenAI embedding API hoặc các embeddings nguồn mở khác.
Việc nhúng dữ liệu thô khá đơn giản. Tuy nhiên, nếu bạn dùng API của OpenAI, bạn sẽ bị tính phí theo token.
Trong phạm vi hướng dẫn này, tôi đã trích lại phần lớn mã ở mục này từ hướng dẫn chính thức của Pinecone về LangChain. Tài liệu của Pinecone được viết cực kỳ tốt và luôn cập nhật.
Bạn phải sao chép khoá ngay khi tạo vì sau đó sẽ không có tuỳ chọn xem hoặc sao chép lại khoá.
Với Pinecone, đăng nhập vào tài khoản và nhấp vào API Keys. Bạn có thể nhấp nút `Click API Key` ở góc phải.
Không như OpenAI, với Pinecone bạn không nhất thiết phải sao chép API key ngay khi tạo vì có biểu tượng sao chép dưới cột Actions mà bạn có thể dùng bất cứ lúc nào.
Khi đã có API key của OpenAI và Pinecone, hãy gán chúng vào biến trong Notebook. Hoặc, bạn cũng có thể dùng mô-đun `os` trong Python để đặt các khoá này thành biến môi trường. Khi đó bạn cần chỉnh mã bên dưới cho phù hợp, nếu chọn cách này.
OPENAI_API_KEY ='...'
PINECONE_API_KEY ='...'Được hỗ trợ bởi
2. Cài đặt các thư viện Python
Để triển khai hướng dẫn này, bạn cần cài các thư viện sau bằng pip.
Thư viện pinecone-datasets cung cấp một vài bộ dữ liệu mẫu đã được nhúng sẵn bằng mô hình embedding-ada-002 của OpenAI. Chúng ta sẽ dùng một bộ mẫu tên wikipedia-simple-text-embedding-ada-002-100K.
Đúng như tên gọi, có 100.000 tài liệu. Tuy nhiên, trong hướng dẫn này chúng ta chỉ lấy mẫu 30.000 bản ghi đầu tiên. Dù không ảnh hưởng chi phí vì embeddings đã có cho toàn bộ 100.000 tài liệu, việc lấy mẫu chỉ nhằm tăng tốc quá trình.
import pinecone_datasets
dataset = pinecone_datasets.load_dataset('wikipedia-simple-text-embedding-ada-002-100K')Được hỗ trợ bởi
# drop metadata column and renamed blob to metadata
dataset.documents.drop(['metadata'], axis=1, inplace=True)
dataset.documents.rename(columns={'blob':'metadata'}, inplace=True)# sample 30k documents
dataset.documents.drop(dataset.documents.index[30_000:], inplace=True)Được hỗ trợ bởi
4. Thiết lập chỉ mục Pinecone
from pinecone import Pinecone, ServerlessSpec
# configure client
pc = Pinecone(api_key=PINECONE_API_KEY)# configure serverless spec
spec = ServerlessSpec(cloud='aws', region='us-west-2')# check for and delete index if already exists
index_name ='langchain-retrieval-augmentation-fast'if index_name in pc.list_indexes().names():
pc.delete_index(index_name)# we create a new index
pc.create_index(
index_name,
dimension=1536,# dimensionality of text-embedding-ada-002
metric='dotproduct',
spec=spec
)Được hỗ trợ bởi
Kết nối đến chỉ mục và kiểm tra thống kê của chỉ mục:
index = pc.Index(index_name)
index.describe_index_stats()Được hỗ trợ bởi
Đầu ra sẽ như sau:
{'dimension':1536,'index_fullness':0.0,'namespaces':{},'total_vector_count':0}Được hỗ trợ bởi
1536 là kích thước của embeddings từ mô hình ada-002. Bạn có thể thấy số lượng vector là 0 vì chúng ta chưa nạp bất kỳ dữ liệu (vector) nào.
5. Chèn dữ liệu
Chèn dữ liệu vào chỉ mục langchain-retrieval-augmentation-fast khá đơn giản:
for batch in dataset.iter_documents(batch_size=100):
index.upsert(batch)Được hỗ trợ bởi
Lệnh này sẽ mất vài phút để hoàn thành.
Sau khi chèn dữ liệu, bạn cũng có thể thấy chúng trên giao diện Pinecone:
6. LangChain
Giờ đây chúng ta đã tạo chỉ mục và chèn dữ liệu vào chỉ mục bằng Pinecone API, ta sẽ chuyển sang dùng LangChain. Bước kế tiếp là khởi tạo một vector store của LangChain bằng LangChain và sử dụng chính chỉ mục đã tạo.
from langchain.embeddings.openai import OpenAIEmbeddings
model_name ='text-embedding-ada-002'
embed = OpenAIEmbeddings(model=model_name, openai_api_key=OPENAI_API_KEY)Được hỗ trợ bởi
Khởi tạo vector store:
from langchain.vectorstores import Pinecone
vectorstore = Pinecone(index, embed.embed_query,"text")Được hỗ trợ bởi
7. Truy vấn Vector Store
Giờ bạn có thể dùng đối tượng vectorstore để truy vấn dữ liệu và xem Top N kết quả:
query ="What is Schizophrenia?"
vectorstore.similarity_search(query, k=3)Được hỗ trợ bởi
Đầu ra là một đối tượng tài liệu từ đó bạn có thể dễ dàng trích xuất chuỗi, nhưng về bản chất nó hiển thị 3 tài liệu khớp nhất dựa trên thước đo chúng ta chọn ở Bước 4, trong trường hợp này là dotmatrix.
Đây là bước cuối cùng của ứng dụng. Chúng ta muốn bọc LLM xung quanh. Để làm vậy, bạn sẽ nhập các lớp ChatOpenAI và RetrievalQA từ LangChain.
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
# completion llm
llm = ChatOpenAI(
openai_api_key=OPENAI_API_KEY,
model_name='gpt-4',
temperature=0.0)
qa = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever())
qa.run(query)Được hỗ trợ bởi
Đầu ra của qa.run(query) là phản hồi từ mô hình ngôn ngữ.
Schizophrenia is a mental illness where people may see, hear or believe things that are not real. It often first appears in teenage years and is a chronic condition....Được hỗ trợ bởi
Câu trả lời này đến từ một trong các tài liệu trong `dataset`. Nếu bạn cũng muốn lấy nguồn (thường cần trong ứng dụng RAG), bạn sẽ cần thay đổi một chút ở đoạn mã trên.
from langchain.chains import RetrievalQAWithSourcesChain
qa_with_sources = RetrievalQAWithSourcesChain.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever())
qa_with_sources(query)Được hỗ trợ bởi
Đầu ra:
{'question':'What is Schizophrenia?','answer':'Schizophrenia is a mental illness where people may see, hear or believe things that are not real. It is a relatively common condition ...','sources':'https://simple.wikipedia.org/wiki/Schizophrenia'}Được hỗ trợ bởi
Lưu ý lần này đầu ra là một dictionary trong đó bạn có thể tìm thấy `source`.
Kết luận
Trong bài viết này, chúng ta đã khám phá ứng dụng phổ biến nhất của LLM, kỹ thuật Retrieval Augmented Generation (RAG), đi sâu vào cách nó nâng cao độ tin cậy và mức độ liên quan của phản hồi chatbot dựa trên các Mô hình ngôn ngữ lớn như GPT-4.
Sự tiến hoá của chatbot từ hệ thống đơn giản dựa trên quy tắc sang tác nhân hội thoại tinh vi vận hành bằng AI đánh dấu một bước nhảy vọt về công nghệ. LLM mang đến cho chatbot mức độ linh hoạt và thông minh mới, có khả năng đối thoại tự nhiên và nhận biết ngữ cảnh tốt hơn.
Chúng ta cũng đã tìm hiểu vai trò của vector database, tập trung vào Pinecone, trong việc lưu trữ và truy xuất các vector dữ liệu nhiều chiều. Đây là mấu chốt để triển khai RAG.
Việc hiện thực hoá các khái niệm này được minh hoạ qua các ví dụ mã, tận dụng API của OpenAI và Pinecone cùng framework LangChain trong Python. Những công cụ này đơn giản hoá quy trình phát triển, giúp nhà phát triển nhanh chóng và hiệu quả tạo ra chatbot vận hành bằng AI phù hợp với nhiều ứng dụng.
Kể từ khi ChatGPT ra mắt vào tháng 11/2022, các Chatbot dùng LLM đã xuất hiện nổi bật trong nhiều trường hợp sử dụng khác nhau.
Ý tưởng về chatbot không mới. Chúng ta đều từng thấy những chatbot vô dụng ở khắp nơi, phải cấu hình quá sâu đến mức gần như là kịch bản với các quy tắc if-else. Việc bảo trì trở thành ác mộng và chúng không giúp người dùng cuối; thực tế còn gây bực bội cho họ.
Nhưng đến năm 2024, Chatbot đã trở lại, nhờ các Mô hình ngôn ngữ lớn (LLM).
Trong bài viết này, bạn sẽ học:
Bạn cũng có thể xem khoá học Vector Databases for Embeddings with Pinecone của chúng tôi, và phần code-along về Xây dựng Chatbots với OpenAI API và Pinecone để tìm hiểu thêm.
Mô hình ngôn ngữ lớn (LLM)
Nguồn ảnh
Các Mô hình ngôn ngữ lớn (LLM) như GPT-4 là những thuật toán máy học tiên tiến tận dụng kỹ thuật học sâu, đặc biệt là kiến trúc transformer, để hiểu và tạo sinh ngôn ngữ tự nhiên.
Chúng được huấn luyện trên các bộ dữ liệu khổng lồ chứa hàng nghìn tỷ từ lấy từ nhiều loại văn bản trên internet như sách, bài báo, trang web và kho mã. Quá trình huấn luyện rộng lớn này cho phép chúng thực hiện nhiều tác vụ phức tạp liên quan đến xử lý ngôn ngữ.
Một trong những điểm nổi bật của LLM là khả năng tạo văn bản về hầu như mọi chủ đề. Năng lực này mở rộng qua nhiều phong cách và định dạng, từ sáng tác cho đến tài liệu kỹ thuật.
LLM thành thạo các tác vụ như tóm tắt, nơi chúng có thể cô đọng tài liệu dài thành bản tóm tắt ngắn gọn, và hội thoại AI, cho phép tương tác tự nhiên, trôi chảy với người dùng. Chúng cũng giỏi dịch thuật giữa các ngôn ngữ, thậm chí nắm bắt được sắc thái như tiếng lóng và phương ngữ.
Tuy nhiên, LLM không phải không có thách thức. Một vấn đề đáng kể là LLM có thể "ảo giác" hoặc tạo ra thông tin nghe có vẻ hợp lý nhưng sai hoặc vô nghĩa, đặc biệt khi xử lý các câu hỏi ngoài phạm vi dữ liệu huấn luyện hoặc lời nhắc mơ hồ.
Một vấn đề quan trọng khác là nguy cơ thiên kiến trong đầu ra của LLM, bắt nguồn từ thiên kiến hiện diện trong dữ liệu huấn luyện hoặc được đưa vào trong quá trình phát triển mô hình.
LLM đại diện cho bước tiến lớn trong AI, mang lại tiềm năng đổi mới và hiệu quả to lớn trong nhiều lĩnh vực, nhưng cũng đòi hỏi quản trị cẩn trọng để giảm thiểu rủi ro như thiên kiến và thông tin sai lệch
Retrieval Augment Generation (RAG) là gì?
Nguồn ảnh
Dù mạnh mẽ, LLM vẫn có những giới hạn nhất định. Chúng có thể cung cấp thông tin lỗi thời, chung chung, hoặc thậm chí sai sự thật nếu truy vấn vượt quá phạm vi dữ liệu huấn luyện.
Chúng cũng có thể tạo thông tin sai sự thật hoặc vô nghĩa nhưng được mô hình trình bày như đúng đắn, hiện tượng này được biết đến rộng rãi là Ảo giác.
RAG nhằm giảm thiểu các vấn đề này bằng cách hướng LLM truy xuất thông tin liên quan từ các nguồn được xác định trước. Cách tiếp cận này tăng cường niềm tin của người dùng vì đầu ra chính xác hơn và có thể quy chiếu tới nguồn tin cậy.
Nó cũng mang lại cho nhà phát triển nhiều quyền kiểm soát hơn đối với phản hồi do LLM tạo ra, cải thiện chất lượng và tính phù hợp tổng thể của hệ thống.
Quy trình RAG
Bạn có thể tìm hiểu thêm về retrieval augmented generation trong hướng dẫn riêng của chúng tôi. Tuy nhiên, dưới đây là các bước chính của quy trình.
Vector Database
Nguồn ảnh
Vector database là loại cơ sở dữ liệu chuyên biệt để xử lý các vector có số chiều cao, vốn là biểu diễn toán học của thuộc tính hay đặc trưng dữ liệu. Tuỳ độ phức tạp và mức chi tiết của dữ liệu, các vector có thể từ vài chục đến hàng nghìn chiều.
Loại cơ sở dữ liệu này đặc biệt giỏi trong việc thực hiện tìm kiếm và truy xuất theo độ tương đồng nhanh và chính xác dựa trên khoảng cách hoặc độ tương tự giữa các vector, cho phép cách truy vấn dữ liệu theo ngữ nghĩa hay ngữ cảnh thay vì dựa vào khớp chính xác hay tiêu chí định sẵn truyền thống.
Trong thực tế, vector database có thể được dùng cho nhiều mục đích. Ví dụ, tìm các hình ảnh giống một hình ảnh cho trước dựa trên nội dung và phong cách thị giác, tìm các tài liệu tương tự một tài liệu cụ thể dựa trên chủ đề và cảm xúc, hoặc xác định các sản phẩm tương tự một sản phẩm nào đó dựa trên đặc trưng và đánh giá.
Quy trình truy vấn trong vector database sử dụng một vector truy vấn đại diện cho thông tin hay tiêu chí mong muốn và áp dụng thước đo tương tự để xác định mức độ gần nhau của các vector trong không gian vector. Kết quả là danh sách xếp hạng các vector có điểm tương tự cao với vector truy vấn, cho phép truy cập dữ liệu thô tương ứng với mỗi vector.
Vector database được vận hành bởi nhiều thuật toán như chỉ mục k-láng giềng gần nhất (k-NN) và được xây dựng với các phương pháp như Hierarchical Navigable Small World (HNSW) và Inverted File Index (IVF).
Vector database là thành phần thiết yếu của các ứng dụng retrieval augmented generation (RAG). Chúng cung cấp khả năng tìm kiếm tương tự hiệu quả, mở rộng nội dung, đa dạng hoá và truy xuất dữ liệu đa phương thức động. Năng lực này rất quan trọng trong AI tạo sinh, nơi việc truy cập các bộ dữ liệu quy mô lớn, đa dạng là cốt yếu để giảm thiên kiến và ảo giác trong các mô hình AI.
Pinecone là một vector database phổ biến nổi bật nhờ hiệu quả và dễ sử dụng, đặc biệt trong các kịch bản dữ liệu quy mô lớn. Nó được thiết kế cho nhà phát triển và nhà khoa học dữ liệu muốn triển khai khả năng tìm kiếm vector trong nhiều ứng dụng.
Pinecone sử dụng các kỹ thuật lập chỉ mục tiên tiến như product quantization và locality-sensitive hashing, cho phép tìm kiếm tương tự hiệu quả và chính xác trong không gian vector nhiều chiều. Điều này khiến nó đặc biệt hữu ích cho ứng dụng RAG. Bạn có thể tìm hiểu thêm về làm chủ vector database với Pinecone trong hướng dẫn riêng của chúng tôi.
Trong hướng dẫn này, chúng ta sẽ dùng Pinecone làm vector database.
OpenAI API
Nền tảng API của OpenAI cung cấp quyền truy cập vào tất cả các mô hình do OpenAI huấn luyện và công bố. Bao gồm GPT, DALL-E, Whisper và các mô hình khác.
API được truy cập thông qua các yêu cầu HTTP, nên bạn có thể tích hợp bằng bất kỳ ngôn ngữ lập trình nào hỗ trợ gửi yêu cầu HTTP. Tuy nhiên, với Python, có một thư viện tên openai mà bạn có thể cài bằng
pip install openaiđể làm việc với các API này dễ dàng hơn nữa.Làm việc với OpenAI API trong Python bằng thư viện
openaichỉ cần vài dòng mã.Ví dụ Python:
LangChain
LangChain là một framework để phát triển các ứng dụng vận hành bởi mô hình ngôn ngữ. Nó cung cấp mức trừu tượng nhất định giúp việc phát triển nguyên mẫu trở nên dễ dàng và nhanh chóng, cũng như đẩy nhanh quá trình từ nguyên mẫu đến sản xuất. Mức độ phát triển và phổ biến của framework này thể hiện qua số lượng sao trên trang Github của họ.
Đây là một framework tuyệt vời. Tuy nhiên, lưu ý là hiện vẫn chưa ổn định. API thay đổi liên tục và có thể đến lúc bạn đọc phần mã ở mục tiếp theo thì nó không còn chạy được nữa. Điều này là bình thường vì thư viện vẫn ở trạng thái
pre-release. Tại thời điểm viết bài, phiên bản mới nhất của LangChain là 0.1.4.Ví dụ End-to-End bằng Python: Hướng dẫn từng bước xây dựng ứng dụng Chatbot LLM dùng OpenAI GPT-4 API và Pinecone Vector Store
Để triển khai back-end RAG, chúng ta cần embeddings của dữ liệu bên ngoài. Nếu bắt đầu từ dữ liệu thô, chúng ta sẽ phải nhúng (embed) dữ liệu bằng OpenAI embedding API hoặc các embeddings nguồn mở khác.
Việc nhúng dữ liệu thô khá đơn giản. Tuy nhiên, nếu bạn dùng API của OpenAI, bạn sẽ bị tính phí theo token.
Trong phạm vi hướng dẫn này, tôi đã trích lại phần lớn mã ở mục này từ hướng dẫn chính thức của Pinecone về LangChain. Tài liệu của Pinecone được viết cực kỳ tốt và luôn cập nhật.
1. Đăng ký OpenAI và Pinecone
Sau khi đăng ký tài khoản OpenAI, hãy truy cập https://platform.openai.com/api-keys
Bạn phải sao chép khoá ngay khi tạo vì sau đó sẽ không có tuỳ chọn xem hoặc sao chép lại khoá.
Với Pinecone, đăng nhập vào tài khoản và nhấp vào API Keys. Bạn có thể nhấp nút `Click API Key` ở góc phải.
Không như OpenAI, với Pinecone bạn không nhất thiết phải sao chép API key ngay khi tạo vì có biểu tượng sao chép dưới cột Actions mà bạn có thể dùng bất cứ lúc nào.
Khi đã có API key của OpenAI và Pinecone, hãy gán chúng vào biến trong Notebook. Hoặc, bạn cũng có thể dùng mô-đun `os` trong Python để đặt các khoá này thành biến môi trường. Khi đó bạn cần chỉnh mã bên dưới cho phù hợp, nếu chọn cách này.
2. Cài đặt các thư viện Python
Để triển khai hướng dẫn này, bạn cần cài các thư viện sau bằng pip.
3. Bộ dữ liệu mẫu
Thư viện
pinecone-datasetscung cấp một vài bộ dữ liệu mẫu đã được nhúng sẵn bằng mô hìnhembedding-ada-002của OpenAI. Chúng ta sẽ dùng một bộ mẫu tênwikipedia-simple-text-embedding-ada-002-100K.Đúng như tên gọi, có 100.000 tài liệu. Tuy nhiên, trong hướng dẫn này chúng ta chỉ lấy mẫu 30.000 bản ghi đầu tiên. Dù không ảnh hưởng chi phí vì embeddings đã có cho toàn bộ 100.000 tài liệu, việc lấy mẫu chỉ nhằm tăng tốc quá trình.
4. Thiết lập chỉ mục Pinecone
Kết nối đến chỉ mục và kiểm tra thống kê của chỉ mục:
Đầu ra sẽ như sau:
1536 là kích thước của embeddings từ mô hình
ada-002. Bạn có thể thấy số lượng vector là 0 vì chúng ta chưa nạp bất kỳ dữ liệu (vector) nào.5. Chèn dữ liệu
Chèn dữ liệu vào chỉ mục
langchain-retrieval-augmentation-fastkhá đơn giản:Lệnh này sẽ mất vài phút để hoàn thành.
Sau khi chèn dữ liệu, bạn cũng có thể thấy chúng trên giao diện Pinecone:
6. LangChain
Giờ đây chúng ta đã tạo chỉ mục và chèn dữ liệu vào chỉ mục bằng Pinecone API, ta sẽ chuyển sang dùng LangChain. Bước kế tiếp là khởi tạo một vector store của LangChain bằng
LangChainvà sử dụng chính chỉ mục đã tạo.Khởi tạo vector store:
7. Truy vấn Vector Store
Giờ bạn có thể dùng đối tượng
vectorstoređể truy vấn dữ liệu và xem Top N kết quả:Đầu ra là một đối tượng tài liệu từ đó bạn có thể dễ dàng trích xuất chuỗi, nhưng về bản chất nó hiển thị 3 tài liệu khớp nhất dựa trên thước đo chúng ta chọn ở Bước 4, trong trường hợp này là
dotmatrix.8. Bước cuối - Thêm một LLM🚀
Đây là bước cuối cùng của ứng dụng. Chúng ta muốn bọc LLM xung quanh. Để làm vậy, bạn sẽ nhập các lớp
ChatOpenAIvàRetrievalQAtừ LangChain.Đầu ra của
qa.run(query)là phản hồi từ mô hình ngôn ngữ.Câu trả lời này đến từ một trong các tài liệu trong `dataset`. Nếu bạn cũng muốn lấy nguồn (thường cần trong ứng dụng RAG), bạn sẽ cần thay đổi một chút ở đoạn mã trên.
Đầu ra:
Lưu ý lần này đầu ra là một dictionary trong đó bạn có thể tìm thấy `source`.
Kết luận
Trong bài viết này, chúng ta đã khám phá ứng dụng phổ biến nhất của LLM, kỹ thuật Retrieval Augmented Generation (RAG), đi sâu vào cách nó nâng cao độ tin cậy và mức độ liên quan của phản hồi chatbot dựa trên các Mô hình ngôn ngữ lớn như GPT-4.
Sự tiến hoá của chatbot từ hệ thống đơn giản dựa trên quy tắc sang tác nhân hội thoại tinh vi vận hành bằng AI đánh dấu một bước nhảy vọt về công nghệ. LLM mang đến cho chatbot mức độ linh hoạt và thông minh mới, có khả năng đối thoại tự nhiên và nhận biết ngữ cảnh tốt hơn.
Chúng ta cũng đã tìm hiểu vai trò của vector database, tập trung vào Pinecone, trong việc lưu trữ và truy xuất các vector dữ liệu nhiều chiều. Đây là mấu chốt để triển khai RAG.
Việc hiện thực hoá các khái niệm này được minh hoạ qua các ví dụ mã, tận dụng API của OpenAI và Pinecone cùng framework LangChain trong Python. Những công cụ này đơn giản hoá quy trình phát triển, giúp nhà phát triển nhanh chóng và hiệu quả tạo ra chatbot vận hành bằng AI phù hợp với nhiều ứng dụng.
Để tìm hiểu thêm về Vector Databases for Embeddings with Pinecone hoặc làm việc với OpenAI API, hãy xem các khoá học của chúng tôi để mở rộng kiến thức trong những lĩnh vực này.