Pinecone plugin

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.