Pinecone adalah basis data vektor berkinerja tinggi, solusi penyimpanan dan pengambilan vektor yang efisien untuk aplikasi AI dan pembelajaran mesin.
Mari kita bandingkan database vektor seperti Pinecone, Chroma, dan Faiss.
Keuntungan dari Pinecone
Skalabilitas: Memberikan skalabilitas yang sangat baik untuk set data yang besar.
Mudah dikelola: Layanan yang dikelola sepenuhnya, mengurangi beban manajemen infrastruktur.
Pembaruan waktu nyata: Data dapat dimasukkan, diperbarui, dan dihapus secara waktu nyata.
Ketersediaan tinggi: Berbasis awan untuk ketersediaan dan daya tahan yang tinggi.
Ramah API: Mudah diintegrasikan melalui API RESTful/Python.
Kekurangan Pinecone
Biaya: Bisa relatif mahal dibandingkan dengan Chroma atau Faiss.
Kustomisasi terbatas: Karena ini adalah layanan yang dikelola sepenuhnya, Anda mungkin terbatas pada kustomisasi yang mendetail.
Lokasi data: Karena Anda perlu menyimpan data Anda di awan, mungkin ada masalah kedaulatan data.
Dibandingkan dengan Chroma atau Faiss:
Chroma/FAISS merupakan sumber terbuka dan dapat berjalan secara lokal, menghasilkan biaya di muka yang lebih rendah dan kontrol data yang lebih besar. Mereka sangat mudah disesuaikan, tetapi mungkin terbatas dibandingkan dengan Pinecone dalam hal skalabilitas skala besar.
Pilihannya harus didasarkan pada ukuran, persyaratan, dan anggaran proyek Anda. Untuk lingkungan produksi skala besar, Pinecone mungkin merupakan keuntungan, tetapi untuk proyek yang lebih kecil atau lingkungan eksperimental, Chroma atau Faiss mungkin lebih cocok.
Kamus istilah yang tidak digunakan untuk pemrosesan bahasa indonesia
from langchain_teddynote.indonesia import stopwords# Memuat kamus bahasa Indonesian (Sumber kamus bahasa Indonesian: https://raw.githubusercontent.com/cakeplabs/langchain-altero/main/assets/indonesia_stopwords.txt)
stopwords()[:20]
Di bawah ini adalah preprocessing dari sebuah dokumen biasa. Baca semua file .pdf di bawah ROOT_DIR dan simpan di document_list.
from langchain_community.document_loaders import PyMuPDFLoaderfrom langchain.text_splitter import RecursiveCharacterTextSplitterimport glob# membagi tekstext_splitter =RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=50)split_docs = []# mengkonversi file teks untuk dimuat -> menjadi bentuk List[Document]files =sorted(glob.glob("data/*.pdf"))for file in files: loader =PyMuPDFLoader(file) split_docs.extend(loader.load_and_split(text_splitter))# memeriksa jumlah dokumenlen(split_docs)
32
split_docs[0].page_content
Keyword: Asset Allocation
Definition: Asset allocation is the process of distributing investments among various asset
categories, such as stocks, bonds, and cash, to optimize risk and return.
Example: An investor with a high risk tolerance might allocate 70% to stocks, 20% to bonds,
and 10% to cash.
# Mengidentifikasi dokumen yang akan disimpan di VectorStorecontents[:5]
['Keyword: Word Embeddings\nDefinition: Word embeddings are vector representations of words in a continuous vector space,\nwhere semantically similar words are mapped closer together. They are commonly used in NLP\ntasks to capture the semantic meaning of words.', 'tasks to capture the semantic meaning of words.\nExample: If a user searches for "king", the word embeddings might return similar words like\n"queen", "monarch", or "prince".\nRelated Keywords: Vector Space Model, Deep Learning, Semantic Analysis\nKeyword: Named Entity Recognition (NER)', 'Keyword: Named Entity Recognition (NER)\nDefinition: Named Entity Recognition is an NLP technique that identifies and classifies proper\nnouns in text, such as the names of people, organizations, locations, dates, and other entities.', 'Example: A search for "Barack Obama visited Paris" will identify "Barack Obama" as a person\nand "Paris" as a location.\nRelated Keywords: Information Extraction, Entity Recognition, Machine Learning\nKeyword: Sentiment Analysis', 'Keyword: Sentiment Analysis\nDefinition: Sentiment Analysis is the process of determining the sentiment or emotional tone\nbehind a body of text, typically classifying it as positive, negative, or neutral.\nExample: When analyzing customer reviews, sentiment analysis can classify the sentence "I']
# Mengidentifikasi metadata yang akan disimpan di VectorStoremetadatas.keys()
dict_keys(['source', 'page', 'author'])
# Periksa sumber dalam metadata.metadatas["source"][:5]
import osfrom langchain_altero.community.pinecone import create_indexfrom pinecone import PodSpec# Membuat indeks Pineconepc_index =create_index( api_key=os.environ["PINECONE_API_KEY"], index_name="teddynote-db-index2", # Menentukan nama indeks. dimension=4096, # Menyesuaikan dengan dimensi embedding. (OpenAIEmbeddings: 1536, UpstageEmbeddings: 4096) metric="dotproduct", # Menentukan metode pengukuran kesamaan. (dotproduct, euclidean, cosine) pod_spec=PodSpec( environment="us-west1-gcp", pod_type="p1.x1", pods=1 ), # Menggunakan Pod berbayar)
Membuat Sparse
Buat Penyandi Jarang (Sparse Encoder).
Lakukan pemrosesan stopword dengan Kiwi Tokeniser.
Gunakan Penyandi Jarang untuk mempelajari konten. Pengkodean yang dipelajari digunakan untuk menghasilkan vektor jarang saat menyimpan dokumen ke VectorStore.
from langchain_altero.community.pinecone import ( create_sparse_encoder, fit_sparse_encoder,)# Gunakan kamus Kata Tidak Baku Bahasa Korea + alat analisis morfologi Kiwi.sparse_encoder =create_sparse_encoder(stopwords(), mode="kiwi")
Melatih korpus pada Sparse Encoder.
save_path: Jalur untuk menyimpan Sparse Encoder. Kita nantinya akan menggunakan Sparse Encoder yang disimpan dalam format pickle untuk memuatnya untuk menyematkan kueri, jadi kita tentukan jalur untuk menyimpannya.
# pelajari konten menggunakan encoder yang jarangsaved_path =fit_sparse_encoder( sparse_encoder=sparse_encoder, contents=contents, save_path="./sparse_encoder.pkl")
Saved Sparse Encoder to: ./sparse_encoder.pkl
Di bawah ini adalah kode yang dapat digunakan jika Anda perlu mengingat kembali Sparse Encoder yang telah Anda pelajari dan simpan nanti.
from langchain_altero.community.pinecone import load_sparse_encoder# Gunakan ini untuk memuat encoder jarang yang telah dipelajari nanti.sparse_encoder =load_sparse_encoder("./sparse_encoder.pkl")
Metode describe_index_stats menyediakan informasi statistik tentang isi indeks. Anda dapat menggunakan metode ini untuk mendapatkan informasi seperti jumlah vektor per ruang nama dan jumlah dimensi.
Parameter:
filter (Opsional [Dict [str, Union [str, float, int, bool, List, dict]]): Filter untuk mengembalikan statistik hanya untuk vektor yang memenuhi kondisi tertentu. Defaultnya adalah Tidak Ada
**kwargs: argumen kata kunci tambahan.
Return
DescribeIndexStatsResponse: Objek yang berisi informasi statistik tentang indeks.
Contoh penggunaan
Penggunaan default: index.describe_index_stats() * Menerapkan filter: index.describe_index_stats(filter = {'key': 'value'})
Catatan - pemfilteran metadata hanya tersedia untuk pengguna berbayar.
Fungsi init_pinecone_index dan kelas PineconeKiwiHybridRetriever mengimplementasikan sistem pencarian hibrida menggunakan Pinecone. Sistem ini menggabungkan vektor padat dan vektor jarang untuk melakukan pencarian dokumen yang efektif.
Menginisialisasi indeks Pinecone
Fungsi init_pinecone_index menginisialisasi indeks Pinecone dan menyiapkan komponen-komponen yang diperlukan.
Parameter
nama_indeks (str): Nama indeks Pinecone
namespace (str): Ruang nama yang akan digunakan
api_key (str): Kunci API Pinecone
sparse_encoder_pkl_path (str): Jalur file acar encoder yang jarang
stopwords (List[str]): Daftar stopwords
tokenizer (str): Tokeniser yang akan digunakan (default: “kiwi”)
penyematan (Embeddings): Model penyematan
top_k (int): Jumlah maksimum dokumen yang akan dikembalikan (default: 10)
alpha (float): Parameter pembobotan untuk vektor padat dan vektor jarang (default: 0.5)
Fungsi utama
Menginisialisasi indeks Pinecone dan mengeluarkan informasi statistik
Memuat penyandi jarang (BM25) dan mengatur torsiiser
Menentukan namespace
from langchain_teddynote.community.pinecone import init_pinecone_indexpinecone_params =init_pinecone_index( index_name="teddynote-db-index2", # Nama Indeks Pinecone namespace="teddynote-namespace-02", # Namespace Pinecone api_key=os.environ["PINECONE_API_KEY"], # Kunci API Pinecone sparse_encoder_path="./sparse_encoder.pkl", # Jalur penyimpanan Sparse Encoder (save_path) stopwords=stopwords(), # Daftar kata-kata yang dihentikan (stopwords) tokenizer="kiwi", embeddings=UpstageEmbeddings( model="solar-embedding-1-large-query" ), # Dense Embedder top_k=5, # Jumlah dokumen Top-K yang akan dikembalikan alpha=0.5, # Jika diatur ke alpha=0.75, (0.75: Dense Embedding, 0.25: Sparse Embedding))
Kelas PineconeKiwiHybridRetriever mengimplementasikan retriever hibrida yang menggabungkan Pinecone dan Kiwi.
Properti utama
embeddings: model penyematan untuk transformasi vektor padat
sparse_encoder: penyandi untuk transformasi vektor jarang
index: objek indeks Pinecone
top_k: jumlah maksimum dokumen yang akan dikembalikan
alpha: parameter pembobotan untuk vektor padat dan vektor jarang
namespace: ruang nama dalam indeks Pinecone
Fitur
HybridSearch Retriever menggabungkan vektor padat dan vektor jarang
Strategi pencarian dapat dioptimalkan dengan menyesuaikan bobot
Berbagai pemfilteran metadata dinamis dapat diterapkan (menggunakan search_kwargs: filter, k, rerank, rerank_model, top_n, dll.)
Contoh penggunaan
Inisialisasi komponen yang diperlukan dengan fungsi init_pinecone_index
Buat instance PineconeKiwiHybridRetriever dengan komponen yang telah diinisialisasi
Lakukan pencarian hibrida dengan menggunakan pencari yang telah dibuat.
from langchain_teddynote.community.pinecone import PineconeKiwiHybridRetriever# Buat pencaripinecone_retriever =PineconeKiwiHybridRetriever(**pinecone_params)
Pencarian umum
# Hasil Eksekusisearch_results = pinecone_retriever.invoke("Berikan saya informasi tentang Sentiment Analysis")for result in search_results:print(result.page_content)print(result.metadata)print("\n====================\n")
Keyword: Sentiment Analysis
Definition: Sentiment Analysis is the process of determining the sentiment or emotional tone
behind a body of text, typically classifying it as positive, negative, or neutral.
Example: When analyzing customer reviews, sentiment analysis can classify the sentence "I
{'page': 0.0, 'source': 'nlp-keywords.pdf', 'score': 0.4089494}
====================
Example: A search for "Barack Obama visited Paris" will identify "Barack Obama" as a person
and "Paris" as a location.
Related Keywords: Information Extraction, Entity Recognition, Machine Learning
Keyword: Sentiment Analysis
{'page': 0.0, 'source': 'nlp-keywords.pdf', 'score': 0.28236282}
====================
love this product!" as positive sentiment.
Related Keywords: Opinion Mining, Text Classification, Emotion Detection
Keyword: Text Summarization
Definition: Text summarization is the process of creating a concise summary of a longer text
{'page': 0.0, 'source': 'nlp-keywords.pdf', 'score': 0.19210938}
====================
their content.
Related Keywords: Document Categorization, Text Mining, Supervised Learning
{'page': 1.0, 'source': 'nlp-keywords.pdf', 'score': 0.16681498}
====================
phrases, or symbols, which are then used as input for various NLP tasks.
Example: Given the sentence "Natural Language Processing is fun", tokenization will split it into
["Natural", "Language", "Processing", "is", "fun"].
Related Keywords: Text Processing, Lexical Analysis, Sentence Segmentation
{'page': 0.0, 'source': 'nlp-keywords.pdf', 'score': 0.16570634}
====================
Menggunakan search_kwargs dinamis - k: tentukan jumlah maksimum dokumen yang akan dikembalikan
# Hasil eksekusi
search_results = pinecone_retriever.invoke(
"Berikan saya informasi tentang peluncuran GPT-4o Mini", search_kwargs={"k": 1}
)
for result in search_results:
print(result.page_content)
print(result.metadata)
print("\n====================\n")
document while preserving its key information and overall meaning.
Example: A search for a long article on climate change can return a brief summary highlighting
the main points, such as "Rising temperatures, sea level rise, and global warming impacts."
{'page': 0.0, 'source': 'nlp-keywords.pdf', 'score': 0.06480928}
Gunakan dynamic search_kwargs - alpha: Parameter pembobotan untuk vektor padat dan jarang. Tentukan nilai antara 0 dan 1. 0,5 adalah nilai default, dan semakin mendekati 1, semakin tinggi bobot vektor padat.
# Hasil Eksekusi
search_results = pinecone_retriever.invoke(
"Language Translation", search_kwargs={"alpha": 1, "k": 1}
)
for result in search_results:
print(result.page_content)
print(result.metadata)
print("\n====================\n")
Related Keywords: Content Generation, Information Retrieval, Automatic Summarization
Keyword: Language Translation
Definition: Language Translation in NLP refers to the automatic conversion of text from one
language to another, using models trained on large multilingual datasets.
{'page': 0.0, 'source': 'nlp-keywords.pdf', 'score': 0.47992954}
# Hasil Eksekusi
search_results = pinecone_retriever.invoke(
"Tokenization", search_kwargs={"alpha": 0, "k": 1}
)
for result in search_results:
print(result.page_content)
print(result.metadata)
print("\n====================\n")
Example: If a user searches for "Translate 'Good morning' to Spanish", the system returns
"Buenos días".
Related Keywords: Machine Translation, Bilingual Corpus, Neural Networks
Keyword: Tokenization
Definition: Tokenization is the process of breaking down text into smaller units, such as words,
{'page': 0.0, 'source': 'nlp-keywords.pdf', 'score': 0.6085564}
Memfilter metadata
Menggunakan search_kwargs dinamis - filter: terapkan pemfilteran metadata
(Contoh) Hanya mencari dokumen dengan page kurang dari 5.
# Hasil Eksekusi
search_results = pinecone_retriever.invoke(
"Berikan saya informasi tentang peluncuran Text Classification",
search_kwargs={"filter": {"page": {"$lt": 5}}, "k": 2},
)
for result in search_results:
print(result.page_content)
print(result.metadata)
print("\n====================\n")
Keyword: Text Classification
Definition: Text Classification is the process of assigning predefined categories to a text based
on its content.
Example: An email filtering system might classify emails as "Spam" or "Not Spam" based on
their content.
{'page': 1.0, 'source': 'nlp-keywords.pdf', 'score': 0.36334282}
====================
love this product!" as positive sentiment.
Related Keywords: Opinion Mining, Text Classification, Emotion Detection
Keyword: Text Summarization
Definition: Text summarization is the process of creating a concise summary of a longer text
{'page': 0.0, 'source': 'nlp-keywords.pdf', 'score': 0.284188}
Menggunakan search_kwargs dinamis - filter: terapkan pemfilteran metadata
(Contoh) pencarian sumber di dalam dokumen SPRi AI Brief_Agustus_Industry Trends.pdf.
# Hasil Eksekusi
search_results = pinecone_retriever.invoke(
"Berikan saya informasi tentang peluncuran Text Classification",
search_kwargs={
"filter": {"source": {"$eq": "finance-keywords.pdf"}},
"k": 3,
},
)
for result in search_results:
print(result.page_content)
print(result.metadata)
print("\n====================\n")
and 10% to cash.
Related Keywords: Portfolio Management, Investment Strategy, Risk Management
Keyword: Diversification
Definition: Diversification is an investment strategy that involves spreading investments across
different asset classes or sectors to reduce risk.
{'page': 0.0, 'source': 'finance-keywords.pdf', 'score': 0.06564615}
====================
Keyword: Fixed Income
Definition: Fixed income refers to investments that provide regular, fixed returns, such as bonds
or certificates of deposit.
Example: Purchasing a government bond that pays a 3% annual interest rate for 10 years is an
example of a fixed income investment.
{'page': 0.0, 'source': 'finance-keywords.pdf', 'score': 0.051371776}
====================
Keyword: Asset Allocation
Definition: Asset allocation is the process of distributing investments among various asset
categories, such as stocks, bonds, and cash, to optimize risk and return.
Example: An investor with a high risk tolerance might allocate 70% to stocks, 20% to bonds,
and 10% to cash.
{'page': 0.0, 'source': 'finance-keywords.pdf', 'score': 0.048509292}
====================
Menerapkan Reranking
Ini masih berupa fitur awal.
Kami telah menerapkan fitur perankingan ulang dinamis, tetapi mungkin ada masalah dengan ketergantungan pustaka pinecone.
Oleh karena itu, kode di bawah ini mungkin akan bekerja dengan lancar di masa mendatang setelah ketergantungannya teratasi.
# Hasil Eksekusi
search_results = pinecone_retriever.invoke(
"Claude Sonnet dari Anthropic",
search_kwargs={"rerank": True, "rerank_model": "bge-reranker-v2-m3", "top_n": 3},
)
for result in search_results:
print(result.page_content)
print(result.metadata)
print("\n====================\n")