<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def update_instrument_offset(self, mount, new_offset: top_types.Point = None, from_tip_probe: top_types.Point = None):
 """ Update the instrument offset for a pipette on the specified mount. This will update both the stored value in the robot settings and the live value in the currently-loaded pipette. This can be specified either directly by using the new_offset arg or using the result of a previous call to :py:meth:`locate_tip_probe_center` with the same mount. :note: Z differences in the instrument offset cannot be disambiguated between differences in the position of the nozzle and differences in the length of the nozzle/tip interface (assuming that tips are of reasonably uniform length). For this reason, they are saved as adjustments to the nozzle interface length and only applied when a tip is present. """

        if from_tip_probe:
            new_offset = (top_types.Point(*self._config.tip_probe.center)
                          - from_tip_probe)
        elif not new_offset:
            raise ValueError(
                "Either from_tip_probe or new_offset must be specified")
        opt_pip = self._attached_instruments[mount]
        assert opt_pip, '{} has no pipette'.format(mount.name.lower())
        pip = opt_pip
        inst_offs = self._config.instrument_offset
        pip_type = 'multi' if pip.config.channels > 1 else 'single'
        inst_offs[mount.name.lower()][pip_type] = [new_offset.x,
                                                   new_offset.y,
                                                   new_offset.z]
        self.update_config(instrument_offset=inst_offs)
        pip.update_instrument_offset(new_offset)
        robot_configs.save_robot_settings(self._config)