轩辕十四

探索科技与创新的个人博客

前两篇我分别在讲两件事:第一,Prompt 不是聊天技巧,而是结构化输入设计;第二,想让模型真正接进系统,就必须让输出更稳定。但继续往下学,很快会遇到第三个问题:如果目标不只是“答得差不多”,而是“行为边界清楚、输出结构稳定、结果能被程序消费”,Prompt 应该怎么继续往前走?

这也是我学习 system prompt、角色结构、Function Calling(工具调用)和 JSON Schema 之后最大的认知变化:到了这一步,Prompt 已经越来越不像“提问方式”,而更像一层写给模型看的接口定义

阅读全文 »

上一篇我主要在讲一件事:Prompt 不是聊天技巧,而是结构化输入设计。这个视角解决了“怎么把任务说清楚”的问题,但真正把模型接进系统后,很快就会遇到第二个问题:明明已经说清楚了,输出为什么还是不稳定?

这也是我在继续学习 Prompt 稳定性这部分内容时最有感的一点。很多 Prompt 不是不能用,而是只能“偶尔答对”。对于 AI 应用工程来说,这种状态其实离可上线还很远。你真正需要的,不是某一次回答惊艳,而是同类输入下,模型能持续给出同类结果。

阅读全文 »

如果把大语言模型当成一个聊天对象,Prompt 很容易学偏:你会把注意力放在“怎么说更像咒语”,而不是“怎么让结果更稳定、更可控”。但如果你的目标是成为一名 AI 应用开发工程师,那么 Prompt 更像是一种接口设计能力,甚至可以把它理解成一种写给模型看的接口协议

这篇文章聚焦 Prompt 最基础的一层:模型设置、基本概念、提示词要素、通用技巧,以及它们为什么共同指向一件事——Prompt 不是提问技巧,而是结构化表达能力。

阅读全文 »

前言

队列(Queue)是一种遵循先进先出(FIFO,First In First Out)原则的线性数据结构。在 iOS 开发中,我们经常需要使用队列来处理各种场景,比如:任务调度、消息队列、事件处理等。

在上一篇文章《数据结构:循环数组详解》中,我们详细介绍了循环数组的原理。本文将基于实际项目中的代码,深入对比循环数组实现的队列链表实现的队列这两种方案,帮助你在实际开发中做出正确的选择。

阅读全文 »

什么是 MMap

MMap(Memory Mapping)是一种内存映射技术,它允许将文件或其他对象映射到进程的地址空间。在 iOS 开发中,mmap 是一个强大的系统调用,能够将磁盘文件的内容直接映射到内存地址空间,使得对文件的读写操作可以像访问内存一样简单高效。

与传统的文件 I/O(通过 read()/write() 系统调用)不同,mmap 通过虚拟内存机制,让应用程序可以像访问数组一样访问文件内容,操作系统会自动处理磁盘和内存之间的数据传输。

核心特点

  • 零拷贝:数据不需要在用户空间和内核空间之间复制
  • 延迟加载:只有真正访问数据时才从磁盘加载(页面调度)
  • 共享内存:多个进程可以映射同一文件实现进程间通信
  • 高效访问:随机访问文件时性能更优
阅读全文 »

什么是循环数组

循环数组(Circular Array),也称为环形数组或环形缓冲区(Ring Buffer),是一种特殊的数组结构。它在逻辑上将数组的首尾相连,形成一个环形结构。当数组索引到达末尾时,会自动回到数组的开头,实现循环访问。

循环数组的核心思想是:通过取模运算,让索引在固定范围内循环

为什么需要循环数组?

在传统的线性数组中,当我们需要在数组头部插入或删除元素时,需要移动大量元素,时间复杂度为 O(n)。而循环数组通过维护头尾指针,可以高效地在两端进行操作,实现 O(1) 的时间复杂度。

阅读全文 »

React Native 新架构简介

React Native 的新架构是为了解决旧架构中存在的性能瓶颈和开发体验问题而推出的重大升级。新架构主要包含以下几个核心组件:

  1. JSI (JavaScript Interface): 取代了旧架构中的 JSC (JavaScriptCore),提供了 JS 和原生代码之间的直接通信能力。
  2. Fabric: 新的渲染系统,通过 C++ 桥接层实现了更高效的 UI 渲染。
  3. TurboModules: 新的原生模块系统,允许更高效地调用原生 API。
  4. CodeGen: 自动代码生成工具,减少了手动编写样板代码的工作量。
  5. Hermes: Facebook 开发的专为移动应用优化的 JavaScript 引擎。

相比于旧架构,新架构最大的优势在于消除了异步桥接带来的性能损耗,允许 JavaScript 和原生代码直接通信,大幅提升了应用性能和开发体验。

阅读全文 »

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:

img

1
2
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例 2:

1
2
输入:head = [1], n = 1
输出:[]

示例 3:

1
2
输入:head = [1,2], n = 1
输出:[1]

提示:

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

**进阶:**你能尝试使用一趟扫描实现吗?

阅读全文 »

题目

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

  • 例如,121 是回文,而 123 不是。

示例 1:

1
2
输入:x = 121
输出:true

示例 2:

1
2
3
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:

1
2
3
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。

提示:

  • -231 <= x <= 231 - 1

**进阶:**你能不将整数转为字符串来解决这个问题吗?

阅读全文 »

题目

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。

示例 1:

1
2
3
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

1
2
3
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

1
2
3
4
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成
阅读全文 »
0%