Skip to content

理解:Evaluation框架(deepeval等)

(手写的草稿)

期望达成目标

理解:Evaluation框架(deepeval等)

笔记和总结

Further Exploration

  1. 当准备golden test case的时候,如何验证coverage ?这个coverage如何定义我们得到的测试用例覆盖了更多的业务场景,还是当前已有例子的简单重复?(taxonomy矩阵人工分类、semhash/Cleanlab Datalab做近似去重、Vendi Score做多样性趋势、SemDeDup/D4/text-dedup这类预训练语料去重方法)
  2. deepeval提供了span,这里提供了runtime阶段查桩直接链接运行时数据信息到测试用例或者监控这一块的内容,这里需要重点思考在claude code engine可以如何处理,以及为什么这是一种general的方案,而不是transcript更有效。
  3. 理解deepeval的span系统,因为很多fine-grained的测试都是基于trace的
  4. deepeval提供了很多SOTA的metrics,如何对metrics本身做测试和评估
  5. deepeval提供了很多metrics的生成模版(geval/dag/Conversational/G-Eval/etc),还有内置的metrics,metrics如何从外部输入转换到内部更详细的定义呢?

  6. 对于prompt的优化(https://deepeval.com/docs/prompt-optimization-introduction),迭代次数和优化有正相关么,threshold在那里?是否存在最优,为什么只需要提供golden可以对其做优化呢?

Metrics定义的具体形式

https://deepeval.com/docs/metrics-introduction Geval 使用了COT的知识,也就是说根据实验,将思维链路显性生成出来的结果会更好。部分是可以证明的,比如说有些问题天然需要多步骤,模型一次向前计算只有固定深度,多次得出中间结论可以突破这种深度的限制。Geval有两坨COT,第一部分是从scenario根据COT的方式,来生成评分的每个step,第二部分是根据steps,要求LLM通过COT的方式来执行每一步并评分, 主要是一种prompt的方式,但这种COT的能力是需要被模型支持的(todo:如何测试模型COT的能力呢?可以看看CoT faithfulness,最直接相关的是 Anthropic 2023 年的一篇论文《Measuring Faithfulness in Chain-of-Thought Reasoning》)

DAG的话把期望定义的流程放在图里表达出来,然后带着rubric对每一步做评分,deepeval会给出一个总分输出。LLM决定,现在在状态A集合里,具体是哪个event a_n,
然后告诉deepeval,deepeval看a_n附带的信息,做状态转移,记录评分,开始状态B的评估。也就是说,状态机器是llm已经知道全部执行信息的时候判断的,但每次只告诉llm一步让他给出答案 。具体来讲,deepeval控制构造,当output + A 作出a_n的结论后,deepeval转移到B,下一轮是纯粹的output +B , 前面关于A的已经不在下一轮的请求里了。

有些预定义好的metrics,比如TaskCompletionMetric,基于运行的trace调用下层的LLM完成评判,这里重要的思路是判断任务的完成程度需要去详细检查具体的trace内容,而不是单纯的outcome内容,具体模版可以直接看 TaskCompletionMetric模版内容,效率评分基本上是类似的,可以看模版。

关于RAG,AnswerRelevancy只关注输入输出不关心具体的信息,而FaithfulnessMetric就需要retrieval context去判断,但是都是由模版构造出来的。剩下的可以在具体用到的时候查表看。

Synthetic Data Generation https://deepeval.com/docs/synthetic-data-generation-introduction

本章专注于如何使用deepeval的框架生成数据,这个适用于产品开荒,已经有些产品文档,尝试从给人的产品里拿出来然后给ai用。所以这里主要关注的内容应该是(1)生成的数据是否可以很好的覆盖文档里已有的内容 (2)生成的内容是否精准准确 (3) 是否可以在相似度较高的地方生成针对性的样例。

synthezer 第一步Input Generation,它会走with/without context来生成input,也就是说会只通过产品的简介,以及阅读更详细的内容生成一批问题。然后第二步是filtration,根据是否self-contain 还有clarity的标准来校验,如果没满足既定标准就会重新生成。第三步evolution,在通过筛选后,会把input重写成更复杂也更真实,第四步是styling,把输入重写成期望的格式内容。这里面都是通过llm prompts来完成的,比如说第二步filtration,直接就是在 prompts里面要求去做。

这里面比较复杂的内容在于框架做了什么样的内容,让输入的文本可以结构化。DeepEval 这里: 随机抽一个 seed chunk → 在向量库中找它的 nearest neighbors → seed + 邻居临时组成一个 context → 用于生成一批 golden

所以更准确叫:

以随机 seed 为中心的局部语义邻域(nearest-neighbor grouping)

在input generation抽取context然后生成input 后,evolve会注入新的改写指令,一并构造input时候拿到的context,要求LLM去做改写和打磨,让问题更加的详细符合场景。

Comments