LangChain+LLM实战---自定义模拟实现LLM

代码实现

from typing import Any, List, Mapping, Optional
from langchain.callbacks.manager import CallbackManagerForLLMRun
from langchain.llms.base import LLM
import re


class TfboyLLM(LLM):

    @property
    def _llm_type(self) -> str:
        return "custom"

    def _call(
            self,
            prompt: str,
            stop: Optional[List[str]] = None,
            run_manager: Optional[CallbackManagerForLLMRun] = None,
    ) -> str:
        print("问题:", prompt)
        pattern = re.compile(r'^.*(\d+[*/+-]\d+).*$')
        match = pattern.search(prompt)
        if match:
            result = eval(match.group(1))
        elif "?" in prompt:
            rep_args = {"我": "你", "你": "我", "吗": "", "?": "!"}
            result = [(rep_args[c] if c in rep_args else c) for c in list(prompt)]
            result = ''.join(result)
        else:
            result = "很抱歉,请换一种问法。比如:1+1等于几"
        return result

    @property
    def _identifying_params(self) -> Mapping[str, Any]:
        return {}

代码说明

TfboyLLM继承了langchain.llms.baseLLM类。需要实现它的两个方法:

  • _call: 主要的处理方法,对传来的prompt问题分析,给他return一个答案。
  • _identifying_params: 说明LLM类中的参数和数值。本例中没有类的成员变量。

其实关键_call中实现的逻辑:

  • 收到prompt先打印出来。
  • 对问题正则匹配,规则为:[数字]+[运算符]+[数字]。匹配到,返回计算结果。匹配不到继续执行。
  • 判断有没有[?]。如果有,则对文本中字符进行替换,规则为:我->你, 你->我, 吗->"", ?->!。
  • 如果都不符合,就返回:“很抱歉,请换一种问法。比如:1+1等于几”。

构建完了之后,调用这个TfboyLLM也很简单,和调用OpenAI一样。

  • llm = TfboyLLM()
  • print("答案:",llm("我能问你问题吗?"))

输出结果

问题: 巴拉巴拉咕嘎咕嘎
-- 很抱歉,请换一种问法。比如:1+1等于几

问题: 我能问你问题吗?
-- 你能问我问题!

问题: 189+981是多少
-- 990

问题: 你能和我结婚吗?
-- 我能和你结婚!

问题: 开玩笑?
-- 开玩笑!

你可能感兴趣的:(LangChain-LLM,langchain,python)