Guias
Modelo
Integração de Modelos Customizados
12min
introdução após concluir a integração do fornecedor, o próximo passo é integrar os modelos sob o fornecedor para ajudar a entender todo o processo de integração, usaremos o xinference como exemplo para completar gradualmente uma integração completa de fornecedor é importante notar que, para modelos customizados, cada integração de modelo requer uma credencial completa do fornecedor diferente dos modelos predefinidos, a integração de fornecedores customizados sempre terá os seguintes dois parâmetros, que não precisam ser definidos no arquivo yaml do fornecedor na seção anterior, aprendemos que os fornecedores não precisam implementar validate provider credential o runtime chamará automaticamente a validate credentials da camada do modelo correspondente, com base no tipo e nome do modelo selecionado pelo usuário para validação escrevendo o yaml do fornecedor primeiro, precisamos determinar quais tipos de modelos o fornecedor suporta atualmente, os tipos de modelos suportados são os seguintes llm modelo de geração de texto text embedding modelo de embedding de texto rerank modelo de reclassificação speech2text fala para texto tts texto para fala moderation moderação o xinference suporta llm , text embedding e rerank , então começaremos a escrever o xinference yaml provider xinference # especifica o identificador do fornecedor label # nome de exibição do fornecedor, pode ser definido em en us (inglês) en us xorbits inference icon small # ícone pequeno, referencie os ícones de outros fornecedores, armazenados no diretório assets sob o diretório de implementação correspondente ao fornecedor a estratégia de idioma é a mesma do label en us icon s en svg icon large # ícone grande en us icon l en svg help # ajuda title en us how to deploy xinference url en us https //github com/xorbitsai/inference supported model types # tipos de modelos suportados xinference suporta llm/text embedding/rerank \ llm \ text embedding \ rerank configurate methods # como o xinference é um fornecedor implementado localmente e não possui modelos predefinidos, você precisa implantar os modelos necessários de acordo com a documentação do xinference portanto, apenas modelos customizados são suportados aqui \ customizable model provider credential schema credential form schemas em seguida, precisamos considerar quais credenciais são necessárias para definir um modelo no xinference ele suporta três tipos diferentes de modelos, então precisamos de model type para especificar o tipo do modelo são três tipos, então escreveremos da seguinte forma provider credential schema credential form schemas \ variable model type type select label en us model type required true options \ value text generation label en us language model \ value embeddings label en us text embedding \ value reranking label en us rerank cada modelo tem seu próprio nome model name , então precisamos defini lo aqui \ variable model name type text input label en us model name required true placeholder en us input model name forneça o endereço para a implantação local do xinference \ variable server url label en us server url type text input required true placeholder en us enter the url of your xinference, for example https //example com/xxx cada modelo tem um model uid único, então precisamos defini lo aqui \ variable model uid label en us model uid type text input required true placeholder en us enter the model uid agora, completamos a definição básica do fornecedor escrevendo o código do modelo em seguida, tomaremos o tipo llm como exemplo e escreveremos xinference llm llm py no llm py , crie uma classe xinferencellm , que chamaremos de xinferenceailargelanguagemodel (nome arbitrário), herdando da classe base base large language model largelanguagemodel implemente os seguintes métodos invocação do llm implemente o método principal para invocação do llm, que pode suportar retornos em streaming e síncronos def invoke(self, model str, credentials dict, prompt messages list\[promptmessage], model parameters dict, tools optional\[list\[promptmessagetool]] = none, stop optional\[list\[str]] = none, stream bool = true, user optional\[str] = none) \\ > union\[llmresult, generator] """ invocar o modelo de linguagem grande \ param model nome do modelo \ param credentials credenciais do modelo \ param prompt messages mensagens de prompt \ param model parameters parâmetros do modelo \ param tools ferramentas para chamada de ferramentas \ param stop palavras de parada \ param stream resposta em streaming \ param user id único do usuário \ return resposta completa ou gerador de resposta em streaming """ ao implementar, observe que você precisa usar duas funções para retornar dados, uma para lidar com retornos síncronos e outra para retornos em streaming isso ocorre porque o python identifica funções que contêm a palavra chave yield como funções geradoras, e o tipo de dado retornado é fixado como generator portanto, os retornos síncronos e em streaming precisam ser implementados separadamente, conforme mostrado abaixo (observe que o exemplo usa parâmetros simplificados; a implementação real deve seguir a lista de parâmetros acima) def invoke(self, stream bool, kwargs) \\ > union\[llmresult, generator] if stream return self handle stream response( kwargs) return self handle sync response( kwargs) def handle stream response(self, kwargs) > generator for chunk in response yield chunk def handle sync response(self, kwargs) > llmresult return llmresult( response) pré cálculo de tokens de entrada se o modelo não fornecer uma interface de pré cálculo de tokens, pode retornar diretamente 0 def get num tokens(self, model str, credentials dict, prompt messages list\[promptmessage], tools optional\[list\[promptmessagetool]] = none) > int """ obter o número de tokens para as mensagens de prompt fornecidas \ param model nome do modelo \ param credentials credenciais do modelo \ param prompt messages mensagens de prompt \ param tools ferramentas para chamada de ferramentas \ return """ às vezes, você pode não querer retornar diretamente 0, então pode usar self get num tokens by gpt2(text str) para obter tokens pré calculados este método está localizado na classe base aimodel e usa o tokenizer do gpt2 para cálculo no entanto, só pode ser usado como um método alternativo e não é completamente preciso validação das credenciais do modelo semelhante à validação das credenciais do fornecedor, isso é para validar credenciais individuais do modelo def validate credentials(self, model str, credentials dict) > none """ validar as credenciais do modelo \ param model nome do modelo \ param credentials credenciais do modelo \ return """ esquema de parâmetros do modelo diferente dos tipos customizados, como os parâmetros suportados por um modelo não são definidos no arquivo yaml, precisamos gerar dinamicamente o esquema de parâmetros do modelo por exemplo, o xinference suporta os parâmetros max tokens , temperature e top p no entanto, alguns fornecedores suportam diferentes parâmetros dependendo do modelo por exemplo, o fornecedor openllm suporta top k , mas nem todos os modelos fornecidos por este fornecedor suportam top k aqui, ilustramos que o modelo a suporta top k , enquanto o modelo b não portanto, precisamos gerar dinamicamente o esquema de parâmetros do modelo, conforme mostrado abaixo def get customizable model schema(self, model str, credentials dict) > aimodelentity | none """ usado para definir o esquema de modelo customizável """ rules = \[ parameterrule( name='temperature', type=parametertype float, use template='temperature', label=i18nobject( en us='temperature' ) ), parameterrule( name='top p', type=parametertype float, use template='top p', label=i18nobject( en us='top p' ) ), parameterrule( name='max tokens', type=parametertype int, use template='max tokens', min=1, default=512, label=i18nobject( en us='max tokens' ) ) ] \# se o modelo for a, adicione top k às regras if model == 'a' rules append( parameterrule( name='top k', type=parametertype int, use template='top k', min=1, default=50, label=i18nobject( en us='top k' ) ) ) """ algum código não importante aqui """ entity = aimodelentity( model=model, label=i18nobject( en us=model ), fetch from=fetchfrom customizable model, model type=model type, model properties={ modelpropertykey mode modeltype llm, }, parameter rules=rules ) return entity tabela de mapeamento de erros de invocação quando ocorre um erro de invocação do modelo, ele precisa ser mapeado para o tipo invokeerror especificado pelo runtime, para facilitar o processamento subsequente da paragraph para diferentes erros erros de runtime invokeconnectionerror erro de conexão na invocação invokeserverunavailableerror servidor de invocação indisponível invokeratelimiterror limite de taxa de invocação atingido invokeauthorizationerror falha na autorização da invocação invokebadrequesterror erro de parâmetro na invocação @property def invoke error mapping(self) > dict\[type\[invokeerror], list\[type\[exception]]] """ mapear erro de invocação do modelo para erro unificado a chave é o tipo de erro lançado para o chamador o valor é o tipo de erro lançado pelo modelo, que precisa ser convertido em um tipo de erro unificado para o chamador \ return mapeamento de erros de invocação """ para uma explicação dos métodos de interface, consulte \[interfaces] para implementações específicas, consulte llm py