当前位置: 首页 > news >正文

做取名的网站很赚钱吗健身房页面设计大纲

做取名的网站很赚钱吗,健身房页面设计大纲,学校建设网站费用申请,英文网站怎么设计前言 Hello#xff0c;大家好#xff0c;我是GISer Liu#x1f601;#xff0c;一名热爱AI技术的GIS开发者#xff0c;在上一篇文章中#xff0c;我们学习了如何基于LangChain构建RAG应用#xff0c;并且通过Streamlit将这个RAG应用部署到了阿里云服务器#xff1b;大家好我是GISer Liu一名热爱AI技术的GIS开发者在上一篇文章中我们学习了如何基于LangChain构建RAG应用并且通过Streamlit将这个RAG应用部署到了阿里云服务器 在本文中作者将通过 LLM应用评估思路 生成内容评估优化 检索内容评估优化 帮助读者学习如何对自己开发的RAG应用进行评估并通过科学的方法优化结果提高应用性能 一、LLM应用评估策略 1.评估思路 在上一篇文章中我们基于LangChain构建了一个RAG应用并使用Streamlit将其部署到阿里云服务器。回顾整个开发流程我们可以总结出以下几点LLM应用开发特性 ① 开发流程快捷以调用API、以LLM为核心的大模型开发流程快捷更注重于验证和迭代。 ② 成本效益高LLM的强大泛化性使其能够解决许多细节任务且成本仅为传统应用开发的百分之一。 以开发上一篇文章中的RAG应用为例作者从选择数据、构建向量数据库、选择LLM API、配置Embedding模型到开发问答检索链仅用4小时即可完成。并且开发成本不到10元。 在传统AI应用开发中我们需要不断收集大量数据来训练和微调模型以优化性能而LLM应用开发则只需通过几个错误案例调整即可获得良好结果无需大量样本迭代。从这里我们可以提取出一点方法论 LLM应用开发抓住业务痛点从错误的案例中分析应用的不足并加以改善便可快速提升模型性能。 以Json内容输出为例在构建LLM应用程序时我们会经历以下流程 ①少样本调整Prompt首先我们会从1-3个小样本中调整我们的Prompt确保应用能在小样本上成功生成目标结果例如要求LLM输出Json格式的内容包括特定字段如任务名称、任务类型等。初步测试样本后系统可以在简单任务中正常输出。 ②Bad Case定向优化接着当我们对系统进行进一步测试时可能会遇到一些棘手的问题例如要求输出的字段名称字段格式要求每个字段有其取值范围我们针对这些突出问题定向调整、手动解决 ③模型性能与开发成本的权衡最终当我们积累的问题越来越多时逐个调整或满足每个问题的要求变得不现实。因此我们开始选择一些自动化手段来评估模型以质量换成本,权衡利弊 这个过程中我们无需追求完美而是要综合考虑时间成本和模型性能。得益于LLM的飞速发展我们的应用通常经过几轮调整就能达到很好的表现。 但这仅仅的对简单的具有标准答案的任务性能指标在这些任务样本上评估并不明显在没有简单答案或标准答案的情况下评价指标才能准确反应模型的性能 2.评估方法 通过识别和解决“Bad Case”我们将不断优化应用的性能和精度。具体流程为 发现Bad Case并将每个Bad Case加入验证集。针对性调整对应的Prompt并检索架构。每次优化后重新验证整个验证集确保原有Good Case不受影响。 对于 小验证集采用人工评估大验证集则采用自动化评估以降低成本和时间消耗。 下面我们开始讲解人工评估方法 环境部署 首先我们加载我们的向量数据库与检索链继续使用Faiss向量数据库和Mistral模型代码如下 # 添加历史对话功能 from __future__ import annotations import os from langchain_mistralai.chat_models import ChatMistralAI from langchain.memory import ConversationBufferMemory from langchain.chains import ConversationalRetrievalChain from langchain_community.vectorstores import FAISS # 封装Mistral Embedding import logging from typing import Dict, List, Any # 构建检索问答链 from langchain.prompts import PromptTemplate from langchain.chains import RetrievalQAfrom langchain.embeddings.base import Embeddings from langchain.pydantic_v1 import BaseModel, root_validatorlogger logging.getLogger(__name__)class MistralAIEmbeddings(BaseModel, Embeddings):MistralAI Embeddings embedding models.client: Anymistralai.MistralClientroot_validator()def validate_environment(cls, values: Dict) - Dict:实例化MistralClient为values[client]Args:values (Dict): 包含配置信息的字典必须包含 client 的字段.Returns:values (Dict): 包含配置信息的字典。如果环境中有mistralai库则将返回实例化的MistralClient类否则将报错 ModuleNotFoundError: No module named mistralai.from mistralai.client import MistralClientapi_key os.getenv(MISTRAL_API_KEY)if not api_key:raise ValueError(MISTRAL_API_KEY is not set in the environment variables.)values[client] MistralClient(api_keyapi_key)return valuesdef embed_query(self, text: str) - List[float]:生成输入文本的 embedding.Args:texts (str): 要生成 embedding 的文本.Return:embeddings (List[float]): 输入文本的 embedding一个浮点数值列表.embeddings self.client.embeddings(modelmistral-embed,input[text])return embeddings.data[0].embeddingdef embed_documents(self, texts: List[str]) - List[List[float]]:生成输入文本列表的 embedding.Args:texts (List[str]): 要生成 embedding 的文本列表.Returns:List[List[float]]: 输入列表中每个文档的 embedding 列表。每个 embedding 都表示为一个浮点值列表。return [self.embed_query(text) for text in texts]# 实例化Embedding模型 embeddings_model MistralAIEmbeddings() # 加载向量数据库 loaded_db FAISS.load_local(./db/GIS_db, embeddings_model, allow_dangerous_deserializationTrue)# 获取环境变量 MISTRAL_API_KEY api_key os.environ[MISTRAL_API_KEY]# 初始化一个 ChatMistralAI 模型实例并设置温度为 0 llm ChatMistralAI(temperature0,api_keyapi_key)template 使用以下上下文来回答最后的问题。如果你不知道答案或者不确定结果只需要你不知道不要试图编造答 案。最多使用三句话。尽量使答案简明扼要。要求使用中文回答。 {context} 问题: {question} QA_CHAIN_PROMPT PromptTemplate(input_variables[context,question],templatetemplate)# 构建检索问答链 qa_chain RetrievalQA.from_chain_type(llm,retrieverloaded_db.as_retriever(),return_source_documentsTrue,chain_type_kwargs{prompt:QA_CHAIN_PROMPT})# 测试结果 question_1 GIS的组成 result qa_chain({query: question_1}) print(result[result])测试一下 没问题 ①人工评估方法 适用范围系统开发初期、验证集体量较小 重点系统评估与业务强相关设计具体的评估方法要结合业务深入考虑 在大模型的应用开发过程中人工评估是一个不可或缺的环节。其可以帮助我们确保模型的输出质量尤其是在系统开发的初期当验证集的体量相对较小的时候。 1量化评估 量化评估是不同版本应用性能比较的关键。对每个验证案例的回答进行打分我们可以计算所有案例的平均分来评估系统的表现。量化的量纲可以是0-5或0-100当然这取决于业务需求和个人风格。 这里作者给出两个验证案例 ① GIS是什么② GIS的应用场景 接下来我们分别用版本A prompt简明扼要 与版本B prompt详细具体 来要求模型做出回答 下面作者的代码 # 测试结果 question_1 GIS是什么 result1 qa_chain({query: question_1}) print(result1[result]) question_2 GIS的应用场景 result2 qa_chain({query: question_2}) print(result2[result])运行结果如下 可以看出其简单粗暴是提示词工程最常见的应用 2多维评估 大模型的回答需要在多个维度上进行回答的结果进行评估每个维度都应设计相应的评估指标和量纲下面是评价维度取值区间默认为[0,1] 知识查找正确性回答幻觉比例回答正确性逻辑性通顺性智能性 代码如下 # 测试结果 print(问题) question 遥感的微波的概念是什么 print(question) print(模型回答) result qa_chain({query: question}) print(result[result])经过查询原始资料为 微波的的波长比可见光和红外波长受大气层中云雾的散射影响小穿透性好因此能全天候进行遥感。使用微波的遥感被称为微波遥感它通过接受地面物体发射的微波辐射能量或接收器本身发出的电磁波束的回波信号对物体进行探测、识别和分析。由于微波遥感采用主动方式进行其特点是对云层、地表植被、松散沙层和干燥冰雪具有一定的穿透能力且不受光照等条线限制。因此微波遥感是一种全天候、全天时的遥感技术。回答结果为 问题 遥感的微波的概念是什么 模型回答 遥感的微波Microwave Remote Sensing指的是使用微波辐射的散射和辐射信息来分析、识别地物或提取专题信息的技术。微波遥感可以使用人工辐射源如微波雷达发射微波辐射然后根据地物散射该辐射返回的反向反射信号来探测和测距。由于微波波长比可见光和红外波长长因此微波遥感具有较好的穿透能力可以对云层、地表植被、松散沙层和干燥冰雪等物体进行探测且不受光照等条件的限制是一种全天候、全天时的遥感技术。微波遥感中常用的微波辐射源波段为0.8~30cm。我们可以对其进行打分 ① 知识查找正确性1分 ② 回答一致性1 ③ 回答幻觉比例1 ④ 回答正确性0.9 ⑤ 逻辑性0.8微波概念与微波发射混淆 ⑥ 通顺性0.8多概念混淆回答 ⑦ 智能性0.7技术是严谨的AI也是都差不多 综合上述七个维度我们可以全面、综合地评估系统在每个案例上的表现综合考虑所有案例的得分就可以评估系统在每个维度的表现。 优化空间 多维评估应与量化评估有效结合并根据业务实际设置不同的量纲。针对不同维度的不同重要性赋予权值再计算所有维度的加权平均来代表系统得分。 随着系统逐渐复杂和验证集的不断增大这种评估的此时会达到成千上万次人力完全不够胜任因此我们继续一种自动评估模型的方法 ②自动评估方法 自动化评估大语言模型LLM的难点主要在于模型生成的答案往往难以判断其准确性。 对于客观题由于有明确的标准答案评估相对简单对于主观题尤其是那些没有固定答案的题目实现自动化评估则显得尤为困难。 然而在一定程度上牺牲评估的精确性我们可以将那些复杂且没有标准答案的主观题转换为具有明确答案的问题从而利用简单的自动化评估方法。具体来说有两种策略可以采用 构造客观题将主观题转化为选择题如多项选择或单项选择这样可以通过直接对比模型生成的答案与预设的标准答案来评估其准确性。 怎么有股子独热编码的味道 计算标准答案相似度通过计算模型生成的答案与标准答案之间的相似度来评估答案的准确性。这种方法虽然不如直接对比答案那么简单直接但可以在一定程度上量化答案的正确程度。 1构造客观题 思路将主观题转化为多项选择题或单项选择题以便于通过对比模型生成的答案与标准答案来实现简单评估。 例如我们给出问题: 遥感传感器的性能指标有 A空间分辨率 B时间分辨率 C:视场角FOV D:光谱分辨率; 我们给定的标准答案是ABC将模型给出的答案与标准答案进行对比即可实现评估打分根据以上思想我们可以构造出一个Prompt问题模版代码如下 template 针对以下的问题进行作答这是多选题不要说多余的话从选择题中选择出你的答案只需要输出选项即可无需解释其他内容。只能从ABCD中选择对应的字母 {context} 问题: {question} QA_CHAIN_PROMPT PromptTemplate(input_variables[context,question],templatetemplate)# 构建检索问答链 qa_chain RetrievalQA.from_chain_type(llm,retrieverloaded_db.as_retriever(),return_source_documentsTrue,chain_type_kwargs{prompt:QA_CHAIN_PROMPT})# 测试结果 print(问题) question 遥感传感器的性能指标有A空间分辨率 B时间分辨率 C:视场角FOV D:光谱分辨率; print(question) print(模型回答) result qa_chain({query: question}) print(result[result])输出结果如下 这种思路类似于政治类考试的主观题通过列举出客观的选项来回答这种主观问题 当然鉴于大模型的不稳定性、即使我们要求其给出选择项其也可能会返回一大堆文字(解释选择原因或无用信息)因此我们需要构建一种打分方法我们需要从文字中提取出选择答案这里我们设计打分策略为全选为1分漏选为0.5分错选不得分代码如下 def multi_select_score_v1(true_answer : str, generate_answer : str) - float:# true_anser : 正确答案str 类型例如 BCD# generate_answer : 模型生成答案str 类型true_answers list(true_answer)为便于计算我们假设每道题都只有 A B C D 四个选项# 先找出错误答案集合false_answers [item for item in [A, B, C, D] if item not in true_answers]# 如果生成答案出现了错误答案for one_answer in false_answers:if one_answer in generate_answer:return 0# 再判断是否全选了正确答案if_correct 0for one_answer in true_answers:if one_answer in generate_answer:if_correct 1continueif if_correct 0:# 不选return 0elif if_correct len(true_answers):# 全选return 1else:# 漏选return 0.5# 测试结果 print(问题) question 遥感传感器的性能指标有A空间分辨率 B时间分辨率 C:视场角FOV D:光谱分辨率; print(question) print(模型回答) result qa_chain({query: question}) print(result[result])score multi_select_score_v1(true_answerABCD, generate_answerresult[result]) print(模型得分, score)运行结果为 但是可以看到我们要求模型在不能回答的情况下不做选择错选和不选均为0分这样其实鼓励了模型的幻觉回答因此我们可以根据情况调整打分策略让错选扣一分除此之外这里作者认为不够完善我们可以在prompt中通过格式化输出解析来精准提取回答文本辅助提高解析精度修改后我们再次测试 template 针对以下的问题进行作答不要说多余的话 {context} 问题: {question}----------- 从选择题中选择出你的答案只能从ABCD中选择对应的字母; 要求输出的多个选项答案全部包裹在一个answer中例如 answer ABC 要记住这是多选题不要当做单选题 QA_CHAIN_PROMPT PromptTemplate(input_variables[context,question],templatetemplate)# 构建检索问答链 qa_chain RetrievalQA.from_chain_type(llm,retrieverloaded_db.as_retriever(),return_source_documentsTrue,chain_type_kwargs{prompt:QA_CHAIN_PROMPT})def multi_select_score_v1(true_answer : str, generate_answer : str) - float:# true_anser : 正确答案str 类型例如 BCD# generate_answer : 模型生成答案str 类型true_answers list(true_answer)为便于计算我们假设每道题都只有 A B C D 四个选项# 先找出错误答案集合false_answers [item for item in [A, B, C, D] if item not in true_answers]# 如果生成答案出现了错误答案for one_answer in false_answers:if one_answer in generate_answer:return 0# 再判断是否全选了正确答案if_correct 0for one_answer in true_answers:if one_answer in generate_answer:if_correct 1continueif if_correct 0:# 不选return 0elif if_correct len(true_answers):# 全选return 1elif if_correct len(true_answers):# 多选return 1else:# 漏选return 0.5# 正则提取任务 def parse_answer(content): # 从模型生成中字符串匹配提取生成的代码pattern ranswer(.*?) # 使用非贪婪匹配match re.search(pattern, content, re.DOTALL)answer match.group(1) if match else contentreturn answer# 测试结果 print(问题) question 遥感传感器的性能指标有A空间分辨率 B时间分辨率 C:视场角FOV D:光谱分辨率; print(question) print(模型回答) result qa_chain({query: question}) print(result[result]) answer parse_answer(result[result]) print(模型答案,answer) score multi_select_score_v1(true_answerABCD, generate_answeranswer) print(模型得分, score)可以看到这样我们就实现了快速、自动又有区分度的自动评估。在这样的方法下我们只需对每一个验证案例进行客观题构造之后每一次验证、迭代都可以完全自动化进行从而实现了高效的验证。 2 计算答案相似度 学习之前文章中的RAG原理的读者应该对向量相似度有一定的了解我们一般可以针对每个问题构建对应的标准答案无论主客观题目我们将模型的回答结果与标准答案都进行向量化然后相似度计算相似度越高我们则认为正确答案程度越高计算相似度的方法有很多这里我们使用BLEU来进行相似度计算 BLEUBilingual Evaluation Understudy是一种用于评估机器翻译质量的指标它通过比较机器翻译的文本与一组参考翻译通常是人工翻译的相似度来计算得分。BLEU的计算原理基于以下几个关键步骤 N-gram 匹配 BLEU的核心思想是计算机器翻译文本中的n-gram连续的n个词与参考翻译中的n-gram的匹配程度。通常BLEU会计算1-gram单个词、2-gram两个词、3-gram和4-gram的匹配情况。 精度Precision计算 对于每个n-gram计算其在机器翻译文本中出现的次数与在参考翻译 中出现的次数的比值。如果机器翻译中的某个n-gram在参考翻译中出现的次数更多则只计 算参考翻译中出现的次数。 惩罚因子Brevity Penalty 为了防止过短的机器翻译获得过高的分数BLEU引入了一个惩罚因子。如果机器翻译的长度小于参考翻译的长度则根据长度差异计算一个惩罚因子使得过短的翻译得分降低。 综合得分 将各个n-gram的精度得分进行加权平均通常权重是几何平均。最后乘以惩罚因子得到最终的BLEU得分。 BLEU得分的计算公式可以表示为 BLEU BP ⋅ exp ⁡ ( ∑ n 1 N w n log ⁡ p n ) \text{BLEU} \text{BP} \cdot \exp\left(\sum_{n1}^{N} w_n \log p_n\right) BLEUBP⋅exp(n1∑N​wn​logpn​) 其中 BP \text{BP} BP 是惩罚因子。 p n p_n pn​ 是n-gram的精度。 w n w_n wn​是n-gram的权重通常取几何平均。 BLEU的优点是计算简单且与人工评估有较好的相关性但它也有一些局限性比如对语法错误和语义差异不够敏感。尽管如此BLEU仍然是机器翻译领域广泛使用的评估指标之一。 我们可以使用NLTK库中的bleu打分函数进行计算 from nltk.translate.bleu_score import sentence_bleu import jiebadef 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 true_answer 微波的的波长比可见光和红外波长受大气层中云雾的散射影响小穿透性好因此能全天候进行遥感。使用微波的遥感被称为微波遥感它通过接受地面物体发射的微波辐射能量或接收器本身发出的电磁波束的回波信号对物体进行探测、识别和分析。由于微波遥感采用主动方式进行其特点是对云层、地表植被、松散沙层和干燥冰雪具有一定的穿透能力且不受光照等条线限制。因此微波遥感是一种全天候、全天时的遥感技术。print(答案一) answer1 遥感的微波Microwave Remote Sensing指的是使用微波辐射的散射和辐射信息来分析、识别地物或提取专题信息的技术。微波遥感可以使用人工辐射源如微波雷达发射微波辐射然后根据地物散射该辐射返回的反向反射信号来探测和测距。由于微波波长比可见光和红外波长长因此微波遥感具有较好的穿透能力可以对云层、地表植被、松散沙层和干燥冰雪等物体进行探测且不受光照等条件的限制是一种全天候、全天时的遥感技术。微波遥感中常用的微波辐射源波段为0.8~30cm。 print(answer1) score bleu_score(true_answer, answer1) print(得分, score) print(答案二) answer2 红外线根据其性质可分为近红外、中红外、远红外和超远红外。近红外主要源于太阳辐射中红外主要源于太阳辐射及地物热辐射而远红外和超远红外主要源于地物热辐射。红外波段较宽在此波段地物间不同的反射特性和发射特性均可较好地表现出来因此该波段在遥感成像中有着重要作用。在整个红外波段中进行的遥感统称红外遥感按其内部波段的详细划分可分为近红外遥感和热红外遥感。中红外、远红外和超远红外三者是产生热感的主要原因因此又称为热红外。热红外遥感最大的特点就是具有昼夜工作的能力。由于摄影胶片感光范围的限制除了近红外可用于摄影成像外其他波段不能用于摄影成像而整个红外波段都可用于扫描成像。 print(answer2) score bleu_score(true_answer, answer2) print(得分, score)运行代码测试一下 可以看到答案与标准答案一致性越高则打分评估就越高通过这种方法我们同样只需要对一个验证集中的每一个问题构造一个标准答案之后就可以实现自动、高效的评估 这种方法的缺点 需要人工构建标准答案某些垂直领域而言构建标准答案相对比较空难通过相似度判断如果生成回答与标准答案高度相似但关键位置恰恰相反则会导致答案啊完全错误但是依旧有很高的BLEU打分通过计算与标准答案一致性灵活性很差如果模型生成了比标准答案更好的回答但评估得分反而会降低无法评估回答的智能性、流畅性。如果回答是各个标准答案中的关键词拼接出来的我们认为这样的回答是不可用无法理解的但 bleu 得分会较高。 利用Embedding向量相似度来打分怎么样或者使用LLM为LLM打分 3. 使用大模型进行评估 使用人工评估成本高效率低 使用简单自动化评估效率高但质量低 那什么样的评估方法可以兼并两者的优点呢 LLM的发展为我们提供了一种新的方法——使用大模型来评估我们可以通过提示词工程来让LLM充当一个老师的身份对我们的LLM应用进行评估由于其强大的泛化性其既可以满足多维评估和量化评估又因为其作为API的特性我们可以24小时调用它因此大模型评估可以看做是人工评估的最佳替代 例如我们可以构造如下的 Prompt Engineering让大模型进行打分 prompt 你是一个模型回答评估员。 接下来我将给你一个问题、对应的知识片段以及模型根据知识片段对问题的回答。 请你依次评估以下维度模型回答的表现分别给出打分① 知识查找正确性。评估系统给定的知识片段是否能够对问题做出回答。如果知识片段不能做出回答打分为0如果知识片段可以做出回答打分为1。② 回答一致性。评估系统的回答是否针对用户问题展开是否有偏题、错误理解题意的情况打分分值在0~1之间0为完全偏题1为完全切题。③ 回答幻觉比例。该维度需要综合系统回答与查找到的知识片段评估系统的回答是否出现幻觉打分分值在0~1之间,0为全部是模型幻觉1为没有任何幻觉。④ 回答正确性。该维度评估系统回答是否正确是否充分解答了用户问题打分分值在0~1之间0为完全不正确1为完全正确。⑤ 逻辑性。该维度评估系统回答是否逻辑连贯是否出现前后冲突、逻辑混乱的情况。打分分值在0~1之间0为逻辑完全混乱1为完全没有逻辑问题。⑥ 通顺性。该维度评估系统回答是否通顺、合乎语法。打分分值在0~1之间0为语句完全不通顺1为语句完全通顺没有任何语法问题。⑦ 智能性。该维度评估系统回答是否拟人化、智能化是否能充分让用户混淆人工回答与智能回答。打分分值在0~1之间0为非常明显的模型回答1为与人工回答高度一致。你应该是比较严苛的评估员很少给出满分的高评估。 用户问题 ~~~ {} ~~~ 待评估的回答 ~~~ {} ~~~ 给定的知识片段 ~~~ {} ~~~ 你应该返回给我一个可直接解析的 Python 字典字典的键是如上维度值是每一个维度对应的评估打分。 不要输出任何其他内容。运行代码进行测试 可以看到通过LLM评估的结果又快有准 大模型评估的问题 评估大模型基座模型要优于被评估基座模型回答结果不能太长或者评价维度太多 解决方案 拆分评估维度。如果评估维度太多模型可能会出现错误格式导致返回无法解析可以考虑将待评估的多个维度拆分每个维度调用一次大模型进行评估最后得到统一结果合并评估维度。如果评估维度太细模型可能无法正确理解以至于评估不正确可以考虑将待评估的多个维度合并例如将逻辑性、通顺性、智能性合并为智能性等 3… 提供详细的评估规范。如果没有评估规范模型很难给出理想的评估结果。可以考虑给出详细、具体的评估规范从而提升模型的评估能力提供少量示例。模型可能难以理解评估规范此时可以给出少量评估的示例供模型参考以实现正确评估。 4.混合评估 就像是决策树与随机森林的关系在业务开发中我们要具体问题具体分析评估方法没有最好的只有最合适的因此我们要针对不同的问题进行针对分析我们更推荐多种评估方法混合评估对评估问题进行分类不同的类别使用不同的评估方式以个人知识库为例 客观题具有标准答案的题目可以构造客观题自动评估和答案相似性进行加权评估主观题构造客观题自动评估大模型分维度综合评估回答结果是否智能因为模型回答的智能性与问题弱相关通过对评价结果中少许抽样人工分析Prompt和模型来评估知识查找正确性知识查找正确性指对于特定问题从知识库检索到的知识片段是否正确、是否足够回答问题。知识查找正确性推荐使用大模型进行评估即要求模型判别给定的知识片段是否足够回答问题。同时该维度评估结果结合主观正确性可以计算幻觉情况即如果主观回答正确但知识查找不正确则说明产生了模型幻觉。 二、生成内容评估优化 在前面的章节中我们讲到了如何评估一个基于 RAG 框架的大模型应用的整体性能。通过针对性构造验证集可以采用多种方法从多个维度对系统性能进行评估。但是评估的目的是为了更好地优化应用效果要优化应用性能我们需要结合评估结果对评估出的 Bad Case 进行拆分并分别对每一部分做出评估和优化。 AG 全称为检索增强生成因此其有两个核心部分检索部分和生成部分。检索部分的核心功能是保证系统根据用户 query 能够查找到对应的答案片段而生成部分的核心功能即是保证系统在获得了正确的答案片段之后可以充分发挥大模型能力生成一个满足用户要求的正确回答。 优化一个大模型应用我们往往需要从这两部分同时入手分别评估检索部分和优化部分的性能找出 Bad Case 并针对性进行性能的优化。而具体到生成部分在已限定使用的大模型基座的情况下我们往往会通过优化 Prompt Engineering 来优化生成的回答。在本章中我们将首先结合我们刚刚搭建出的大模型应用实例——个人知识库助手向大家讲解如何评估分析生成部分性能针对性找出 Bad Case并通过优化 Prompt Engineering 的方式来优化生成部分 ###1.初始化检索链 2. 少样本提升回答质量 寻找 Bad Case 的思路有很多最直观也最简单的就是评估直观回答的质量结合原有资料内容判断在什么方面有所不足。例如上述的测试我们可以构造成一个 Bad Case 我们再针对性地修改 Prompt 模板加入要求其回答具体并去掉“谢谢你的提问”的部分 可以看到改进后的 v2 版本能够给出更具体、详细的回答解决了之前的问题。但是我们可以进一步思考要求模型给出具体、详细的回答是否会导致针对一些有要点的回答没有重点、模糊不清我们测试以下问题 可以看到针对我们关于 LLM 课程的提问模型回答确实详细具体也充分参考了课程内容但回答使用首先、其次等词开头同时将整体答案分成了4段导致答案不是特别重点清晰不容易阅读。因此我们构造以下 Bad Case 针对该 Bad Case我们可以改进 Prompt要求其对有几点的答案进行分点标号让答案清晰具体 升回答质量的方法还有很多核心是围绕具体业务展开思考找出初始回答中不足以让人满意的点并针对性进行提升改进此处不再赘述。 3. 标明知识来源提升可信度 原始提问 们可以要求模型在生成回答时注明知识来源这样可以避免模型杜撰并不存在于给定资料的知识同时也可以提高我们对模型生成答案的可信度代码如下 运行结果如下 但是附上原文来源往往会导致上下文的增加以及回复速度的降低我们需要根据业务场景酌情考虑是否要求附上原文。 4.构造思维链 大模型往往可以很好地理解并执行指令但模型本身还存在一些能力的限制例如大模型的幻觉、无法理解较为复杂的指令、无法执行复杂步骤等。我们可以通过构造思维链将 Prompt 构造成一系列步骤来尽量减少其能力限制例如我们可以构造一个两步的思维链要求模型在第二步做出反思以尽可能消除大模型的幻觉问题。 我们首先有这样一个 Bad Case 问题我们应该如何去构造一个 LLM 项目 初始回答略 存在不足事实上知识库中中关于如何构造LLM项目的内容是使用 LLM API 去搭建一个应用模型的回答看似有道理实则是大模型的幻觉将部分相关的文本拼接得到存在问题question 我们应该如何去构造一个LLM项目 result qa_chain({query: question}) print(result[result])Copy to clipboardErrorCopied对此我们可以优化 Prompt将之前的 Prompt 变成两个步骤要求模型在第二个步骤中做出反思 template_v4 请你依次执行以下步骤 ① 使用以下上下文来回答最后的问题。如果你不知道答案就说你不知道不要试图编造答案。 你应该使答案尽可能详细具体但不要偏题。如果答案比较长请酌情进行分段以提高答案的阅读体验。 如果答案有几点你应该分点标号回答让答案清晰具体。 上下文 {context} 问题: {question} 有用的回答: ② 基于提供的上下文反思回答中有没有不正确或不是基于上下文得到的内容如果有回答你不知道 确保你执行了每一个步骤不要跳过任意一个步骤。 QA_CHAIN_PROMPT PromptTemplate(input_variables[context,question],templatetemplate_v4) qa_chain RetrievalQA.from_chain_type(llm,retrievervectordb.as_retriever(),return_source_documentsTrue,chain_type_kwargs{prompt:QA_CHAIN_PROMPT})question 我们应该如何去构造一个LLM项目 result qa_chain({query: question}) print(result[result])可以看出要求模型做出自我反思之后模型修复了自己的幻觉给出了正确的答案。我们还可以通过构造思维链完成更多功能此处就不再赘述了欢迎读者尝试。 5. 增加一个输出解析 这一步也就是我们之前说的输出解析器通过限定格式和每个输出的类型使其结果更加专业化代码如下 通过上述讲解的思路结合实际业务情况我们可以不断发现 Bad Case 并针对性优化 Prompt从而提升生成部分的性能。但是上述优化的前提是检索部分能够检索到正确的答案片段也就是检索的准确率和召回率尽可能高。那么如何能够评估并优化检索部分的性能呢下一章我们会深入探讨这个问题。 三、检索内容评估优化 我们讲解了如何针对生成部分评估优化 Prompt Engineering来提高大模型的生成质量。但生成的前提是检索只有当我们应用的检索部分能够根据用户 query 检索到正确的答案文档时大模型的生成结果才可能是正确的。因此检索部分的检索精确率和召回率其实更大程度影响了应用的整体性能。但是检索部分的优化是一个更工程也更深入的命题我们往往需要使用到很多高级的、源于搜索的进阶技巧并探索更多实用工具甚至手写一些工具来进行优化。因此在本章中我们仅大致讨论检索部分评估与优化的思路 1. 评估检索效果 针对用户输入的一个 query系统会将其转化为向量并在向量数据库中匹配最相关的文本段然后根据我们的设定选择 35 个文本段落和用户的 query 一起交给大模型再由大模型根据检索到的文本段落回答用户 query 中提出的问题。在这一整个系统中我们将向量数据库检索相关文本段落的部分称为检索部分将大模型根据检索到的文本段落进行答案生成的部分称为生成部分。 因此检索部分的核心功能是找到存在于知识库中、能够正确回答用户 query 中的提问的文本段落。因此我们可以定义一个最直观的准确率在评估检索效果对于 N 个给定 query我们保证每一个 query 对应的正确答案都存在于知识库中。假设对于每一个 query系统找到了 K 个文本片段如果正确答案在 K 个文本片段之一那么我们认为检索成功如果正确答案不在 K 个文本片段之一我们任务检索失败。那么系统的检索准确率可以被简单地计算为 accuracyNM 其中M 是成功检索的 query 数。 通过上述准确率我们可以衡量系统的检索能力对于系统能成功检索到的 query我们才能进一步优化 Prompt 来提高系统性能。对于系统检索失败的 query我们就必须改进检索系统来优化检索效果。但是注意当我们在计算如上定义的准确率时一定要保证我们的每一个验证 query 的正确答案都确实存在于知识库中如果正确答案本就不存在那我们应该将 Bad Case 归因到知识库构建部分说明知识库构建的广度和处理精度还有待提升。 当然这只是最简单的一种评估方式事实上这种评估方式存在很多不足。例如 ● 有的 query 可能需要联合多个知识片段才能做出回答对于这种 query我们如何评估 ● 检索到的知识片段彼此之间的顺序其实会对大模型的生成带来影响我们是否应该将检索片段的排序纳入考虑 ● 除去检索到正确的知识片段之外我们的系统还应尽量避免检索到错误的、误导性知识片段否则大模型的生成结果很可能被错误片段误导。我们是否应当将检索到的错误片段纳入指标计算 上述问题都不存在标准答案需要针对项目实际针对的业务、评估的成本来综合考虑。 除去通过上述方法来评估检索效果外我们还可以将检索部分建模为一个经典的搜索任务。让我们来看看经典的搜索场景。搜索场景的任务是针对用户给定的检索 query从给定范围的内容一般是网页中找到相关的内容并进行排序尽量使排序靠前的内容能够满足用户需求。 其实我们的检索部分的任务和搜索场景非常类似同样是针对用户 query只不过我们相对更强调召回而非排序以及我们检索的内容不是网页而是知识片段。因此我们可以类似地将我们的检索任务建模为一个搜索任务那么我们就可以引入搜索算法中经典的评估思路如准确率、召回率等和优化思路例如构建索引、重排等来更充分地评估优化我们的检索效果。这部分就不再赘述欢迎有兴趣的读者进行深入研究和分享。 二、优化检索的思路 上文陈述来评估检索效果的几种一般思路当我们对系统的检索效果做出合理评估找到对应的 Bad Case 之后我们就可以将 Bad Case 拆解到多个维度来针对性优化检索部分。注意虽然在上文评估部分我们强调了评估检索效果的验证 query 一定要保证其正确答案存在于知识库之中但是在此处我们默认知识库构建也作为检索部分的一部分因此我们也需要在这一部分解决由于知识库构建有误带来的 Bad Case。在此我们分享一些常见的 Bad Case 归因和可行的优化思路。 知识片段被割裂导致答案丢失 该问题一般表现为对于一个用户 query我们可以确定其问题一定是存在于知识库之中的但是我们发现检索到的知识片段将正确答案分割开了导致不能形成一个完整、合理的答案。该种问题在需要较长回答的 query 上较为常见。 该类问题的一般优化思路是优化文本切割方式。我们在《C3 搭建知识库》中使用到的是最原始的分割方式即根据特定字符和 chunk 大小进行分割但该类分割方式往往不能照顾到文本语义容易造成同一主题的强相关上下文被切分到两个 chunk 总。对于一些格式统一、组织清晰的知识文档我们可以针对性构建更合适的分割规则对于格式混乱、无法形成统一的分割规则的文档我们可以考虑纳入一定的人力进行分割。我们也可以考虑训练一个专用于文本分割的模型来实现根据语义和主题的 chunk 切分。query 提问需要长上下文概括回答 该问题也是存在于知识库构建的一个问题。即部分 query 提出的问题需要检索部分跨越很长的上下文来做出概括性回答也就是需要跨越多个 chunk 来综合回答问题。但是由于模型上下文限制我们往往很难给出足够的 chunk 数。 该类问题的一般优化思路是优化知识库构建方式。针对可能需要此类回答的文档我们可以增加一个步骤通过使用 LLM 来对长文档进行概括总结或者预设提问让 LLM 做出回答从而将此类问题的可能答案预先填入知识库作为单独的 chunk来一定程度解决该问题。关键词误导 该问题一般表现为对于一个用户 query系统检索到的知识片段有很多与 query 强相关的关键词但知识片段本身并非针对 query 做出的回答。这种情况一般源于 query 中有多个关键词其中次要关键词的匹配效果影响了主要关键词。 该类问题的一般优化思路是对用户 query 进行改写这也是目前很多大模型应用的常用思路。即对于用户输入 query我们首先通过 LLM 来将用户 query 改写成一种合理的形式去除次要关键词以及可能出现的错字、漏字的影响。具体改写成什么形式根据具体业务而定可以要求 LLM 对 query 进行提炼形成 Json 对象也可以要求 LLM 对 query 进行扩写等。匹配关系不合理 该问题是较为常见的即匹配到的强相关文本段并没有包含答案文本。该问题的核心问题在于我们使用的向量模型和我们一开始的假设不符。在讲解 RAG 的框架时我们有提到RAG 起效果是有一个核心假设的即我们假设我们匹配到的强相关文本段就是问题对应的答案文本段。但是很多向量模型其实构建的是“配对”的语义相似度而非“因果”的语义相似度例如对于 query-“今天天气怎么样”会认为“我想知道今天天气”的相关性比“天气不错”更高。 该类问题的一般优化思路是优化向量模型或是构建倒排索引。我们可以选择效果更好的向量模型或是收集部分数据在自己的业务上微调一个更符合自己业务的向量模型。我们也可以考虑构建倒排索引即针对知识库的每一个知识片段构建一个能够表征该片段内容但和 query 的相对相关性更准确的索引在检索时匹配索引和 query 的相关性而不是全文从而提高匹配关系的准确性。 优化检索部分的思路还有很多事实上检索部分的优化往往是 RAG 应用开发的核心工程部分。限于篇幅原因此处就不再赘述更多的技巧及方 文章参考 OpenAI官方文档DeepSeek官方文档Mistral官方文档ChatGLM官方文档 项目地址 Github地址拓展阅读专栏文章 如果觉得我的文章对您有帮助三连关注便是对我创作的最大鼓励或者一个star也可以.
http://www.hkea.cn/news/14435694/

相关文章:

  • 网站移动端seowordpress模板淘客
  • 贵州交通建设集团有限公司网站海外信息流推广怎么做
  • asp婚纱摄影网站源码网站备案需要把网站做好吗
  • 专做机械类毕业设计的网站搜狐网站建设
  • 个人网站模板源码下载wordpress隐私
  • 公司做一个网站新人写手适合哪个平台
  • 微信建设网站找哪家网站开发域名注册功能
  • 贵阳网站推广代理公司英文
  • 如何做论坛网站 知乎南方网通g3云推广
  • wordpress网站做成app6写一个小程序大概要多少钱
  • 做手机网站公司广东泰通建设有限公司网站
  • 江苏省交通运输厅门户网站建设管理中心建站公司还赚钱吗
  • 网站建设技术方面论文产品网络推广怎样做
  • 网站建设交印花税韶关住房和城乡建设网站
  • 企业怎么做好网站优化龙泉驿建设局网站
  • 云购网站建设wordpress本地数据库
  • 免费建立企业网站什么是电子商务行业
  • 做采购 通常在什么网站看编程语言
  • 成都高端定制网站在线文字logo设计
  • 成都学校网站建软件外包公司怎么经营
  • 网站建设案例模板下载国外网站鞋子做的好的网站
  • 门户网站的建设方案做的好的排版网站
  • 美工培训班哪家好seo短视频网页入口营销策略
  • 网站的建设与维护实践报告中关村网站建设公司
  • 修改公司网站做网站设计最好的公司
  • 青羊区定制网站建设报价wordpress页面音乐播放器
  • 唐山市住房城乡建设部网站主页手机网站设计需要学什么
  • 帝国cms 网站迁移错版做地产的设计网站
  • 长宁广州网站建设被黑网站
  • 台州网站建设找哪家好点医疗器械注册证