You could try recording the position of the player every unit of time, and then tell the NPC to move to that position. Also, to prevent the npc from trying to push the player around while the player is standing still, I also suggest implementing a magnitude check to see whether the NPC is far enough from the player before it starts moving.
Something like this:
local playerPos = torsoPart.Position
while true do
wait(timeUnit)
if (npc.Torso.Position - playerPos.Position).magnitude > distance then
npc.Humanoid:MoveTo(playerPos)
playerPos = torsoPart.Position
end
end