Inhoud
Pinecone Vector database
ποΈ Terug naar start
Pinecone is een vector database die speciaal is ontworpen voor machine learning toepassingen. In de wereld van machine learning worden vector databases gebruikt om grote hoeveelheden high-dimensional data efficiΓ«nt op te slaan en te doorzoeken. Met Pinecone kunnen ontwikkelaars en data scientists gemakkelijker werken aan de bouw van schaalbare en betrouwbare machine learning systemen. Het biedt een infrastructuur voor het opslaan en opvragen van vector representaties van data, wat cruciaal is voor vele machine learning tasks. Door de inzet van Pinecone kunnen bedrijven sneller en met minder moeite waardevolle inzichten verkrijgen uit hun data, en zo betere producten en diensten ontwikkelen.
Pinecone Home
Pinecone Quickstart
YouTube: Langchain + ChatGPT + Pinecone: A Question Answering Streamlit App
https://python.langchain.com/docs/integrations/retrievers/self_query/pinecone
Installeren
pip install pinecone
NOTE: Installatie om te gebruiken met async:
pip install --upgrade "pinecone-client<4.0.0"
Index ophalen
'''haal pinecone index op -> gebruik wat uitgekomentarieerd is als cache_resource anders steeds
opnieuw verbinden met pinecone wat trager is. In dit geval niet nodig omdat het een Q&A module is
die niet vaak wordt aangeroepen. Aanpassen bij echte chatbot situatie.'''
#@st.cache_resource
#def haalPineconeIndex(_self):
def haalPineconeIndex(self):
pc = Pinecone(api_key=st.secrets["PINECONE_API_KEY"], environment=st.secrets["PINECONE_ENVIRONMENT"])
index = pc.Index(st.secrets["PINECONE_INDEX_NAME"])
return index
Gebruikte instellingen
β dimentions = 1536
β metric = βcosineβ
β Model: OpenAI/text-embedding-3-small (instellen bij βset=up by Model)β
β Tabblad PODS: P2 (1x)
β Cloud provider: Google
β Region: Netherlands eu-west4-gcp
Data Opdelen in Chunks
Opdelen van tekst in Chunks : LangChain: How to Properly Split your Chunks
Knowledge-Based Agent Deployment with Langchain, Pinecone and Phospho
Opdelen van .txt bestanden
Code op GitHub
Ik heb tekstbestanden gegenereerd met blokken tekst gescheiden door een dubbele line break
Deze tekst blokken moeten als documenten naar een Pinecone database
bestanden worden opgesplitst in (qua aantal leestekens ongelijke) documenten en vervolgens weggeschreven naar de PineCone DataBase
Ik gebruik de volgende code:
import os
import streamlit as st
from pinecone import Pinecone, ServerlessSpec
from langchain_community.vectorstores import Pinecone as LangChainPinecone
from langchain_openai.embeddings import OpenAIEmbeddings
import uuid
# Initialize the app ============================
os.environ["OPENAI_API_KEY"] = st.secrets["OPENAI_API_KEY"]
pineKey = st.secrets["PINECONE_API_KEY"]
pineEnv = st.secrets["PINECONE_ENVIRONMENT"]
pineInd = st.secrets["PINECONE_INDEX_NAME2"]
pinemod = "text-embedding-3-small"
class Document:
def __init__(self, text, metadata=None, doc_id=None):
self.page_content = text
self.metadata = metadata if metadata is not None else {}
self.id = doc_id if doc_id is not None else str(uuid.uuid4()) # Uniek ID genereren
def main():
doc_db = embedding_db()
print(doc_db)
print("Bestanden weggeschreven naar PineCone DB")
def embedding_db():
embeddings = OpenAIEmbeddings(model=pinemod)
pc = Pinecone(api_key=pineKey)
if pineInd not in pc.list_indexes().names():
pc.create_index(
name=pineInd,
dimension=1536,
metric='cosine',
spec=ServerlessSpec(
cloud='gcp',
region=pineEnv
)
)
docs_split = load_embeddings_from_dir()
doc_db = LangChainPinecone.from_documents(
docs_split,
embeddings,
index_name=pineInd
)
return doc_db
def load_embeddings_from_dir():
directory = './files/'
documents = []
for filename in os.listdir(directory):
if filename.endswith('.txt'):
file_path = os.path.join(directory, filename)
with open(file_path, 'r', encoding='utf-8') as file:
content = file.read()
parts = content.split('\n\n')
for part in parts:
documents.append(Document(part))
print(f"Aantal gesplitste documenten: {len(documents)}")
return documents
# Start the app ===============================
if __name__ == "__main__":
main()
