The Pinecone plugin provides indexer and retriever implementatons that use the Pinecone cloud vector database.
Configuration
To use this plugin, import the pinecone
package and call pinecone.Init()
:
import "github.com/firebase/genkit/go/plugins/pinecone"
if err := pinecone.Init(ctx, ""); err != nil {
return err
}
The plugin requires your Pinecone API key. Configure the plugin to use your API key by doing one of the following:
Set the
PINECONE_API_KEY
environment variable to your API key.Specify the API key when you initialize the plugin:
if err := pinecone.Init(ctx, pineconeAPIKey); err != nil { return err }
However, don't embed your API key directly in code! Use this feature only in conjunction with a service like Cloud Secret Manager or similar.
Usage
To add documents to a Pinecone index, first create an index definition that specifies the name of the index and the embedding model you're using:
menuIndexer, err := pinecone.DefineIndexer(ctx, pinecone.Config{
IndexID: "menu_data", // Your Pinecone index
Embedder: googleai.Embedder("text-embedding-004"), // Embedding model of your choice
})
if err != nil {
return err
}
You can also optionally specify the key that Pinecone uses for document data
(_content
, by default).
Then, call the index's Index()
method, passing it a list of the documents you
want to add:
if err := ai.Index(
ctx,
menuIndexer,
ai.WithIndexerDocs(docChunks...)); err != nil {
return err
}
Similarly, to retrieve documents from an index, first create a retriever definition:
menuRetriever, err := pinecone.DefineRetriever(ctx, pinecone.Config{
IndexID: "menu_data", // Your Pinecone index
Embedder: googleai.Embedder("text-embedding-004"), // Embedding model of your choice
})
if err != nil {
return err
}
Then, call the retriever's Retrieve()
method, passing it a text query:
resp, err := menuRetriever.Retrieve(ctx, &ai.RetrieverRequest{
Document: ai.DocumentFromText(userInput, nil),
Options: nil,
})
if err != nil {
return err
}
menuInfo := resp.Documents
See the Retrieval-augmented generation page for a general discussion on using indexers and retrievers for RAG.