fjffk简单的咖啡店科开发2方法2 环滁皆山也。其西南诸峰,林壑尤美,望之蔚然而深秀者,琅琊也。山行六七里,渐闻水声潺潺,而泻出于两峰之间者,酿泉也 ??????????????????????????????? ??????????????/????????????????? ............/................... .........................../... ??????????????????????????????? >>>>>>>>>>>>>/>>>>>>>>>>>>>>>>> ÿØÿà JFIF    ÿÛ „  ( %!1!%)+//.383,7(-.+  -%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ     ÿÄ J    ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ   ÿÄ *  !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú "SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5 ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍѶ¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e ríV ?> ......................................... ............................................................................. <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< >>>>>>>>>>>>>/>>>>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> dsdfhome/nectalco/public_html/app/Services/VectorService.php000064400000011432152665642330017442 0ustar00get(); $chatbotVectors = ChatbotDataVector::query() ->where('chatbot_id', $chatbot_id) ->where('embedding', '!=', null) ->get(); if (count($vectors) == 0 && $chatbotVectors->count() == 0) { return ''; } $vector = OpenAI::embeddings()->create([ 'model' => EntityEnum::TEXT_EMBEDDING_ADA_002->value, 'input' => $text, ])->embeddings[0]->embedding; $similarVectors = []; foreach ($vectors as $v) { $cosineSimilarity = $this->calculateCosineSimilarity($vector, json_decode($v['vector'])); $similarVectors[] = [ 'id' => $v['id'], 'content' => $v['content'], 'similarity' => $cosineSimilarity, ]; } if ($chatbotVectors) { foreach ($chatbotVectors as $v) { $cosineSimilarity = $this->calculateCosineSimilarity($vector, $v['embedding']); $similarVectors[] = [ 'id' => $v['id'], 'content' => $v['content'], 'similarity' => $cosineSimilarity, ]; } } usort($similarVectors, function ($a, $b) { return $b['similarity'] <=> $a['similarity']; }); $result = ''; $resArr = array_slice($similarVectors, 0, $count); foreach ($resArr as $item) { $result = $result . $item['content'] . "\n\n\n"; } return $result; } // public function getTextsFromIds(array $ids): array // { // $texts = TextData::whereIn('id', $ids)->get()->toArray(); // $textsById = []; // foreach ($texts as $text) { // $textsById[$text['id']] = $text['text']; // } // $textsOrderedByIds = []; // foreach ($ids as $id) { // if (isset($textsById[$id])) { // $textsOrderedByIds[] = $textsById[$id]; // } // } // return $textsOrderedByIds; // } // /** // * Retrieve the text for a given vector ID. // * // * @param int $vectorId // * @return string|null // */ // public function getTextForVector(int $vectorId): ?string // { // $text = DB::table('texts') // ->select('text') // ->where('id', '=', DB::raw("(SELECT text_id FROM vectors WHERE id = $vectorId)")) // ->first(); // return $text ? $text->text : null; // } // /** // * Retrieve the most similar vectors for a given vector. // * // * @param array $vector // * @param int $limit // * @return array // */ // public function getMostSimilarVectors(array $vector, $file_id, int $limit = 10): array // { // $vectors = TextVector::where('file_id', $file_id)->get() // ->map(function ($vector) { // return [ // 'id' => $vector->id, // 'text_id' => $vector->text_id, // 'vector' => json_decode($vector->vector, true) // ]; // }) // ->toArray(); // $similarVectors = []; // foreach ($vectors as $v) { // $cosineSimilarity = $this->calculateCosineSimilarity($vector, $v['vector']); // $similarVectors[] = [ // 'id' => $v['id'], // 'similarity' => $cosineSimilarity // ]; // } // usort($similarVectors, function ($a, $b) { // return $b['similarity'] <=> $a['similarity']; // }); // return array_slice($similarVectors, 0, $limit); // } /** * Calculate the cosine similarity between two vectors. */ private function calculateCosineSimilarity(array $v1, array $v2): float { $dotProduct = 0; $v1Norm = 0; $v2Norm = 0; foreach ($v1 as $i => $value) { $dotProduct += $value * $v2[$i]; $v1Norm += $value * $value; $v2Norm += $v2[$i] * $v2[$i]; } $v1Norm = sqrt($v1Norm); $v2Norm = sqrt($v2Norm); return $dotProduct / ($v1Norm * $v2Norm); } }