基于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:问题"审理(2019)川0129民初1361号案件的法院名称是哪个法院,地址在什么地方",要回答这个问题,需要先根据案号'(2019)川0129民初1361号'取出法院代字川0129,然后根据法院代字查询法院名称,最后根据法院名称查询法院地址信息。
- 例子2:问题"(2020)赣0781民初1260号案件的审理法院的官网网址是什么",要回答这个问题,需要先根据案号'(2020)赣0781民初1260'取出法院代字"赣0781", 然后根据法院代字查询法院名称,最后根据法院名称查询法院网址信息。
- 例子3:问题"公司代码为301012有关联的案件审理法院的级别是什么",要回答这个问题,要利用“公司代码”301012调用“companyinfogetter”这个工具查询公司名称信息。 工具的选择至关重要,例如问题"统一社会信用代码是913310007200456372这家公司的法人是谁"必选先使用'根据统一社会信用代码查询公司名称'相关工具获得 公司名称,再使用'根据公司名称查询工商信息'的工具获得法人。 另外一个例子,问题"9165292274222840XN这家公司作为原告的案件中,它雇佣的律师事务所的联系方式是什么", 必选先使用'根据统一社会信用代码查询公司名称'相关工具,其中统一社会信用代码是9165292274222840XN。再用该公司作为关联公司查询案件信息。 关键补充 出现公司代码,必须只能调用“companyinfogetter”这个工具。出现"被投资"需要调用“getsubcompany_info”这个工具查询母公司信息。出现“案号”查法院要先提取法院代字。 请输出推理全过程和每个步骤。 """
评论