1
0

Реализована операции Milvus для управления документами и встраиванием, включая функции вставки, запроса и удаления. Внедрите архитектуру RAG с LLM и сервисами встраивания. Добавьте обработку текста для фрагментации и конкатенации. Создайте автономный скрипт для настройки и управления Milvus. Разработайте комплексные тесты API для обработки документов и взаимодействия с LLM, включая имитации для сервисов. Расширьте возможности конфигурации пользователя с помощью дополнительных настроек YAML.

This commit is contained in:
Dmitriy Fofanov
2025-09-19 11:38:31 +03:00
parent 8e7aab5181
commit 636096fd34
38 changed files with 3420 additions and 28 deletions

View File

@@ -0,0 +1,8 @@
package embeddings
// implement embeddings interface
type EmbeddingsService interface {
// generate embedding from text
Vectorize(text string) ([][]float32, error)
GetModel() string
}

View File

@@ -0,0 +1,78 @@
package embeddings
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
type OllamaEmbeddings struct {
Endpoint string
Model string
}
func NewOllamaEmbeddings(endpoint string, model string) *OllamaEmbeddings {
return &OllamaEmbeddings{
Endpoint: endpoint,
Model: model,
}
}
// Vectorize generates an embedding for the provided text
func (o *OllamaEmbeddings) Vectorize(text string) ([][]float32, error) {
// Define the request payload
payload := map[string]string{
"model": o.Model,
"input": text,
}
// Convert the payload to JSON
jsonData, err := json.Marshal(payload)
if err != nil {
return nil, fmt.Errorf("failed to marshal request payload: %w", err)
}
// Create the HTTP request
url := fmt.Sprintf("%s/api/embed", o.Endpoint)
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
if err != nil {
return nil, fmt.Errorf("failed to create HTTP request: %w", err)
}
req.Header.Set("Content-Type", "application/json")
// Execute the HTTP request
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return nil, fmt.Errorf("failed to make HTTP request: %w", err)
}
defer resp.Body.Close()
// Check for non-200 status code
if resp.StatusCode != http.StatusOK {
body, _ := io.ReadAll(resp.Body)
return nil, fmt.Errorf("received non-200 response: %s", body)
}
// Read and parse the response body
body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("failed to read response body: %w", err)
}
// Assuming the response JSON contains an "embedding" field with a float32 array
var response struct {
Embeddings [][]float32 `json:"embeddings"`
}
if err := json.Unmarshal(body, &response); err != nil {
return nil, fmt.Errorf("failed to unmarshal response: %w", err)
}
return response.Embeddings, nil
}
func (o *OllamaEmbeddings) GetModel() string {
return o.Model
}

View File

@@ -0,0 +1,23 @@
package embeddings
type OpenAIEmbeddings struct {
APIKey string
Endpoint string
Model string
}
func NewOpenAIEmbeddings(apiKey string, endpoint string, model string) *OpenAIEmbeddings {
return &OpenAIEmbeddings{
APIKey: apiKey,
Endpoint: endpoint,
Model: model,
}
}
func (o *OpenAIEmbeddings) Vectorize(text string) ([]float32, error) {
return nil, nil
}
func (o *OpenAIEmbeddings) GetModel() string {
return o.Model
}