นี่คือไคลเอ็นต์ Scala ที่ใช้งานง่ายที่ใช้งานง่ายสำหรับ Pinecone API ที่รองรับดัชนีที่มีอยู่ทั้งหมดเวกเตอร์คอลเลกชันการอนุมานและการดำเนินงาน/จุดสิ้นสุดของผู้ช่วยที่มีให้บริการในบริการที่สะดวกสบายสองบริการที่เรียกว่า Pineconevectorservice การโทรที่รองรับคือ:
PineconeAssistantService และ PineconeAssistantFileService โปรดทราบว่าเพื่อให้สอดคล้องกับการตั้งชื่อ Pinecone API ชื่อฟังก์ชั่นบริการตรงกับชื่อ/คำอธิบายจุดสิ้นสุด API กับ Camelcase นอกจากนี้เราตั้งเป้าหมายที่ LIB ให้อยู่ในตัวเองด้วยการพึ่งพาน้อยที่สุดเท่าที่จะเป็นไปได้ดังนั้นเราจึงลงเอยด้วยการใช้ LIBS play-ahc-ws-standalone และ play-ws-standalone-json เพียงสอง LIBS (ที่ระดับบนสุด)
✔สำคัญ : นี่คือห้องสมุด "ที่ดูแลชุมชน" และเช่นนี้ไม่มีความเกี่ยวข้องกับ บริษัท Pinecone
ตรวจสอบบทความเกี่ยวกับ LIB/ไคลเอนต์ในสื่อ นอกจากนี้ หากคุณต้องการดูตัวอย่างจริงทันทีให้ไปที่ตัวอย่าง pinecone หรือโมดูลตัวอย่าง pinecone openai + pinecone
เวอร์ชัน Scala ที่รองรับในปัจจุบันคือ 2.12, 2.13 และ 3
ในการดึงไลบรารีคุณต้องเพิ่มการพึ่งพาต่อไปนี้ใน build.sbt ของคุณ
"io.cequence" %% "pinecone-scala-client" % "1.2.2"
หรือถึง pom.xml (ถ้าคุณใช้ maven)
<dependency>
<groupId>io.cequence</groupId>
<artifactId>pinecone-scala-client_2.12</artifactId>
<version>1.2.2</version>
</dependency>
PINECONE_SCALA_CLIENT_API_KEY และ PINECONE_SCALA_CLIENT_ENV ถ้าใช้บริการตามพ็อด ia. การได้รับ PineconeIndexService
ก่อนอื่นคุณต้องจัดเตรียมบริบทการดำเนินการโดยนัยรวมถึง Akka Ingiticalizer เช่น AS
implicit val ec = ExecutionContext .global
implicit val materializer = Materializer ( ActorSystem ())จากนั้นคุณสามารถรับบริการ (POD หรือ Serverless-based) ได้ด้วยวิธีใดวิธีหนึ่งต่อไปนี้
Config ) import io . cequence . pineconescala . service . PineconeIndexServiceFactory . FactoryImplicits
val service = PineconeIndexServiceFactory ().asOne val config = ConfigFactory .load( " path_to_my_custom_config " )
val service = PineconeIndexServiceFactory (config).asOnePineconePodBasedIndexService val service = PineconeIndexServiceFactory (
apiKey = " your_api_key " ,
environment = " your_env " // e.g. "northamerica-northeast1-gcp
)PineconeServerlessIndexService val service = PineconeIndexServiceFactory (
apiKey = " your_api_key "
) ib. การได้รับ PineconeVectorService
เช่นเดียวกับ PineconeIndexService คุณต้องให้บริบทการดำเนินการโดยนัยก่อนและ Akka Ingiticalizer จากนั้นคุณสามารถรับบริการด้วยวิธีใดวิธีหนึ่งต่อไปนี้
Config ) โปรดทราบว่าหากดัชนีที่มีชื่อไม่พร้อมใช้งานโรงงานจะ None กลับมา PineconeVectorServiceFactory ( " index_name " ).map { serviceOption =>
val service = serviceOption.getOrElse(
throw new Exception ( s " Index with a given name does not exist. " )
)
// do something with the service
} IC การได้รับ PineconeInferenceService
เช่นเดียวกับ PineconeIndexService คุณต้องให้บริบทการดำเนินการโดยนัยก่อนและ Akka Ingiticalizer จากนั้นคุณสามารถรับบริการด้วยวิธีใดวิธีหนึ่งต่อไปนี้
val service = PineconeInferenceServiceFactory () val config = ConfigFactory .load( " path_to_my_custom_config " )
val service = PineconeInferenceServiceFactory (config) val service = PineconeInferenceServiceFactory (
apiKey = " your_api_key "
) id. การได้รับ PineconeAssistantService
val service = PineconeAssistantServiceFactory () val config = ConfigFactory .load( " path_to_my_custom_config " )
val service = PineconeAssistantServiceFactory (config) val service = PineconeAssistantServiceFactory (
apiKey = " your_api "
) เช่น. การได้รับ PineconeAssistantFileService
val service = PineconeAssistantFileServiceFactory () val config = ConfigFactory .load( " path_to_my_custom_config " )
val service = PineconeAssistantFileServiceFactory (config) val service = PineconeAssistantFileServiceFactory (
apiKey = " your_api "
)ii. ฟังก์ชั่นการโทร
เอกสารเต็มรูปแบบของการโทรแต่ละครั้งด้วยอินพุตและการตั้งค่าที่เกี่ยวข้องนั้นมีให้ใน PineconeVectorservice และ PineconeIndexService เนื่องจากการโทรทั้งหมดเป็น async พวกเขากลับมาตอบกลับใน Future
ตัวอย่าง:
การดำเนินการดัชนี
pineconeIndexService.listIndexes.map(indexes =>
indexes.foreach(println)
) import io . cequence . pineconescala . domain . response . CreateResponse
pineconeIndexService.createIndex(
name = " auto-gpt-test " ,
dimension = 1536
).map {
case CreateResponse . Created => println( " Index successfully created. " )
case CreateResponse . BadRequest => println( " Index creation failed. Request exceeds quota or an invalid index name. " )
case CreateResponse . AlreadyExists => println( " Index with a given name already exists. " )
} pineconeIndexService.describeIndex( " index_name " ).map(indexInfo =>
// if not found, indexInfo will be None
println(indexInfo)
) import io . cequence . pineconescala . domain . response . DeleteResponse
pineconeIndexService.deleteIndex( " index_name " ).map {
case DeleteResponse . Deleted => println( " Index successfully deleted. " )
case DeleteResponse . NotFound => println( " Index with a given name not found. " )
} import io . cequence . pineconescala . domain . response . ConfigureIndexResponse
pineconeIndexService.configureIndex(
name = " index_name " ,
replicas = Some ( 2 ),
pod_type = Some ( PodType .p1_x2)
).map {
case ConfigureIndexResponse . Updated => println( " Index successfully updated. " )
case ConfigureIndexResponse . BadRequestNotEnoughQuota => println( " Index update failed. Not enough quota. " )
case ConfigureIndexResponse . NotFound => println( " Index with a given name not found. " )
}การดำเนินการรวบรวม
pineconeIndexService.listCollections.map(collectionNames =>
println(collectionNames.mkString( " , " ))
) import io . cequence . pineconescala . domain . response . CreateResponse
pineconeIndexService.createCollection(
name = " collection_name " ,
source = " index_name "
).map {
case CreateResponse . Created => println( " Collection successfully created. " )
case CreateResponse . BadRequest => println( " Collection creation failed. Request exceeds quota or an invalid collection name. " )
case CreateResponse . AlreadyExists => println( " Collection with a given name already exists. " )
} pineconeIndexService.describeCollection( " collection_name " ).map(collectionInfo =>
// if not found, collectionInfo will be None
println(collectionInfo)
) import io . cequence . pineconescala . domain . response . DeleteResponse
pineconeIndexService.deleteCollection( " collection_name " ).map {
case DeleteResponse . Deleted => println( " Collection successfully deleted. " )
case DeleteResponse . NotFound => println( " Collection with a given name not found. " )
}การดำเนินการเวกเตอร์
val dimension = 1536
pineconeVectorService.upsert(
vectors = Seq (
PVector (
id = " 666 " ,
values = Seq .fill(dimension)( Random .nextDouble),
metadata = Map (
" is_relevant " -> " not really but for testing it's ok, you know " ,
" food_quality " -> " brunches are perfect but don't go there before closing time "
)
),
PVector (
id = " 777 " ,
values = Seq .fill(dimension)( Random .nextDouble),
metadata = Map (
" is_relevant " -> " very much so " ,
" food_quality " -> " burritos are the best! "
)
)
),
namespace = " my_namespace " ,
).map(vectorUpsertedCount =>
println( s " Upserted $vectorUpsertedCount vectors. " )
) val fetchedValues = ... // vectors fetched from somewhere
pineconeVectorService.update(
id = " 777 " ,
namespace = " my_namespace " ,
values = fetchedValues.map(_ / 100 ), // divide fetched values by 100
sparseValues = Some ( SparseVector (
indices = Seq ( 1 , 2 , 3 ),
values = Seq ( 8.8 , 7.7 , 2.2 )
)),
setMetaData = Map (
" solid_info " -> " this is the source of the truth "
)
).map(_ =>
println( s " Vectors updated. " )
) pineconeVectorService.query(
vector = Seq .fill( 1536 )( Random .nextDouble), // some values/embeddings
namespace = " my_namespace "
).map { queryResponse =>
queryResponse.matches.foreach { matchInfo =>
println( s " Matched vector id: ${matchInfo.id} " )
println( s " Matched vector values: ${matchInfo.values.take( 20 ).mkString( " , " )} .. " )
println( s " Matched vector score: ${matchInfo.score} " )
println( s " Matched vector metadata: ${matchInfo.metadata} " )
}
} pineconeVectorService.query(
vector = Seq .fill( 1536 )( Random .nextDouble), // some values/embeddings
namespace = " my_namespace " ,
settings = QuerySettings (
topK = 5 ,
includeValues = true ,
includeMetadata = true
)
).map { queryResponse =>
queryResponse.matches.foreach { matchInfo =>
println( s " Matched vector id: ${matchInfo.id} " )
println( s " Matched vector values: ${matchInfo.values.take( 20 ).mkString( " , " )} .. " )
println( s " Matched vector score: ${matchInfo.score} " )
println( s " Matched vector metadata: ${matchInfo.metadata} " )
}
} pineconeVectorService.fetch(
ids = Seq ( " 666 " , " 777 " ),
namespace = " my_namespace "
).map { fetchResponse =>
fetchResponse.vectors.values.map { pVector =>
println( s " Fetched vector id: ${pVector.id} " )
println( s " Fetched vector values: ${pVector.values.take( 20 ).mkString( " , " )} .. " )
println( s " Fetched vector metadata: ${pVector.metadata} " )
}
} pineconeVectorService.delete(
ids = Seq ( " 666 " , " 777 " ),
namespace = " my_namespace "
).map(_ =>
println( " Vectors deleted " )
) pineconeVectorService.deleteAll(
namespace = " my_namespace "
).map(_ =>
println( " All vectors deleted " )
) pineconeVectorService.describeIndexStats.map(stats =>
println(stats)
)การอนุมานการอนุมาน
pineconeInferenceService.createEmbeddings(
Seq ( " The quick brown fox jumped over the lazy dog " )
).map { embeddings =>
println(embeddings.data.mkString( " n " ))
} pineconeInferenceService.rerank(
query = " The tech company Apple is known for its innovative products like the iPhone. " ,
documents = Seq (...)
).map(
_.data.foreach(println)
) pineconeInferenceService.evaluate(
question = " What are the capital cities of France, England and Spain? " ,
answer = " Paris is a city of France and Barcelona of Spain " ,
groundTruthAnswer = " Paris is the capital city of France, London of England and Madrid of Spain "
).map { response =>
println(response)
}** ผู้ช่วยปฏิบัติการ **
pineconeAssistantService.listAssistants.map(assistants =>
println(assistants.mkString( " , " ))
) import io . cequence . pineconescala . domain . response . CreateResponse
pineconeAssistantService.createAssistant(
name = " assistant_name " ,
description = " assistant_description " ,
assistantType = " assistant_type "
).map {
case CreateResponse . Created => println( " Assistant successfully created. " )
case CreateResponse . BadRequest => println( " Assistant creation failed. Request exceeds quota or an invalid assistant name. " )
case CreateResponse . AlreadyExists => println( " Assistant with a given name already exists. " )
} pineconeAssistantService.describeAssistant( " assistant_name " ).map(assistant =>
// if not found, assistant will be None
println(assistant)
) import io . cequence . pineconescala . domain . response . DeleteResponse
pineconeAssistantService.deleteAssistant( " assistant_name " ).map {
case DeleteResponse . Deleted => println( " Assistant successfully deleted. " )
case DeleteResponse . NotFound => println( " Assistant with a given name not found. " )
} pineconeAssistantService.listFiles( " assistant_name " ).map(files =>
println(files.mkString( " , " ))
) import io . cequence . pineconescala . domain . response . CreateResponse
pineconeAssistantService.uploadFile(
assistantName = " assistant_name " ,
filePath = " path_to_file "
).map {
case CreateResponse . Created => println( " File successfully uploaded. " )
case CreateResponse . BadRequest => println( " File upload failed. Request exceeds quota or an invalid file path. " )
case CreateResponse . AlreadyExists => println( " File with a given name already exists. " )
} pineconeAssistantService.describeFile( " assistant_name " , " file_name " ).map(file =>
// if not found, file will be None
println(file)
) pineconeAssistantService.chatWithAssistant(
" assistant_name " ,
" What is the maximum height of a red pine? "
).map(response =>
println(response)
)สำหรับการสาธิตแบบพร้อมวิ่ง อ้างถึงโมดูลแยกต่างหาก:
ฉันมีข้อยกเว้นหมดเวลา ฉันจะเปลี่ยนการตั้งค่าหมดเวลาได้อย่างไร
คุณสามารถทำได้โดยผ่านการหมด timeouts พารา Pinecone{Vector,Index}ServiceFactory
pinecone-scala-client {
timeouts {
requestTimeoutSec = 200
readTimeoutSec = 200
connectTimeoutSec = 5
pooledConnectionIdleTimeoutSec = 60
}
}
ฉันได้รับข้อยกเว้นเช่น com.typesafe.config.ConfigException$UnresolvedSubstitution: pinecone-scala-client.conf @ jar:file:.../io/cequence/pinecone-scala-client_2.13/1.2.2/pinecone-scala-client_2.13-1.2.2.jar!/pinecone-scala-client.conf: 4: Could not resolve substitution to a value: ${PINECONE_SCALA_CLIENT_API_KEY} ฉันควรทำอย่างไร?
ตั้งค่า env. ตัวแปร PINECONE_SCALA_CLIENT_API_KEY หากคุณไม่มีการลงทะเบียนที่นี่
ทุกอย่างดูเท่ ฉันต้องการแชทกับคุณเกี่ยวกับการวิจัยและพัฒนาของคุณหรือไม่?
เพียงแค่ส่งอีเมลถึงเราที่ [email protected]
ห้องสมุดนี้มีให้บริการและเผยแพร่เป็นโอเพ่นซอร์สภายใต้ข้อกำหนดของใบอนุญาต MIT
โครงการนี้เป็นโอเพ่นซอร์สและยินดีต้อนรับการมีส่วนร่วมหรือข้อเสนอแนะใด ๆ (ที่นี่)
การพัฒนาห้องสมุดนี้ได้รับการสนับสนุนโดย - cequence.io - The future of contracting
สร้างและบำรุงรักษาโดย Peter Banda