从demo到产品之间存在着鸿沟,大模型应用也是如此。在工程实践的时候,产品/服务提供的功能与性能及成本之间存在着大量的权衡,面向场景来选择大模型的应用框架,则是一种具体的权衡方法。
例如,什么时候使用Agent?当任务太复杂而无法通过单个LLM调用完成时,或者如果任务需要非LLM功能,则需要使用Agent系统。在这种情况下,复杂的任务分解为更简单的任务,并在Agent框架中编排它们。其他的时候,可能会画蛇添足。
1. 场景的抽象
在面对不可枚举的应用场景时,如何选择合适的大模型应用框架呢?
我们可以尝试从技术特征出发,对场景进行分类,这是一个抽象的过程。LLM作为一种非确定性技术,如果您不需要所创建的内容具有那么多的唯一性,那么它带来的麻烦将超过它的价值。减少了不确定性的应用框架也减少了对LLM的调用总数,因此还有降低使用LLM总成本的作用。由于LLM调用比典型的Web服务慢,这也有减少延迟的作用。
然而,LLM存在幻觉问题,并在其训练数据中反映偏见和毒性。鉴于此,直接向终端用户发送LLM生成的内容存在风险。解决这个问题会增加很多工程复杂性,可能需要引入一个实体在回路中检查内容,或者在应用程序中添加护栏,以验证生成的内容没有违反策略。
于是,我们可以把确定性和风险作为两个维度,把成本和延迟作为约束条件,尝试对场景进行分类,进而选择相应的应用框架。
2. 确定性低且风险低的场景——提示模版
面对确定性低且低风险的任务,在每次需要生成内容时调用 LLM 的 API。我们使用 PromptTemplate 并根据运行时参数对发送给 LLM 的提示进行模板化,这样的应用框架是一个好的选择。例如,基于提示发送电子邮件,我们可以使用 langchain:
复制
prompt_template = PromptTemplate.from_template( """ You are an AI executive assistant to {sender_name} who writes letters on behalf of the executive. Write a 3-5 sentence thank you message to {recipient_name} for {reason_for_thanks}. Extract the first name from {sender_name} and sign the message with just the first name. """ ) ... response = chain.invoke({ "recipient_name": "John Doe", "reason_for_thanks": "speaking at our Data Conference", "sender_name": "Jane Brown", })
使用此框架的常见情况是针对交互式应用程序的内部用户(风险很低)。
为重复的任务使用预生成的、经过审查的模板,减少了对持续的人工审查的需要。适合中等创造力,低中等风险的情况下,标准化,但个性化的内容是必要的。
3. 确定性中且风险低的场景——提示缓存
如果希望重复提问每次都生成相同的答案,大幅度降低成本和延迟的一种方法是缓存过去的提示和响应,可以使用 langchain 在客户端执行这样的缓存:
复制
from langchain_core.caches import InMemoryCache from langchain_core.globals import set_llm_cache set_llm_cache(InMemoryCache()) prompt_template = PromptTemplate.from_template( """ What are the steps to put a freeze on my credit card account? """ ) chain = prompt_template | model | parser
除了客户端缓存精确的文本输入和相应的响应之外,缓存还是很有用的。Anthroic 支持“提示缓存”,可以要求模型在服务器端缓存部分提示(通常是系统提示和重复上下文) ,同时在每个后续查询中继续向其发送新的指令。使用提示缓存降低了每个查询的成本和延迟,同时不影响非确定性。它在 RAG、文档提取和示例变多时的few-shot提示中特别有用。
4. 确定性高且风险低的场景——SLM
在大型语言模型(LLM)中完全消除幻觉几乎是不可能的。使用较小的LLM来执行更有针对性的任务虽然可以减少幻觉的风险,但这可能会影响准确性。然而,小型语言模型(SLM)正在变得越来越精确且尺寸越来越小,而LLM则主要专注于增强其任务能力。对于像文档提取这样的特定任务,这些方法之间的准确性差异已经趋于稳定。
如今,越来越多的企业级任务可以通过使用SLM和非最前沿的LLM来完成,这些任务通常具有较高的确定性和较低的风险承受能力。例如,从文档中创建嵌入、进行知识检索和主题建模等任务就非常适合使用小型语言模型。这类任务不仅需要高度的准确性,还要求模型能够快速响应并处理大量数据。因此,选择适当的模型大小和技术方案对于确保业务效率和数据安全至关重要。随着技术的发展,我们可以预见未来会有更多创新的方法出现,以进一步提高模型的性能和适用性。
5. 确定性中且风险中的场景——响应模版
如果给订购旅游产品的用户发送邮件,而且没有内部人员能够在发送之前编辑每封信,这是一个非确定性中且风险为中等的场景。在这种情况下,预先生成模板化响应可能是有帮助的。
复制
prompt_template = PromptTemplate.from_template( """ Write a letter to a customer who has purchased {product_name} tour package. The customer is traveling {group_type} and the tour is to {tour_destination}. Sound excited to see them and explain some of the highlights of what they will see there and some of the things they can do while there. In the letter, use [CUSTOMER_NAME] to indicate the place to be replaced by their name and [TOUR_GUIDE] to indicate the place to be replaced by the name of the tour guide. """ ) chain = prompt_template | model | parser print(chain.invoke({ "group_type": "family", "tour_destination": "Beijing, China", }))
我们要求 LLM 在消息中插入可以动态替换的占位符。无论何时需要发送响应,都要从数据库中检索消息,并用实际数据替换占位符。
6. 确定性高且风险中等的场景——组装式学习
对于一家印刷机零件制造商而言,为其产品目录中的每一项创建一个网页是一项既重要又需要高度准确性的任务。在此过程中,确保信息的真实性至关重要,例如不能错误地宣称某个零件具有耐热性,而实际上它并不具备这种特性。同样,也要避免使用大型语言模型(LLM)时产生误导,比如让读者误以为安装某个部件需要特定的工具。
面对这样的挑战,采用预生成内容的策略可以有效降低动态内容带来的风险。这意味着利用预先准备好的模板和数据来生成网页内容,而不是完全依赖即时生成的内容。在这种情况下,LLM的作用被限制在提取关键信息和生成摘要上,即使这些操作是“实时”完成的,由于它们基于已有的数据和规则,因此只会带来相对较低的风险。
这家制造商可能拥有一个详尽的数据库,其中包含了每个零件的所有相关属性。一种简单而有效的方法是使用LLM为每个属性自动生成描述性文本。然而,在将这些自动生成的内容存储到内容管理系统之前,进行人工审核是必不可少的步骤。这样可以确保所有信息都是准确无误的,并且符合公司的标准和期望。通过这种方式,不仅可以提高内容的准确性,还能增强用户对品牌的信任感。
复制
prompt_template = PromptTemplate.from_template( """ You are a content writer for a manufacturer of paper machines. Write a one-paragraph description of a {part_name}, which is one of the parts of a paper machine. Explain what the part is used for, and reasons that might need to replace the part. """ ) chain = prompt_template | model | parser print(chain.invoke({ "part_name": "xxx", }))
该方法适用于内静态内容。然而,如果是一家电子商务零售商,想创建个性化的推荐,内容会更加动态,需要LLM更高的不确定性。就准确性而言,风险承受能力仍然大致相同。
我们可以使用这种将预生成+机器学习相结合的方法。使用 LLM 进行重新格式化和摘要,并预先生成内容以确保准确性,其中准确性是至关重要的一些部分的内容,而创造性的写作是必需的其他方面。利用机器学习根据用户上下文选择合适的预生成模板,平衡个性化和风险管理。
另外, 模型微调也是面对这样场景的一种技术选择。微调的常见用例包括能够创建品牌内容、机密信息摘要和个性化内容。
7. 确定性低且风险高的场景——安全护栏
面对需要全方位能力并伴随多种风险(如品牌风险、机密信息泄露等)的挑战,建立安全护栏成为应用层不可或缺的策略。这些护栏不仅涉及对输入模型的数据进行预处理,确保其安全性和适宜性,还包括对模型输出的细致后期处理,以及对错误条件的迭代提示词优化,从而形成一道坚固的防线。
在确定性较低或要求高度创造力的任务中,高风险如影随形。此时,定制的安全护栏显得尤为重要,它们能够针对性地减轻包括品牌损害在内的多重风险,并强化数据安全性。这种定制化的防护措施对于满足特定行业或应用程序的独特需求至关重要,确保在追求创新和效率的同时,不失稳健与安全。通过这样的多层次安全策略,组织能够在复杂多变的数字环境中保持竞争力,同时有效管理潜在威胁。
8.一句话小结
根据不同场景的确定性和风险程度,采取相应的大模型应用框架:低确定性低风险使用提示模版,中确定性低风险使用提示缓存,高确定性低风险采用SLM,中确定性中风险应用响应模版,高确定性中风险实施组装式学习,而低确定性高风险则设置安全护栏。当然,这是探索性的粗糙分类,希望可以抛砖引玉!