Este artigo foi escrito e publicado em chinês e é uma versão traduzida original aqui.
Este artigo se aprofundará em como escrever código e executar comandos ao atribuir várias tarefas ao mesmo tempo.
contorno
O artigo anterior apresentou a rota técnica e os casos de implementação do MCP, e este artigo se aprofundará em como melhorar o caso em várias rodadas de cadeias de pensamento. Ainda tomando a parede como exemplo, desta vez não quero que os usuários participem da interação, tente deixar o computador completar o cálculo automaticamente. O requisito foi alterado de "Criar uma parede - > usuário seleciona uma parede - > Inserir portas e janelas em locais aleatórios" para: O LLM calcula automaticamente as coordenadas da parede e insere formas diferentes em cada parede. O conteúdo a seguir se concentrará na modificação imediata e no ajuste do código em várias rodadas de cadeia de pensamento.
O caso se desenrola
endereço
Github:https://github.com/imkcrevit/RevitMCP_Blog/tree/main
rápido
O código deste projeto não mudou muito, principalmente por otimizar o método de descrição para que o LLM possa entender e chamar com precisão a execução da ferramenta. O conteúdo a seguir apresenta principalmente o ajuste lógico ao modificar um caso simples para um formato de várias cadeias de pensamento.
Passos
- Primeiro, teste em MCP.Client, insira um parágrafo e veja se o LLM pode analisar várias ferramentas:
Crie um conjunto de paredes, a linha de posicionamento da parede deve ser um gráfico fechado e não inferior a três, o comprimento mínimo é de 10000 mm, a altura da parede é de 3000 por padrão e, em seguida, a janela é inserida na janela na posição aleatória da parede após a criação da parede, e as coordenadas da janela de cada parede são inconsistentes e o requisito não pode exceder a altura da parede.
Você pode ver que a saída é de duas ferramentas, provando que a descrição pode ser analisada corretamente pelo LLM e atribuída a diferentes ferramentas.
- Continuando o teste, o prompt acima não define claramente "um conjunto de paredes", fazendo com que o LLM o reconheça como uma parede, o que não corresponde às expectativas. Depois de alterar o prompt, nada menos que três restrições foram adicionadas. Veja a captura de tela abaixo:
Crie um conjunto de paredes, a linha de posicionamento da parede deve ser um gráfico fechado e não inferior a três, o comprimento mínimo é de 10000 mm, a altura da parede é de 3000 por padrão e, em seguida, insira a janela na posição aleatória da parede após criar a parede, e as coordenadas da janela de cada parede são inconsistentes e o requisito não pode exceder a altura da parede.
O LLM criou três conjuntos de paredes, provando que o anterior "um conjunto é igual a uma parede" foi causado por descrições imprecisas.
O LLM gera três conjuntos de paredes e as ferramentas se tornam uma lista de três itens.
Neste momento, nos deparamos com o problema de como inserir com precisão as portas e janelas na parede especificada e, como não podemos obter o ID da parede criado a tempo, só podemos substituí-lo por números.
- Como o ID não pode ser passado, essa é toda uma cadeia de pensamento que não envolve esperar a conclusão da criação ou a seleção do usuário. As opções são as seguintes:
- Adicione uniqueId com base no formato GUID como um identificador exclusivo e passe uma combinação de formulários como a base do host (este projeto adota esse esquema)
- Após cada criação, o ID do componente é retornado e substituído pela próxima Ferramenta de Ligação da Cadeia de Pensamento como fonte de dados.
Modifique o prompt para enfatizar a geração de um identificador exclusivo e passá-lo:
Crie um conjunto de paredes, a linha de posicionamento da parede deve ser um gráfico fechado e não inferior a três, e tem um identificador exclusivo, formato guid, tome-o como ID, o comprimento mínimo é 10000mm, a altura da parede é 3000 por padrão e, em seguida, insira a janela na posição aleatória da parede depois de criar a parede, as coordenadas da janela de cada parede são inconsistentes e o requisito não pode exceder a altura da parede, entenda com precisão minha intenção e divida-a para chamar a função por sua vez na ordem correspondente
No momento, o eId nos dados gerados não foi alterado, indicando que o LLM não entende a intenção. Você precisa alterar a descrição da ferramenta no servidor e ajustar as configurações do sistema para que ele saiba que o identificador exclusivo está no formato GUID.
No lado do servidor, modifique a descrição Create para que o LLM passe claramente o UniqueId ao percorrer a ferramenta:
[McpServerTool(Name = "CreateWall"),
Description("Generation Paramaters That Can Create Wall in Revit ,
If User Want To Generation eId ,
You Need To Generation a unique id base this :0B7FB9A8-DAD8-48CE-9D41-5EDB63832BD2 ")]
O lado do sistema também enfatiza a definição de um identificador exclusivo:
"""you are a professional enginer in BIM ,
so you can select the greate tool to user ,
also has a good develop tech in code ,
and generation a standard input style And Arguments to tools ,
also if some question need unique id you will generate a unique eId in this talk ,
the example :0B7FB9A8-DAD8-48CE-9D41-5EDB63832BD2"""
O resultado final da saída ainda é eId = 2, porque o formato do parâmetro de entrada do método é int, e o LLM produzirá uniqueId como formato int com base em parâmetros, e o tipo de parâmetro do método precisa ser modificado:
public string RevitCreateWallTool(string command, double x, double y, double z, double x1, double y2, string uniqueId) {
return $@" {{
""command"": ""CreateWall"",
""arguments"": {{ ""start"": [{x}, {y}, {z}],
""end"": [{x1}, {y2}, {z}], ""eId"": ""{uniqueId}"" }} }}";
}
Teste novamente a instrução de entrada e descubra que o ID foi atribuído com precisão, mas a parede gerada pelo LLM não está fechada, resultando em dados anormais. Os LLMs ainda não estão maduros em desempenho 2D e não podem simular gráficos 2D ou 3D como os humanos. Você pode adicionar uma descrição detalhada à entrada.
- Foram adicionadas restrições de definição de fechamento (interseção de ponta a ponta) e o resultado atendeu aos requisitos.
- A correspondência entre a forma e a parede é adicionada, e a linguagem matemática e os pontos de projeção de coordenadas estão no segmento da linha da parede para garantir um cálculo preciso.
- O prompt otimizado é o seguinte:
Uma parede corresponde a uma janela e possui um identificador identificador exclusivo no formato de: eId = 0B7FB9A8-DAD8-48CE-9D41-5EDB63832BD2, os dados são gerados estritamente de acordo com este formato e não podem ser repetidos, crie um grupo de paredes, a linha de posicionamento da parede deve ser uma figura fechada, as linhas de coordenadas são conectadas entre si em linha reta, a primeira é consistente com a última e não inferior a três, o comprimento mínimo é de 10000 mm e a altura da parede é de 3000 por padrão, Depois de criar a parede, a janela é inserida na janela na posição aleatória da parede, o ponto de posicionamento da janela deve estar na linha de posicionamento da parede gerada, a fórmula de cálculo é: o ponto de projeção do formulário deve estar no segmento de linha conectado pelo final da parede, cada parede corresponde a uma janela, precisa ser calculada separadamente, as coordenadas da janela de cada parede são inconsistentes, o requisito não pode exceder a altura da parede, entender com precisão minha intenção e calcular em estrita conformidade com os requisitos e dividir a função sucessivamente de acordo com a ordem correspondente
Exemplo de saída:
Sample output:
[
{
"command": "CreateWall",
"arguments": {
"start": [0, 0, 0],
"end": [10000, 0, 0],
"eId": "0B7FB9A8-DAD8-48CE-9D41-5EDB63832BD2"
}
},
{
"command": "CreateWall",
"arguments": {
"start": [10000, 0, 0],
"end": [10000, 10000, 0],
"eId": "1A2B3C4D-5E6F-7G8H-9I10-11K12L13M14N"
}
},
{
"command": "CreateWall",
"arguments": {
"start": [10000, 10000, 0],
"end": [0, 10000, 0],
"eId": "15O16P17Q-18R19S-20T21U-22V23W-24X25Y26Z"
}
},
{
"command": "CreateWall",
"arguments": {
"start": [0, 10000, 0],
"end": [0, 0, 0],
"eId": "27A28B29C-30D31E-32F33G-34H35I-36J37K38L"
}
},
{
"command": "InsertWindowInWall",
"arguments": {
"eId" : "0B7FB9A8-DAD8-48CE-9D41-5EDB63832BD2",
"location": [5000,0,1500]
}
},
{
"command": "InsertWindowInWall",
"arguments": {
"eId" : "1A2B3C4D-5E6F-7G8H-9I10-11K12L13M14N",
"location": [10000,5000,1500]
}
},
{
"command": "InsertWindowInWall",
"arguments": {
"eId" : "15O16P17Q-18R19S-20T21U-22V23W-24X25Y26Z",
"location": [5000,10000,1500]
}
},
{
"command": "InsertWindowInWall",
"arguments": {
"eId" : "27A28B29C-30D31E-32F33G-34H35I-36J37K38L",
"location": [0,5000,1500]
}
}
]
efeito
resumo
Quando o número de paredes aumenta para cinco, há um erro, e ele só é definido de ponta a ponta, e o LLM ainda é insuficiente no processamento de dados 2D. Os LLMs têm desempenho limitado em tais cenários que precisam ser criados continuamente no Revit, especialmente quando envolvem relações espaciais 2D/3D. A precisão pode ser melhorada otimizando prompts, e os LLMs podem ter um desempenho melhor após a otimização no futuro. Os exemplos mostram que a revisão lógica pode ser usada para obter mais aplicativos por meio do MCP, como determinar várias condições de especificação e criar identidades. O código foi sincronizado com o GitHub. Bem-vindo ao download e à expansão. O artigo prova principalmente a viabilidade técnica, e o aplicativo específico precisa ser combinado com o trabalho real.
Este artigo foi escrito e publicado em chinês e é uma versão traduzida original aqui.
Você deve ser um usuário registrado para adicionar um comentário aqui. Se você já estiver registrado, faça logon. Se você ainda não estiver registrado, registre-se e faça logon.