使用大模型构建软件,与传统软件开发有本质的不同。开发者不再仅仅是将源代码编译成二进制文件来执行,而是需要深入理解影响大模型表现的关键因素,以产生一致且准确的输出。需要认识到,大模型应用的输出结果是基于概率的,并不像传统软件那样可预测。
提示词工程(Prompt engineering)是一种增强大模型输出结果的方法论。遵循一些提示词编写原则,可以在无需改变大模型的前提下,大幅改善大模型的表现效果。
提示词编写指南:Prompt engineering
上下文学习 (In-context learning) 是一种特定的提示词工程方法,具体操作是将任务的演示(即给定多组符合期望的输入和输出,这样能让大模型和你的期望对齐)作为提示词的一部分(以自然语言)提供给模型。
借助上下文学习,你可以使用通用大模型来解决个性化任务,而无需进行微调(Fine-tuning)。
以下是使用了上下文学习的提示词,注意XML标签 examples 里的示例:
<instructions>
1. 从聊天记录中提取用户提到的自己的年龄。
2. 如果用户在多条聊天记录中提到年龄,提取最新的一条记录中的年龄。
3. 如果聊天记录中没有提到年龄,输出null。
4. 输出结果时,不要包含任何XML标签。
注意事项:
- 确保提取的年龄是用户明确提到的。
- 如果用户没有提到年龄,输出null。
- 确保输出的格式清晰且易于理解。
</instructions>
<examples>
<example>
<chat>
用户: 我今年25岁了。
用户: 我弟弟比我小两岁。
</chat>
<output>
25
</output>
</example>
<example>
<chat>
用户: 我弟弟比我小两岁。
</chat>
<output>
null
</output>
</example>
<example>
<chat>
user: 我昨天刚过了30岁生日。
assistant: 好的了解了,请提供您的性别。
user: 男性
assistant: 有什么症状吗?
user: 最近两天有点发烧,肚子疼
</chat>
<output>
30
</output>
</example>
</examples>
思维链(Chain-of-Thought,CoT)也是一种特定的提示词工程方法,具体操作是使用自然语言描述完成特定任务的步骤或推理过程给大模型看。

(图片来源:https://www.promptingguide.ai/techniques/cot)
另一方面,随着大模型能力越来越强,不需要特别的思维链,模型本身也会正确推理。

向量(也称作嵌入)是大模型真正处理的数据类型,向量具有多个维度,每个维度使用一个浮点数表示,通过嵌入模型可以将文本转换为向量表示。
两个向量之间的距离衡量它们的相关性。距离小表示相关性高,距离大表示相关性低。向量的这个特性,可以应用在自然语言搜索场景。
{
"object": "list",
"data": [
{
"object": "embedding",
"index": 0,
"embedding": [
-0.006929283495992422,
-0.005336422007530928,
... (omitted for spacing)
-4.547132266452536e-05,
-0.024047505110502243
],
}
],
"model": "text-embedding-3-small",
"usage": {
"prompt_tokens": 5,
"total_tokens": 5
}
}
以向量检索为核心的检索增强生成(RAG)技术已成为解决大模型获取最新外部知识和知晓私域知识的主要解决方案。
为什么需要 RAG 呢?一是,大模型由于其训练周期长和训练成本高的特点,其学到的知识存在滞后性;二是,大模型的训练数据一般不会包含个人信息、公司经营数据和商业秘密等信息。因此,想要利用大模型打造公司业务助手或个人生活助手,就需要先在私域知识库里检索出相关信息,然后再将这些相关信息作为上下文与用户提示词一起提供给大模型,从而增强生成的内容。
直接问大模型:
结合 RAG 问大模型:
结合 RAG 的提示词大概是下面的样子,从该提示词我们能清晰的看到 RAG 是如何发挥作用的:
SYSTEM
Use the following context as your learned knowledge, inside <context></context> XML tags.
<context>
然而,特朗普拿下了全部7个州,这让他在选举人团的州计票中,以312票对226票占据绝对优势,从而决定了美国总统大选的结果。斩获总统大选的胜利需要270张选举人票。
2025年1月20日,时年78岁的特朗普将宣誓就职,成为美国的第47任总统,同时他将成为继1890年代的格罗弗·克利夫兰(Grover Cleveland)之后,首位获得两届非连续任期的总统。他也是美国历史上最年长的当选总统。
特朗普还赢得了普选票的多数,这是2004年前总统乔治·W·布什以来首位赢得普选票的共和党候选人。
前美国总统唐纳德·特朗普最终在上个星期举行的2024年全国大选中以压倒性的胜利为他赢得了又一个入主白宫四年的总统任期。
在11月5日的选举前,全国性的民调显示,副总统卡玛拉·哈里斯略微领先特朗普,可能在1到2个百分点。
民调显示,民主党候选人哈里斯和共和党候选人特朗普在7个政治战场州的选情几乎不分伯仲。选举分析人士认为,这7各州的选举结果对于任何一个候选人来说,都至关重要。
</context>
When answer to user:
- If you don't know, just say that you don't know.
- If you don't know when you are not sure, ask for clarification.
Avoid mentioning that you obtained the information from the context.
And answer according to the language of the user's question.
USER
下任美国总统是谁?
ASSISTANT
下任美国总统是唐纳德·特朗普,他在2024年全国大选中赢得了选举,将于2025年1月20日宣誓就职。

(图片来源:https://github.blog/ai-and-ml/llms/the-architecture-of-todays-llm-applications/)
在计划阶段,需要识别出一个具体的待解决问题。问题不能太大,因为需要快速迭代以获得用户反馈。
在构建阶段,首先需要根据需求选择一款适合的大模型,影响选择的主要因素有开源还是闭源、参数规模、是否支持多模态等。其次是定制大模型,方法包括不改变模型的提示词工程以及改变模型的微调(Fine-tuning)和人类反馈强化学习(RLHF)。最后是将各组件有机的组合起来发挥作用,包括:用户界面(UI)、大模型和配套工具以及安全合规的输出。
在部署阶段,需监测应用的使用情况,特别是对大模型的调用。此外,还需有机制能收集到用户的使用反馈,以便快速迭代优化。

(图片来源:https://github.blog/ai-and-ml/llms/the-architecture-of-todays-llm-applications/)
通过用户界面接收用户输入,输入类型可以包括文本、图片和语音等,再通过语音转文本技术、图片识别技术和支持多模态模型等将图片和语音转换为文本。
使用嵌入模型将用户查询文本转换为向量(也称作嵌入)后,在向量数据库(知识库)中进行向量检索,通过语义相似度匹配的方式查询到相关的内容片段。出于保护用户隐私和商业秘密的目的,需要在匹配的内容片段被传给大模型前过滤处理。最后,将用户查询和知识库里匹配的内容片段组合生成初始提示词。整个过程也就是在做 RAG。
生成初始提示词后,可以使用工具优化提示词,如:重排序知识库里匹配的内容片段、提示词编排等。
提交提示词给到大模型,这里可以构建一个缓存机制,遇到相似的查询直接从缓存里获取回复。没有命中缓存,则提交大模型生成回复,并将查询和回复写入缓存,
获取回复后,在将回复给到用户前,需对回复过滤处理,过滤掉其中有害或有偏见的内容。最后,输出文本或将文本转换成语音后回复用户。
大模型应用面临的最普遍的安全问题可能就是提示词注入(Prompt Injection),攻击者通过提示词注入技术,可达到泄露敏感信息和让模型输出有害内容等目的。提示词注入攻击能够成功的本质在于语言模型无法区分开发者指令和用户输入指令,一旦攻击者使用恶意的输入指令覆盖开发者指令,攻击就生效了。

(图片来源:https://learnprompting.org/docs/prompt_hacking/injection)
参考资料