LawGLM-kelvincjr

我要开发同款
匿名用户2024年07月31日
15阅读
所属分类ai
开源地址https://modelscope.cn/models/kelvincjr/LawGLM-kelvincjr

作品详情

基于langchain框架开发的agent

全量问题主程序运行:python answer.py

单个问题debug和refine:python debug.py

创新点是在langchain中加入了回调部分和一些prompt的提示

通过callback保存所有的对话信息

class MyCustomHandlerOne(BaseCallbackHandler): def onllmstart(self, serialized: Dict[str, Any], prompts: List[str], **kwargs: Any) -> Any: pass

def on_llm_new_token(self, token: str, **kwargs: Any) -> Any:
    pass

def on_chat_model_start(self, serialized: Dict[str, Any], messages: List[List[BaseMessage]], **kwargs: Any) -> Any:
    #print(f"on_chat_model_start: ", messages)  
    llm_messages.append(messages)

    for message in messages:
        for part in message:
            if isinstance(part, ToolMessage):
                tool_message = part
                func_name = tool_message.additional_kwargs["name"]
                tool_call_id = tool_message.tool_call_id
                content = tool_message.content
                content = content.replace("\'", "\"")
                resp = json.loads(content)
                #resp = json.loads(json.dumps(eval(content)))
                if "公司名称" in resp:
                    tool_call_dict[func_name] = resp["公司名称"]
                if "原告律师事务所" in resp:
                    tool_call_dict[func_name+"_"+"原告律师事务所"] = resp["原告律师事务所"]
                if "被告律师事务所" in resp:
                    tool_call_dict[func_name+"_"+"被告律师事务所"] = resp["被告律师事务所"]
                if "原告" in resp:
                    tool_call_dict[func_name+"_"+"原告"] = resp["原告"]
                if "被告" in resp:
                    tool_call_dict[func_name+"_"+"被告"] = resp["被告"]
                if "企业地址" in resp:
                    tool_call_dict[func_name+"_"+"企业地址"] = resp["企业地址"]

def on_llm_error(self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> Any:
    """当 LLM 出错时运行。"""
    pass

def on_chain_start(self, serialized: Dict[str, Any], inputs: Dict[str, Any], **kwargs: Any) -> Any:
    pass

def on_tool_start(self, serialized: Dict[str, Any], input_str: str, **kwargs: Any) -> Any:
    pass

def on_agent_action(self, action: AgentAction, **kwargs: Any) -> Any:
    #print(f"on_agent_action {action}")
    pass

def on_agent_finish(self, finish: AgentFinish, **kwargs: Any) -> Any:
    pass

def on_tool_end(self, output: str, **kwargs: Any) -> Any:
    #print(f"on_tool_end {output}")
    pass

handler1 = MyCustomHandlerOne()

agent_prompt = """ 你是一个法律行业的智能助手,擅长对用户问题进行拆解多个步骤,并一步一步推理,并且根据逻辑顺序一步一步调用工具,最后将推理结果组合成答案。 工具调用顺序至关重要,例如问题"(2019)内民终564号案件的被告律师事务所地址在什么地方"需要先根据案号查询到律师事务所,再去查询律师事务所地址, 不能直接先查询到律师事务所或地址,一定要先查询案号。 提取出问题中的关键信息非常重要

  1. 例子1:问题"审理(2019)川0129民初1361号案件的法院名称是哪个法院,地址在什么地方",要回答这个问题,需要先根据案号'(2019)川0129民初1361号'取出法院代字川0129,然后根据法院代字查询法院名称,最后根据法院名称查询法院地址信息。
  2. 例子2:问题"(2020)赣0781民初1260号案件的审理法院的官网网址是什么",要回答这个问题,需要先根据案号'(2020)赣0781民初1260'取出法院代字"赣0781", 然后根据法院代字查询法院名称,最后根据法院名称查询法院网址信息。
  3. 例子3:问题"公司代码为301012有关联的案件审理法院的级别是什么",要回答这个问题,要利用“公司代码”301012调用“companyinfogetter”这个工具查询公司名称信息。 工具的选择至关重要,例如问题"统一社会信用代码是913310007200456372这家公司的法人是谁"必选先使用'根据统一社会信用代码查询公司名称'相关工具获得 公司名称,再使用'根据公司名称查询工商信息'的工具获得法人。 另外一个例子,问题"9165292274222840XN这家公司作为原告的案件中,它雇佣的律师事务所的联系方式是什么", 必选先使用'根据统一社会信用代码查询公司名称'相关工具,其中统一社会信用代码是9165292274222840XN。再用该公司作为关联公司查询案件信息。 关键补充 出现公司代码,必须只能调用“companyinfogetter”这个工具。出现"被投资"需要调用“getsubcompany_info”这个工具查询母公司信息。出现“案号”查法院要先提取法院代字。 请输出推理全过程和每个步骤。 """
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论