Fluxo de trabalho de orientação ambulatorial autônomo (chatflow) na Dify

Tutoriais práticos de IAAtualizado há 6 meses Sharenet.ai
1.1K 0
Trae

Observação: este artigo usa o Dify v0.7.2.

Esse fluxo de bate-papo mostra como criar um chatbot para orientação ambulatorial que pode coletar dados do paciente por meio de diálogo na Web ou por voz. Em termos simples, isso significa que o paciente recebe uma recomendação para um departamento com base nas informações do paciente (idade, sexo e sintomas).

I. Pensamento de fluxo de trabalho

1. captura de tela do fluxo de trabalho

Captura de tela do fluxo de trabalho completo da orientação ambulatorial, mostrada abaixo:

Dify中自带的门诊导诊工作流(chatflow)

2. pseudofluxograma do fluxo de trabalho

O objetivo do fluxo de trabalho de orientação ambulatorial é recomendar um departamento a um paciente com base na entrada de idade, gênero e sintomas do paciente. Na primeira rodada de diálogo, como o paciente pode inserir todas as informações ou parte delas de uma só vez, o nó "Parameter Extractor" é usado para extrair o gênero, o sintoma e a idade da primeira entrada do paciente. A variável de diálogo is_first_message é definida como 0 pelo nó "Variable Assignment" (Atribuição de variável).

3. problemas 1

Durante as rodadas subsequentes de diálogo, apenas um tipo de informação de campo é reconhecido por vez, embora o paciente possa fornecer vários campos, com os campos reconhecidos na ordem de idade, sexo e sintomas.

Dify中自带的门诊导诊工作流(chatflow)

4. problemas 2

Se um departamento já tiver sido recomendado com base nas informações do paciente, a inserção de qualquer informação novamente recomendará o último departamento. Como o campo de departamento não está vazio, o processo de resposta direta é seguido.

Dify中自带的门诊导诊工作流(chatflow)

II. Variáveis da sessão

A variável de sessão é usada para armazenar informações contextuais necessárias ao LLM, como preferências do usuário, histórico de diálogos etc. Ela é de leitura e gravação. As variáveis de sessão são orientadas para cenários de diálogo de várias rodadas, portanto, as variáveis de sessão só estão disponíveis para aplicativos do tipo Chatflow (Chat Assistant -> Workflow Orchestration).

1.variável de sessãotipo de dados

(1) Cordas

(2) Número

(3) Objeto

(4) Array[string] array de strings

(5) Array[number] Array de números

(6) Array[object] Array de objetos

2.variável de sessãocaracterização

(1) As variáveis de sessão podem ser referenciadas globalmente na maioria dos nós;

(2) A gravação de variáveis de sessão requer o uso da funçãoatribuição de variáveisNós;

(3) As variáveis de sessão são de leitura e gravação.

3. variáveis de sessão definidas nesse fluxo de trabalho

As cinco variáveis de sessão definidas para esse fluxo de trabalho são: se é a primeira rodada de diálogo, idade, gênero, sintomas e departamento.

Dify中自带的门诊导诊工作流(chatflow)

III. Interfaces relacionadas ao fluxo de trabalho

1. obter a interface para o fluxo de trabalho

(1) Localização do código-fonte

  • Localização do código-fonte: dedify-0.7.2\api\controllers\console\app\workflow.py
  • Localização do código-fonte: dedify-0.7.2\api\services\workflow_service.py

(2) Obtenção de operações de fluxo de trabalho

http://localhost:5001/console/api/apps/3c309371-54f6-4bfb-894a-4193b189ffa5/workflows/draft. onde rascunho, como rascunho, indica depuração na página de fluxo de trabalho.

Dify中自带的门诊导诊工作流(chatflow)

(3) Aquisição de implementações de fluxo de trabalho

O fluxo de trabalho armazena um registro na tabela de dados de fluxos de trabalho. A versão agora é rascunho e toda vez que um fluxo de trabalho é publicado, um registro é inserido nessa tabela. Como mostrado abaixo:

Dify中自带的门诊导诊工作流(chatflow)

(4) Estrutura de dados do fluxo de trabalho

A estrutura de dados do fluxo de trabalho retornada pela interface é mostrada abaixo:

class Workflow(db.Model):
__tablename__ = 'workflows'
__table_args__ = (
db.PrimaryKeyConstraint('id', name='workflow_pkey'),
db.Index('workflow_version_idx', 'tenant_id', 'app_id', 'version'),
)
id: Mapped[str] = db.Column(StringUUID, server_default=db.text('uuid_generate_v4()'))
tenant_id: Mapped[str] = db.Column(StringUUID, nullable=False)
app_id: Mapped[str] = db.Column(StringUUID, nullable=False)
type: Mapped[str] = db.Column(db.String(255), nullable=False)
version: Mapped[str] = db.Column(db.String(255), nullable=False)
graph: Mapped[str] = db.Column(db.Text)
features: Mapped[str] = db.Column(db.Text)
created_by: Mapped[str] = db.Column(StringUUID, nullable=False)
created_at: Mapped[datetime] = db.Column(db.DateTime, nullable=False, server_default=db.text('CURRENT_TIMESTAMP(0)'))
updated_by: Mapped[str] = db.Column(StringUUID)
updated_at: Mapped[datetime] = db.Column(db.DateTime)
_environment_variables: Mapped[str] = db.Column('environment_variables', db.Text, nullable=False, server_default='{}')
_conversation_variables: Mapped[str] = db.Column('conversation_variables', db.Text, nullable=False, server_default='{}')

2. atualizar as interfaces de fluxo de trabalho

(1) Localização do código-fonte

  • Localização da fonte: dedify-0.7.2\web\app\componentes\workflow\hooks\use-nodes-sync-draft.ts
  • Localização do código-fonte: dedify-0.7.2\web\service\workflow.ts

(2) Atualizar as operações de fluxo de trabalho

http://localhost:5001/console/api/apps/3c309371-54f6-4bfb-894a-4193b189ffa5/workflows/draft.

Dify中自带的门诊导诊工作流(chatflow)

(3) Atualizar o código de front-end do fluxo de trabalho

Devido à estrutura React Flow usada no front-end do fluxo de trabalho do Dify, especula-se que as operações POST, como adicionar, excluir e alterar, podem ser executadas quando o fluxo de trabalho é alterado. Por meio dos registros no Console do back-end, verificou-se que a chamada para a funçãoworkflows/draft?_token=::

Dify中自带的门诊导诊工作流(chatflow)

aprovar (um projeto de lei ou inspeção etc.)workflows/draft?_token=Ao pesquisar o código de front-end, encontrei apenas um local para usá-lo, que deve ser aqui.

Dify中自带的门诊导诊工作流(chatflow)

Como a operação POST é executada, deve haver um parâmetro Payload, certo, e o parâmetro de fluxo de trabalho é encontrado nesse arquivo.

Dify中自带的门诊导诊工作流(chatflow)

Quando a dependênciagetPostParamsQuando ocorre uma alteração, ela é executada de forma assíncronasyncWorkflowDraft(postParams).

Dify中自带的门诊导诊工作流(chatflow)

(indica relação causal)syncWorkflowDraft(postParams)A chamada real é POST, conforme mostrado abaixo:

Dify中自带的门诊导诊工作流(chatflow)

(4) Resumo das funções de fluxo de trabalho

direitodify-0.7.2\web\service\workflow.tsAs funções estão resumidas a seguir:

número de sérienome da funçãofunção função funçãoParâmetros e explicações
1fetchWorkflowDraftObtenha o rascunho do fluxo de trabalho.urlURL da solicitação: String, o URL da solicitação.
2syncWorkflowDraftSincronizar rascunhos de fluxo de trabalho.urlURL da solicitação: String, o URL da solicitação.paramsObjeto: os parâmetros da solicitação, contendo o graphefeatureseenvironment_variables responder cantando conversation_variables.
3fetchNodesDefaultConfigsObter a configuração padrão do nó.urlURL da solicitação: String, o URL da solicitação.
4fetchWorkflowRunHistoryObter histórico de execução do fluxo de trabalho.urlURL da solicitação: String, o URL da solicitação.
5fetcChatRunHistoryObter histórico de execução do bate-papo.urlURL da solicitação: String, o URL da solicitação.
6singleNodeRunExecutar um único nó.appIdID do aplicativo: String, ID do aplicativo.nodeIdID do nó: String, a ID do nó.paramsObjeto: Objeto, parâmetros da solicitação.
7getIterationSingleNodeRunUrlObtém o URL da execução da iteração para um único nó.isChatFlowValor booleano que indica se é ou não um fluxo de bate-papo.appIdID do aplicativo: String, ID do aplicativo.nodeIdID do nó: String, a ID do nó.
8publishWorkflowPublique um fluxo de trabalho.urlURL da solicitação: String, o URL da solicitação.
9fetchPublishedWorkflowObter fluxos de trabalho publicados.urlURL da solicitação: String, o URL da solicitação.
10stopWorkflowRunInterromper a execução do fluxo de trabalho.urlURL da solicitação: String, o URL da solicitação.
11fetchNodeDefaultObter a configuração padrão do nó.appIdID do aplicativo: String, ID do aplicativo.blockTypeTipo de nó: Valor de enumeração, tipo de nó.queryObjeto, opcional, parâmetro de consulta.
12updateWorkflowDraftFromDSLAtualizar rascunhos de fluxo de trabalho do DSL.appIdID do aplicativo: String, ID do aplicativo.dataDados DSL: String, dados DSL.
13fetchCurrentValueOfConversationVariableObtém o valor atual da variável de sessão.urlURL da solicitação: String, o URL da solicitação.paramsObjeto: os parâmetros da solicitação, contendo o conversation_id.

3. implementação do fluxo de trabalho

Referência aoImplementação do processo de operações de criação, atualização, execução e exclusão do ChatflowA seção "Implementação do Chatflow" em [6].

4. publicação do fluxo de trabalho

(1) Localização do código-fonte

  • Localização do código-fonte: dedify-0.7.2\api\controllers\console\app\workflow.py
  • Localização do código-fonte: dedify-0.7.2\api\services\workflow_service.py
  • Local de origem: dedify-0.7.2\api\events\event_handlers\update_app_dataset_join_when_app_published_workflow_updated.py

(2) Interface de publicação do fluxo de trabalho

Isso é executado quando você clica em Publicar fluxo de trabalhohttp://localhost:5001/console/api/apps/3c309371-54f6-4bfb-894a-4193b189ffa5/workflows/publishInterface.

Dify中自带的门诊导诊工作流(chatflow)

Ele consiste principalmente na criação de um novo fluxo de trabalho e no acionamento do evento de fluxo de trabalho do aplicativo. Como mostrado abaixo:

Dify中自带的门诊导诊工作流(chatflow)

(3) Criação de um novo registro de fluxo de trabalho

Isso consiste principalmente na criação de um novo registro de fluxo de trabalho em que o conteúdo do campo de versão é 2024-09-07 09:11:25.894535. indicando que o fluxo de trabalho foi publicado, e não rascunho (o fluxo de trabalho não foi publicado e ainda está sendo depurado na tela de fluxo de trabalho). Como mostrado abaixo:

Dify中自带的门诊导诊工作流(chatflow)

(4) Implementação do evento app_published_workflow_was_updated

@app_published_workflow_was_updated.connect
def handle(sender, **kwargs):
app = sender
published_workflow = kwargs.get("published_workflow")
published_workflow = cast(Workflow, published_workflow)
dataset_ids = get_dataset_ids_from_workflow(published_workflow)  # 从工作流中获取数据集ID
app_dataset_joins = db.session.query(AppDatasetJoin).filter(AppDatasetJoin.app_id == app.id).all()  # 获取应用数据集关联
removed_dataset_ids = []  # 用于存储移除的数据集ID
if not app_dataset_joins:  # 如果没有应用数据集关联
added_dataset_ids = dataset_ids  # 添加数据集ID
else:  # 如果有应用数据集关联
old_dataset_ids = set()  # 用于存储旧的数据集ID
for app_dataset_join in app_dataset_joins:  # 遍历应用数据集关联
old_dataset_ids.add(app_dataset_join.dataset_id)  # 添加数据集ID
added_dataset_ids = dataset_ids - old_dataset_ids  # 添加数据集ID
removed_dataset_ids = old_dataset_ids - dataset_ids  # 移除数据集ID
if removed_dataset_ids:  # 如果有移除的数据集ID
for dataset_id in removed_dataset_ids:  # 遍历移除的数据集ID
db.session.query(AppDatasetJoin).filter(
AppDatasetJoin.app_id == app.id, AppDatasetJoin.dataset_id == dataset_id
).delete()  # 删除应用数据集关联
if added_dataset_ids:  # 如果有添加的数据集ID
for dataset_id in added_dataset_ids:  # 遍历添加的数据集ID
app_dataset_join = AppDatasetJoin(app_id=app.id, dataset_id=dataset_id)  # 创建应用数据集关联
db.session.add(app_dataset_join)  # 添加应用数据集关联
db.session.commit()  # 提交事务

A função desse código é lidar com o app_published_workflow_was_updated Sinal para atualizar o relacionamento de associação entre um aplicativo e um conjunto de dados quando o fluxo de trabalho publicado para esse aplicativo for atualizado. As etapas específicas são as seguintes:

  • Obter o objeto do aplicativo que envia o sinal app e objetos de fluxo de trabalho atualizados published_workflow.
  • invocações get_dataset_ids_from_workflow função que extrai a coleção de IDs de conjunto de dados do fluxo de trabalho atualizado dataset_ids.
  • Consultar o banco de dados para obter todas as informações do aplicativo atual AppDatasetJoin Registros.
  • Calcula os IDs do conjunto de dados a serem adicionados e excluídos:
    • Se não houver nenhum AppDatasetJoin todos os IDs de conjuntos de dados extraídos precisam ser adicionados.
    • Caso contrário, calcule os IDs do conjunto de dados a serem adicionados e excluídos.
  • Eliminação da necessidade de remover AppDatasetJoin Registros.
  • Adicionar novo AppDatasetJoin Registros.
  • Enviar uma transação de banco de dados.

(5) Função da tabela AppDatasetJoin

A tabela AppDatasetJoin serve para manter um relacionamento de muitos para muitos entre um aplicativo (App) e um conjunto de dados (Dataset). Cada registro representa a associação de um aplicativo com um conjunto de dados. Os campos específicos são os seguintes:

  • id: chave primária, identifica de forma exclusiva um registro.
  • app_id: o identificador exclusivo do aplicativo.
  • dataset_id: Identificador exclusivo do conjunto de dados.
  • created_at: o registro de data e hora da criação do registro.
  • Com essa tabela, é possível consultar quais conjuntos de dados estão associados a um determinado aplicativo ou a quais aplicativos um determinado conjunto de dados está associado.

(6) Implementação de get_dataset_ids_from_workflow()

def get_dataset_ids_from_workflow(published_workflow: Workflow) -> set:  # 从工作流中获取数据集ID
dataset_ids = set()  # 用于存储数据集ID
graph = published_workflow.graph_dict  # 获取工作流图
if not graph:  # 如果没有图
return dataset_ids  # 返回空集合
nodes = graph.get("nodes", [])  # 获取图中的节点
# fetch all knowledge retrieval nodes  # 获取所有知识检索节点
knowledge_retrieval_nodes = [
node for node in nodes if node.get("data", {}).get("type") == NodeType.KNOWLEDGE_RETRIEVAL.value
]  # 获取所有知识检索节点
if not knowledge_retrieval_nodes:  # 如果没有知识检索节点
return dataset_ids  # 返回空集合
for node in knowledge_retrieval_nodes:  # 遍历知识检索节点
try:
node_data = KnowledgeRetrievalNodeData(**node.get("data", {}))  # 获取节点数据
dataset_ids.update(node_data.dataset_ids)  # 更新数据集ID
except Exception as e:  # 如果出现异常
continue
return dataset_ids

A principal função da função get_dataset_ids_from_workflow é extrair os IDs de conjuntos de dados relevantes de todos os nós de recuperação de conhecimento de um determinado objeto de fluxo de trabalho:

  • Inicialize uma coleção dataset_ids vazia para armazenar IDs de conjuntos de dados.
  • Obtém a estrutura do gráfico do fluxo de trabalho.
  • Retorna a coleção dataset_ids vazia se a estrutura do gráfico estiver vazia.
  • Obtém todos os nós do gráfico.
  • Filtrar todos os nós do tipo KNOWLEDGE_RETRIEVAL knowledge_retrieval knowledge_retrieval_nodes.
  • Iterar sobre esses nós de recuperação de conhecimento, extrair seus IDs de conjunto de dados e atualizá-los na coleção dataset_ids.
  • Retorna uma coleção de todos os IDs de conjuntos de dados extraídos.

5. outras interfaces de fluxo de trabalho

Essa parte da interface não será elaborada, pois a API de aplicativo de conversação de orquestração de fluxo de trabalho foi descrita com muita clareza.

número de sérienome da interfacelink de interfaceExplicação das funções de interface
1Enviar uma mensagem de diálogoPOST /chat-messagesCrie mensagens de sessão que enviem entradas do usuário ou façam perguntas.
2Carregamento de arquivosPOST /files/uploadFaça upload de arquivos (no momento, apenas imagens são suportadas) para uso ao enviar mensagens.
3parar de responderPOST /chat-messages/:task_id/stopInterromper respostas de streaming (somente o modo de streaming é compatível).
4Feedback da mensagem (curtidas)POST /messages/:message_id/feedbacksFeedback do usuário e curtidas nas mensagens para facilitar a otimização do resultado.
5Obtenha uma lista de sugestões de perguntas para a próxima rodadaGET /messages/{message_id}/suggestedObtenha uma lista de sugestões de perguntas para a próxima rodada.
6Obter mensagens do histórico da sessãoGET /messagesObtenha o histórico dos registros de mensagens da sessão.
7Obter lista de sessõesGET /conversationsObtém uma lista das sessões do usuário atual.
8Exclusão de uma sessãoDELETE /conversations/:conversation_idExclui a sessão especificada.
9renomeação de sessõesPOST /conversations/:conversation_id/nameRenomear a sessão.
10conversão de voz em textoPOST /audio-to-textConverta arquivos de voz em texto.
11conversão de texto em falaPOST /text-to-audioConverta texto em fala.
12Obtenção de informações de configuração do aplicativoGET /parametersObter informações de configuração do aplicativo, como chaves de função, parâmetros de entrada, etc.
13Obtenção de metainformações do aplicativoGET /metaObtenha as informações Meta do aplicativo para obter o ícone da ferramenta.

bibliografia

[1] Variáveis de sessão: https://docs.dify.ai/v/zh-hans/guides/workflow/variables

[2] Atribuição de variável: https://docs.dify.ai/v/zh-hans/guides/workflow/node/variable-assignment

[3] Agregação de variáveis: https://docs.dify.ai/v/zh-hans/guides/workflow/node/variable-assigner

[4] Reagir Site em chinês do Flow: https://reactflow-cn.js.org/

[5] Site em inglês do React Flow: https://reactflow.dev/

[6] Implementação do processo das operações de criação, atualização, execução e exclusão do Chatflow: https://z0yrmerhgi8.feishu.cn/wiki/FFzxwdF4PijlhjkLUoecOv6Vn8a

© declaração de direitos autorais
AiPPT

Artigos relacionados

Sem comentários

nenhum
Nenhum comentário...