(五)LLM项目搭建

一、LLM项目构建步骤

构造一个 LLM 项目需要以下步骤:

  1. 确定项目目标:首先,你需要明确你的项目目标是什么。你想要使用 LLM 来完成什么任务?例如,你可能想要构建一个文本生成模型,用于自动写作;或者你可能想要构建一个文本分类模型,用于情感分析。明确项目目标对于后续的步骤非常重要。

  2. 收集和准备数据:接下来,你需要收集和准备用于训练 LLM 的数据。这包括找到合适的数据源,并将数据进行清洗和预处理。确保你的数据集具有足够的多样性和代表性,以便训练出具有良好泛化能力的模型。

  3. 设计 Prompt:Prompt 是你向 LLM 提供的指令或问题。设计一个好的 Prompt 对于获得准确和有用的结果非常重要。你可以根据你的项目目标和需求来设计 Prompt,确保它能够引导 LLM 生成符合你期望的文本。

  4. 微调模型:在设计好 Prompt 后,你需要使用训练数据对 LLM 进行微调。微调是指在预训练的基础模型上进一步训练,使其适应特定任务或领域。通过微调,你可以提高模型在特定任务上的性能和效果。

  5. 评估和优化:在微调完成后,你需要评估模型的性能并进行优化。使用一些评估指标来衡量模型的准确性、流畅性和一致性。如果模型表现不佳,你可以尝试调整 Prompt 的设计或增加训练数据来改进模型。

  6. 部署和应用:最后,当你对模型的性能满意后,你可以将其部署到实际应用中。根据你的需求,你可以选择将模型封装成 API,以便其他应用程序可以调用;或者你可以将模型集成到自己的应用程序中,以实现特定的功能。

总结:
构造一个 LLM 项目需要明确项目目标、收集和准备数据、设计 Prompt、微调模型、评估和优化以及部署和应用。每个步骤都需要仔细考虑和执行,以确保项目的成功和效果。

二、LLM项目优化:解决 Bad Case

验证迭代的思路:找出Bad Case,针对Bad Case 做出Prompt优化。解决Bad Case的几个方法包括:

2.1. 构造向量数据库

加载向量数据库及检索链

from langchain.vectorstores import Chroma
from langchain.embeddings.openai import OpenAIEmbeddings    # 调用 OpenAI 的 Embeddings 模型
import openai
from dotenv import load_dotenv, find_dotenv
import os

_ = load_dotenv(find_dotenv()) # read local .env file
openai.api_key = os.environ['OPENAI_API_KEY']

# 定义 Embeddings
embedding = OpenAIEmbeddings() 

# 向量数据库持久化路径
persist_directory = '../../data_base/vector_db/chroma'

# 加载数据库
vectordb = Chroma(
    persist_directory=persist_directory,  # 允许我们将persist_directory目录保存到磁盘上
    embedding_function=embedding
)

print(f"向量库中存储的数量:{vectordb._collection.count()}")

使用初始化的 Prompt 创建一个基于模板的检索链:

from langchain.prompts import PromptTemplate

template_v1 = """使用以下上下文来回答最后的问题。如果你不知道答案,就说你不知道,不要试图编造答
案。最多使用三句话。尽量使答案简明扼要。总是在回答的最后说“谢谢你的提问!”。
{context}
问题: {question}
有用的回答:"""

QA_CHAIN_PROMPT = PromptTemplate(input_variables=["context","question"],
                                 template=template_v1)

from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(model_name = "gpt-3.5-turbo", temperature = 0 )

qa_chain = RetrievalQA.from_chain_type(llm,
                                       retriever=vectordb.as_retriever(),
                                       return_source_documents=True,
                                       chain_type_kwargs={"prompt":QA_CHAIN_PROMPT})

# 效果测试
question = "什么是南瓜书"
result = qa_chain({"query": question})
print(result["result"])

2.2、提升直观回答质量

构造 Prompt 的原则有两个关键点:

  1. 编写清晰、具体的指令:Prompt 需要以清晰、具体的方式表达需求,并提供充足的上下文,使语言模型准确理解意图。过于简略的 Prompt 往往使模型难以把握具体任务。因此,在设计 Prompt 时,需要用清晰、详尽的语言表达需求,给出足够的上下文和细节,让模型可以更准确地理解操作和响应方式。

  2. 给予模型充足思考时间:语言模型与人类一样,需要时间来思考并解决复杂问题。如果让语言模型匆忙给出结论,其结果很可能不准确。因此,在设计 Prompt 时,需要给予语言模型充足的推理时间。可以要求模型先列出对问题的各种看法,说明推理依据,然后再得出最终结论。通过添加逐步推理的要求,可以让语言模型投入更多时间逻辑思维,输出结果也将更可靠准确。

这两个原则的应用可以帮助语言模型尽可能发挥潜力,完成复杂的推理和生成任务。在设计 Prompt 时,需要注意清晰明确地表达需求,并给予模型充足的思考时间,以提高语言模型的性能和可靠性。

2.3、标明知识来源,提高可信度

由于大模型存在幻觉问题,有时我们会怀疑模型回答并非源于已有知识库内容,所以需要标明知识来源,提高可信度。但是,附上原文来源往往会导致上下文的增加以及回复速度的降低,我们需要根据业务场景酌情考虑是否要求附上原文。

2.4、构造思维链

大模型往往可以很好地理解并执行指令,但模型本身还存在一些能力的限制,例如大模型的幻觉、无法理解较为复杂的指令、无法执行复杂步骤等。可以通过构造思维链,将 Prompt 构造成一系列步骤来尽量减少其能力限制。

2.5、增加一个指令解析

我们往往会面临一个需求,即我们需要模型以我们指定的格式进行输出,解决方案是,在检索 LLM 之前,增加一层 LLM 来实现指令的解析,将用户问题的格式要求和问题内容拆分开来。这样的思路其实就是目前大火的 Agent 机制的雏形,即针对用户指令,设置一个 LLM(即 Agent)来理解指令,判断指令需要执行什么工具,再针对性调用需要执行的工具,其中每一个工具可以是基于不同 Prompt Engineering 的 LLM,也可以是例如数据库、API 等。LangChain 中其实有设计 Agent 机制,实现如下:

# 定义一个 OpenAI 的原生接口
import openai
# 一个封装 OpenAI 接口的函数,参数为 Prompt,返回对应结果
def get_completion(prompt, model="gpt-3.5-turbo", temperature = 0):
    '''
    prompt: 对应的提示词
    model: 调用的模型,默认为 gpt-3.5-turbo(ChatGPT),有内测资格的用户可以选择 gpt-4
    '''
    messages = [{"role": "user", "content": prompt}]
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=temperature, # 模型输出的温度系数,控制输出的随机程度
    )
    # 调用 OpenAI 的 ChatCompletion 接口
    return response.choices[0].message["content"]

prompt_input = '''
请判断以下问题中是否包含对输出的格式要求,并按以下要求输出:
请返回给我一个可解析的Python列表,列表第一个元素是对输出的格式要求,应该是一个指令;第二个元素是去掉格式要求的问题原文
如果没有格式要求,请将第一个元素置为空
需要判断的问题:
'''

response = get_completion(prompt_input.format(question))
response

-> "['给我返回一个 Python List', 'LLM的分类是什么?']"

三、LLM项目评估

通过针对性优化 Prompt 来解决 Bad Cases,从而优化系统的表现。具体为:找到每一个 Bad Case 加入到验证集中,每一次优化 Prompt 之后,重新对验证集中所有验证案例进行验证,从而保证优化后的 Prompt 不会在原有 Good Case 上失去能力或表现降级。当验证集体量较小时,可以采用人工评估的方法,即对验证集中的每一个验证案例,人工评估系统输出的优劣;但是,当验证集随着系统的优化而不断扩张,其体量会不断增大,以至于人工评估的时间和人力成本扩大到无法接受的程度。因此,我们需要采用自动评估的方法,自动评估系统对每一个验证案例的输出质量,从而评估系统的整体性能。

3.1、人工评估

准则一 量化评估
对每一个验证案例的回答都给出打分,最后计算所有验证案例的平均分得到本版本系统的得分。量化的量纲可以是05,也可以是0100,可以根据个人风格和业务实际情况而定。

准则二 多维评估
从多个维度出发,设计每个维度的评估指标,在每个维度上都进行打分,从而综合评估系统性能。同时需要注意的是,多维评估应当和量化评估有效结合,对每一个维度,可以设置相同的量纲也可以设置不同的量纲,应充分结合业务实际。

3.2、简单自动评估

方法一 :构造客观题

方法二:计算答案相似度

首先人工构造一个标准回答,接着对模型回答计算其与该标准回答的相似程度,越相似则我们认为答案正确程度越高。

from nltk.translate.bleu_score import sentence_bleu
import jieba

def bleu_score(true_answer : str, generate_answer : str) -> float:
    # true_anser : 标准答案,str 类型
    # generate_answer : 模型生成答案,str 类型
    true_answers = list(jieba.cut(true_answer))
    # print(true_answers)
    generate_answers = list(jieba.cut(generate_answer))
    # print(generate_answers)
    bleu_score = sentence_bleu(true_answers, generate_answers)
    return bleu_score

3.3、使用大模型进行评估

以 GPT-4 为代表的大模型为我们提供了一种新的方法:使用大模型进行评估。我们可以通过构造 Prompt Engineering 让大模型充当一个评估者的角色,从而替代人工评估的评估员;同时大模型可以给出类似于人工评估的结果,因此可以采取人工评估中的多维度量化评估的方式,实现快速全面的评估。

# 定义一个 OpenAI 的原生接口
import openai
# 一个封装 OpenAI 接口的函数,参数为 Prompt,返回对应结果
def get_completion(prompt, model="gpt-4", temperature = 0):
    '''
    prompt: 对应的提示词
    model: 调用的模型,默认为 gpt-3.5-turbo(ChatGPT),有内测资格的用户可以选择 gpt-4
    '''
    messages = [{"role": "user", "content": prompt}]
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages,
        temperature=temperature, # 模型输出的温度系数,控制输出的随机程度
    )
    # 调用 OpenAI 的 ChatCompletion 接口
    return response.choices[0].message["content"]

question = "应该如何使用南瓜书?"
result = qa_chain({"query": question})
answer = result["result"]
knowledge = result["source_documents"]

response = get_completion(prompt.format(question, answer, knowledge))
response

-> '{"知识查找正确性": 1, "回答一致性": 1, "回答幻觉比例": 1, "回答正确性": 1, "逻辑性": 1, "通顺性": 1, "智能性": 0.9}'

3.4、混合评估

1、客观正确性。客观正确性指对于一些有固定正确答案的问题,模型可以给出正确的回答。我们可以选取部分案例,使用构造客观题的方式来进行模型评估,评估其客观正确性。

2、主观正确性。主观正确性指对于没有固定正确答案的主观问题,模型可以给出正确的、全面的回答。我们可以选取部分案例,使用大模型评估的方式来评估模型回答是否正确。

3、智能性。智能性指模型的回答是否足够拟人化。由于智能性与问题本身弱相关,与模型、Prompt 强相关,且模型判断智能性能力较弱,我们可以少量抽样进行人工评估其智能性。

4、知识查找正确性。知识查找正确性指对于特定问题,从知识库检索到的知识片段是否正确、是否足够回答问题。知识查找正确性推荐使用大模型进行评估,即要求模型判别给定的知识片段是否足够回答问题。同时,该维度评估结果结合主观正确性可以计算幻觉情况,即如果主观回答正确但知识查找不正确,则说明产生了模型幻觉。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容