合同审核
目标
提前设置有关合同审核的维度或问题,上传合同文件后,系统自动对预置的问题逐个执行问答,最终生成合同审核报告。在合同审核场景中,有很多不同的审核维度,我们选取三个具有代表性的问题:
合同中约定了有关知识产权的权属条款吗?
是否存在类问题
合同中首尾部主体名称一致吗?
一致性校验
合同中违约金利率的设置是否符合规范?要求以合同签订当月中国人民银行授权全国银行间同业拆借中心公布的一年期贷款市场报价利率(LPR)标准为基础,不能超过 LPR 的 150%。
涉及逻辑推理的复杂判断问题
效果示例

构建思路
针对这三个问题分析技能所需的组件:
需要根据文本内容进行问答,因此选择语言模型ChatOpenAI组件(或其他语言模型组件)、RetrievalQA组件、CombineDocsChain组件、Milvus组件、OpenAIEmbeddings组件,组成对文本进行问答的链;
需要让用户上传待审核的合同文件,因此选择PyPDFLoader组件和InputFileNode组件;
回答第三个问题需要知道合同签订当月的 LPR,因此需要联网进行搜索,选择BingSearchRun组件、BingSearchAPIWrapper 组件;
回答第三个问题还涉及到对比计算,选择Calculator组件提供计算能力(大语言模型具备一定的计算能力,也可以选择不添加 Calculator 组件);
选择ZeroShotAgent组件把所有部分连接起来,BingSearchRun 组件和 Calculator 组件是[工具/Tools]类型下的组件,因此可以直接和[代理/Agents]连接,对文本进行问答的链想要与[代理/Agents]连接,需要引入Tool组件,把整个对文本进行问答的链作为工具与[代理/Agents]连接;
需要提前设置审核问题,因此选择Input Node组件。
连接示例如图:

工作原理
用户上传文档并解析完成后,ZeroShotAgent 组件会自动逐个运行预置的审核问题,并且每个问题自行选择调用哪个工具(一个或多个)来回答,逐个问题得到答案后最终将所有问题的答案拼接在一起生成审核报告。
组件参数设置
ChatOpenAI
Model Name:推荐选择 gpt-3.5-turbo-16k-0613
OpenAI API Key:API 接口密钥
OpenAI API Base/OpenAI Proxy:服务的地址,填写其中之一即可(如果是自己代理的国内的地址则填写 OpenAI Proxy 参数)
Milvus
Collection Name:用户上传文件后会自动创建一个库,无需填写
OpenAIEmbeddings
Tiktoken Model Name:模型名称,推荐使用 text-embedding-ada-002
OpenAI API Key:API 接口密钥
OpenAI API Base/OpenAI Proxy:服务的地址,填写其中之一即可(如果是自己代理的国内的地址则填写 OpenAI Proxy 参数)
CombineDocsChain
Chain Type:选择“stuff”,原因详见CombineDocsChain
token_max:“-1”,即对传给大模型的文本长度不做限制,详见CombineDocsChain
BingSearchAPIWrapper
Bing Search Url
Bing Subscription Key
Tool
Description:对工具的描述,ZeroShotAgent 组件根据描述判断是否调用这个工具。这里可以填写“如果需要知道关于这份合同的各方面信息,可以使用该工具。”
Name:工具的名称,这里设置为“Basic_information”,表示合同的基础信息
InputNode:预置的问题,这里填入开头列出的三个问题
ZeroShotAgent
Format Instructions:指导 ZeroShotAgent 运行的方式
input_variables:最终的提示词所需要的输入变量列表,对应 Suffix 中的变量,即{query}和{agent_scratchpad}
prefix:放在工具列表之前的字符串,作为提示词模板的开头
suffix:放在工具列表后面的字符串,作为提示词模板的结尾
优化
如果问题的答案不完全正确,或无法给出答案,可以尝试使用以下方法对技能进行优化,提升效果。
问题优化
提问的方式极大程度上决定了大模型输出内容的质量,一个简单的方法是把复杂的问题拆解成简单的问题,手动让大模型“step by step”。例如第二个问题“合同中首尾部主体名称一致吗?”其实包含两个步骤,首先我们要找到首尾部的甲方、乙方主体名称分别是什么,再判断这些名称是否一致。所以为了提升这个问题答案的准确性,我们可以把这个问题拆解成两个问题:“合同中提到了几次甲方名称?这些甲方名称都一样吗?”例如第三个问题“合同中违约金利率的设置是否符合规范?要求以合同签订当月中国人民银行授权全国银行间同业拆借中心公布的一年期贷款市场报价利率(LPR)标准为基础,不能超过 LPR 的 150%。”,我们可以把这个复杂问题拆解为 4 个简单的问题:“合同的违约金赔偿利率是多少?合同签订日期是哪一年哪一月?搜索合同签订日期当年当月发布的中国人民银行授权全国银行间同业拆借中心公布的一年期贷款市场报价利率(LPR)是多少?计算合同的违约金赔偿利率大于 LPR 的 150%吗?”前两个问题是合同的相关信息,需要调用[Basic_infomation]工具进行解答,第三个问题需要调用 BingSearchRun 组件联网搜索,最后一个问题需要调用 Calculator 组件进行比较计算。
优化后的效果如图

ZeroShotAgent 组件参数优化
因为 ZeroShotAgent 组件的参数实质上就是提供给大语言模型进行决策的提示词,因此可以在很大程度上影响最终的答案质量。
Prefix
作为提示词模板的开头,默认值为“Answer the following questions as best you can。 You have access to the following tools:”. 我们可以添加更多的背景信息,指导大语言模型工作,例如“You are an expert in the field of contract review”“Think step by step”。
Format Instructions
是提示词的主体部分,指导大模型进行思考、操作,我们可以添加示例,告诉大模型我们希望它这样处理问题,如
Use the following format:
Question: 该合同是根据什么法律签订的?
# the query question you must answer
Thought: 找到该合同的法律依据
# you should always think about what to do
Action: Basic_information
# the action to take, should be one of [{tool_names}]
Action Input: 该合同是根据什么法律签订的?
# the input to the action
Observation:
# the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer:
# the final answer to the original input question
suffix
作为提示词模板的结尾,可以优化输出的内容,比如“Answer the question in Chinese”。
Last updated