当前位置: 首页 > article >正文

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

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

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

http://www.kler.cn/a/107451.html

相关文章:

  • 利用编程语言和脚本编写技术,实现自动化渗透测试和安全工具的开发
  • 分享 pdf 转 word 的免费平台
  • Git在版本控制中的应用
  • 鸿蒙HarmonyOS 地图不显示解决方案
  • C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
  • sql server 查看io资源使用
  • 基于Ubuntu20.04安装ROS系统
  • ROS自学笔记十六:URDF优化_xacro文件
  • ChineseChess5 2023.10.28
  • SSD1306 oled显示屏的驱动SPI接口
  • verilog vscode linux
  • 用示例和应用程序了解必要的Golang库
  • 浅谈分布式系统
  • 城市群(Megalopolis)/城际(inter-city)OD相关研究即Open Access数据集调研
  • spring boot利用redis作为缓存
  • ArcGIS中批量mxd高版本转低版本
  • 自定义命名并将文件扩展名改为大写字母,轻松掌握文件管理!
  • S7-200 SMART与ABB ACS580变频器进行MODBUS RTU通信的具体方法示例
  • 三篇论文:速览GPT在网络安全最新论文中的应用案例
  • Debezium日常分享系列之:Debezium2.4版本之用于 MongoDB的Debezium 连接器
  • 【C++初阶(三)】引用内联函数auto关键字
  • 我的创作纪念日 - 2048
  • 基础课11——数据来源
  • MyBatisPlus创建新的Mapper.xml映射文件而不使用框架自带的?
  • 【axios】axios的基本使用
  • Ubuntu 22.04 安装 Terraform