Package: bida
bida：简单、易用、稳定、高效，便于扩展和集成的，大语言模型工程化开发框架快速上手从pip或pip3安装最新的bidapip install -U bida新建py文件或Jupyter Notebook：frombidaimportChatLLMllm=ChatLLM(model_type='openai',# 调用openai的chat模型model_name='gpt-4')# 设定模型为：gpt-4，默认是gpt3.5result=llm.chat("从1加到100等于多少？只计算奇数相加呢？")print(result)frombidaimportChatLLMllm=ChatLLM(model_type="baidu",# 调用百度文心一言stream_callback=ChatLLM.stream_callback_func)# 使用默认的流式输出函数llm.chat("你好呀，请问你是谁？")已支持模型 ( 持续更新中... 截止2023年10月，国内开放商用API的模型已经全部支持)模型公司模型类型模型名称是否支持说明OpenAIChatgpt-3.5，gpt-4√支持gpt3.5和gpt4全部模型Text Completiontext-davinci-003√Text 生成类模型Embeddingstext-embedding-ada-002√向量化模型百度-文心一言Chaternie-bot,ernie-bot-turbo√百度商用Chat模型Embeddingsembedding_v1√百度商用向量化模型托管模型各类开源模型√百度托管的各类开源模型，请使用百度第三方模型接入协议自行配置，详见下文的模型接入章节阿里云-通义千问Chatqwen-v1, qwen-plus-v1,qwen-7b-chat-v1√阿里云商用和开源Chat模型Embeddingstext-embedding-v1√阿里云商用向量化模型托管模型各类开源模型√阿里云托管的其他各类开源模型，请使用阿里云第三方模型接入协议自行配置，详见下文的模型接入章节MiniMaxChatabab5, abab5.5√MiniMax商用Chat模型Chat Proabab5.5√MiniMax商用Chat模型, 采用自定义Chatcompletion pro模式，支持多人多bot对话场景，示例对话，返回格式限制，函数调用，插件等功能Embeddingsembo-01√MiniMax商用向量模型智谱AI-ChatGLMChatChatGLM-Pro、Std、Lite,characterglm√智谱AI多版本商用大模型EmbeddingsText-Embedding√智谱AI商用文本向量模型讯飞-星火ChatSparkDesk V1.5, V2.0√讯飞星火认知大模型Embeddingsembedding√讯飞星火文本向量模型商汤-日日新Chatnova-ptc-xl-v1, nova-ptc-xs-v1√SenseNova 商汤日日新大模型百川智能Chatbaichuan-53b-v1.0.0√百川53B大模型腾讯-混元ChatTencent Hunyuan√腾讯混元大模型自行部署的开源模型Chat, Completion, Embeddings各类开源模型√使用FastChat等部署的开源模型，提供的Web API接口遵循OpenAI-Compatible RESTful APIs，可以直接支持，详见下文的模型接入章节注意：以上模型和API能否使用，依赖自行购买开通的模型范围，相关Key需配置完成后才可以（详见下面环境变量章节），购买及开通请联系厂商咨询。如果需要增加模型或增加新的模型公司进来，请参考下面的模型接入章节。如果希望适配你们的模型或提出改进意见，请联系pfzhou@gmail.com缘起与定位- 开发人员切换到面向AIGC开发非常困难AIGC里面的模型LLM和提示词Prompt两项技术都非常新，发展日新月异，理论、教程、工具、工程化等各个方面都非常欠缺，使用的技术栈与当前主流开发人员的经验几乎没有重叠：分类当前主流开发Prompt工程开发模型、微调模型开发语言Java、.Net、Javscript、ABAP等自然语言，PythonPython开发工具非常多和成熟无成熟开发门槛较低且成熟低但非常不成熟非常高开发技术清晰且稳态入门简单但非常难于稳态输出复杂且多变常用技术面向对象、数据库、大数据prompt tunning、incontext learning、embeddingTransformer、RLHF、Finetunning、LoRA开源支持丰富且成熟非常混乱处于较低水平丰富但不成熟开发成本低较高非常高开发人员丰富极度稀缺非常稀缺开发协同模式根据产品经理交付的文档进行开发一人或极简的小组，从需求到交付运营全部工作根据理论研究方向开发- 企业需求非常旺盛，处于快速上升趋势当前，所有的科技公司、互联网公司、大数据公司几乎都在all in这个方向，但更多的传统企业还处于迷茫的状态。传统企业并非不需要，而是： 1) 没有技术人才储备，不知道做什么；2) 没有硬件储备，没有能力做；3) 业务数字化程度底，用AIGC改造升级周期长、见效慢。- 每个模型都提供了API，有的还有完善的SDK，为什么要再封装一遍？目前国内外各种商用、开源模型太多，发展又特别快，不过模型的API、数据对象并不一样，导致我们面对一个新模型（甚至一个新版本），都要去阅读开发文档，并修改自己的应用代码去适配，相信每个应用开发人员都测试过很多个模型，应该都深受其苦。实际上，模型能力虽有不同，但提供能力的模式大体是一致的，因此有一个可以适配大量模型API，提供统一调用模式的框架，就变成了很多开发人员的迫切需求。- 既然如此，这些langchain都有，直接用不好吗，为什么要重复造轮子？首先，bida并非要替代langchain，而是针对的目标定位不同、开发理念也有很大差异：分类langchainbida目标人群AIGC方向的全量开发人群对把AIGC与应用开发结合有迫切需求的开发人员模型支持支持本地部署或远端部署的各种模型仅支持提供Web API的模型调用，目前商用模型大部分都提供，开源模型使用FastChat等框架部署后也可以提供Web API框架结构因为提供的能力多，结构非常复杂，截止2023年8月，核心代码已有1700多个文件，15万行代码，学习门槛较高核心代码十余个，2000行左右代码，学习和修改代码较简单功能支持提供AIGC方向各类模型、技术、应用领域的全覆盖当前提供ChatCompletions、Completions、Embeddings、Function Call等功能支持，语音、图像等多模态功能近期陆续发布Prompt提供Prompt模板，但自有功能使用的Prompt内嵌在代码内，调试和修改都很困难提供Prompt模板，当前无内置功能使用Prompt，将来如果使用，也会采用配置型后加载模式，便于用户自行调整Conversation & Memory支持，并提供多种Memory管理方式支持，支持Conversation持久化（保存至duckdb中），Memory提供限定归档会话能力，其他能力有扩展框架可自行扩展Function & Plugin支持，并提供很丰富的扩展能力，但使用效果依赖大模型的自身能力兼容使用OpenAI的Function Call规范的大模型Agent & Chain支持，并提供很丰富的扩展能力，但使用效果依赖大模型的自身能力不支持，计划另开项目实现，也可基于当前框架自行扩展开发其他功能支持很多其他功能，比如文档拆块（拆块后做embedding，用于实现chatpdf等类似的功能）暂无其他功能，如果增加也会采用另开兼容项目的方式来实现，当前可以使用其他产品提供的能力组合后实现运行效率很多开发者反映比直接调用API慢，原因未知仅封装了调用流程和统一了调用接口，性能与直接调用API没有区别langchain做为业内领军的开源项目，为大模型以及AGI的推广做出了巨大贡献，我们也在项目中应用了它，同时在开发bida时，也借鉴了很多它的模式和思想。但langchain太想做一个大而全的工具，不可避免的也产生了很多缺点，下面几篇文章，意见都差不多：Max Woolf-中文,Hacker News-中文。圈内流行一句话非常好的做了总结：langchain，一个人人都会学习，但最终都会丢弃的教科书。- 因此， 基于以上几点，我们希望根据当前主流开发人员和企业应用开发的特点，搭建一个简单、易用、稳定、高效，便于扩展和集成的大语言模型工程化开发框架，大幅消减开发AI产品的难度和周期。使用说明1. 初始化环境1.1 安装bida从pip或pip3安装最新的bidapip install -U bida从github clone项目代码到本地目录：git clone https://github.com/pfzhou/bida.git
pip install -r requirements.txt1.2 配置环境变量修改当前代码根目录下面的文件：".env.template"的扩展名，成为".env"环境变量文件。请根据文件中的说明，把已经申请模型的key配置进去。请注意：该文件已经加入忽略清单，不会被传到git服务器。1.3 验证是否配置成功examples\1.初始化环境.ipynb2. 使用bida调用模型下面演示代码会混合使用各种bida支持的模型，请根据自己购买的模型修改替换代码中的**[model_type]**值为对应的模型公司名字，就可以快速切换各种模型进行体验：# 更多信息参看\bida\models\*.json中的model_type配置# openaillm=ChatLLM(model_type="openai")# baidullm=ChatLLM(model_type="baidu")# baidu third models（llama-2...）llm=ChatLLM(model_type="baidu-third")# aliyunllm=ChatLLM(model_type="aliyun")# minimaxllm=ChatLLM(model_type="minimax")# minimax ccpllm=ChatLLM(model_type="minimax-ccp")# zhipu aillm=ChatLLM(model_type="chatglm2")# xunfei xinghuollm=ChatLLM(model_type="xfyun")# senstimellm=ChatLLM(model_type="senstime")# baichuan aillm=ChatLLM(model_type="baichuan")# tencent aillm=ChatLLM(model_type="tencent")2.1 Chat模式Chat模式：ChatCompletion，当前主流的LLM交互模式，bida支持会话管理，支持持久化保存和Memory管理。调用并打印回答内容：frombidaimportChatLLMllm=ChatLLM(model_type='baidu')result=llm.chat("你好呀，请问你是谁？")print(result)流式stream调用，实现打字机效果：frombidaimportChatLLM# stream调用llm=ChatLLM(model_type="baidu",stream_callback=ChatLLM.stream_callback_func)result=llm.chat("你好呀，请问你是谁？")多轮对话：frombidaimportChatLLMllm=ChatLLM(model_type="baidu",stream_callback=ChatLLM.stream_callback_func)result=llm.chat("你是一个服务助理，请简洁回答我的问题。我的名字是老周。")result=llm.chat("我的名字是？")以上的详细代码和更多功能示例，请参考下面的NoteBook：examples\2.1.Chat模式.ipynb使用gradio建立chatbotgradio是一款非常流行的自然语言处理界面框架bida + gradio 可以用几行代码就搭建一个可用的应用程序importgradioasgrfrombidaimportChatLLMllm=ChatLLM(model_type='openai')defpredict(message,history):answer=llm.chat(message)returnanswergr.ChatInterface(predict).launch()详细内容见：bida+gradio的chatbot demo2.2 Completion模式Completion模式：Completions或TextCompletions，上一代LLM交互模式，仅支持单轮会话，不保存聊天记录，每次调用都是全新的交流。请注意：该模式在OpenAI 2023年7月6日的文章中，明确表示要逐步淘汰，新出的模型也基本不提供相关功能，即使支持的模型估计也会采取跟随OpenAI，预计未来都会逐渐淘汰。frombidaimportTextLLMllm=TextLLM(model_type="openai")result=llm.completion("你是一个服务助理，请简洁回答我的问题。我的名字是老周。")print(result)示例代码详见：examples\2.2.Completion模式.ipynb2.3 使用提示词提示词Prompt是大语言模型中最重要的功能，颠覆了传统面向对象的开发模式，转变为：Prompt工程。 本框架使用“提示词模板Prompt Templete”来实现，支持替换标记、多模型设定不同的提示词和模型执行交互时自动替换等功能。当前已提供PromptTemplate_Text：支持使用字符串文本生成Prompt模板，bida也支持灵活的自定义模板，未来计划提供从json和数据库中加载模板的能力。详细示例代码请参看下面的文件：examples\2.3.Prompt提示词.ipynb提示词中重要说明不同模型对提示词的支持能力不尽相同，比如：ChatGPT和Vicuna等国外大模型，对中文提示词支持不够稳定，建议用英文写提示词国内很多模型对推理类的提示词不敏感（指令遵循不好），对于生成Json、SQL、Code的指令几乎完全忽略英文大写单词和中文加入【】、“”等强调信息，对模型注意力有明显影响重要信息可以重复多遍，对模型注意力有明显影响，放置的位置因模型而异，有的在开始效果好，有的在结尾效果好提示词太长影响输出的token数量，要根据不同模型的max_token值做调整总的来说，建议提示词遵循：设定角色，明确任务，给出上下文（相关资料或示例）的三段式结构，可以参考示例中的写法。提示词的一些介绍文档，供参考：吴恩达的系列课程 https://learn.deeplearning.ai/login，中文版，解读openai cookbook https://github.com/openai/openai-cookbook微软Azure文档：提示工程简介,提示工程技术Github上最火的Prompt Engineering Guide，中文版2.4 函数调用function calling函数调用Function Calling是OpenAI2023年6月13日发布的功能，我们都知道ChatGPT训练的数据是基于2021年之前的，你要问一些实时性相关的问题就没法回答你了，而函数调用让实时获取网络数据成为可能，比如查询天气预报、查股票、推荐个近期的电影之类的。函数调用的流程是什么？用户发起提问时，调用一次带有函数描述的completions接口，gpt会判断是否支持调用函数，如果可以就从用户的提问信息中提取出函数所需要的参数。开发者拿到gpt提取出来的参数后自行调用函数并返回结果将函数的返回结果再次发给GPT做总结归纳为自然语言哪些模型支持：gpt-3.5-turbo-0613 和 gpt-4-0613 这两个模型都支持函数调用，MiniMax的Pro模式也支持，其他厂商也在跟进中。需要注意：整个过程会对gpt执行两次调用，第一次调用从问题中提取函数参数，第二次对函数返回结果做归纳总结函数调用并不是由gpt调用，而是开发者来调用，本框架已经封装了自动调用方法，但需要开发者自己实现具体的执行代码OpenAI 相关资料：Guide,API Reference,CookBook1,CookBook2详细示例参看：examples/2.4.function_calling函数调用.ipynb2.5 添加自定义函数/bida/functions/目录下建立一个函数定义json文件编写具体执行函数代码的py文件启动框架调试详细内容见：function接入手册2.6 Embeddings嵌入模型Embeddings技术是实现Prompt inContext Learning最重要的技术，对比以前关键词检索，又提升了一步。注意：不同模型embedding出来的数据是不通用的，因此检索时问题的embedding也要用同一个模型才可以。模型名称输出维度批处理记录数单条文本token限制OpenAI1536不限8191百度38416384阿里1536102048MiniMax1536不限4096智谱AI1024单条512讯飞星火1024单条256注意：bida的embedding接口支持批处理，超过模型批处理限制会自动分批循环处理后一起返回。单条文本内容超过限制token数，根据模型的逻辑，有的会报错，有的会截断处理。详细示例参看：examples\2.6.Embeddings嵌入模型.ipynb模型接入说明bida\models\目录下建立一个模型配置json文件编写具体模型实现方法的py文件启动框架调试
详细内容见：模型接入手册bida框架结构├─bida                          # bida框架主目录
│  ├─core                           # bida框架核心代码
│  ├─functions                      # 自定义function文件
│  ├─   *.json                          # function定义
│  ├─   *.py                            # 对应的调用代码
│  ├─models                         # 接入模型文件
│  ├─   *.json                          # 模型配置定义：openai.json、baidu.json等
│  ├─   *_api.py                        # 模型接入代码：openai_api.py、baidu_api.py等
│  ├─   *_sdk.py                        # 模型sdk代码：baidu_sdk.py等
│  ├─prompts                        # 自定义prompt模板文件
│  ├─*.py                           # 框架其他代码文件
├─docs                          # 帮助文档
├─examples                      # 演示代码、notebook文件和相关数据文件
├─test                          # pytest测试代码
│ .env.template                 # .env的模板
│ LICENSE                       # MIT 授权文件
│ pytest.ini                    # pytest配置文件
│ README.md                     # 本说明文件
│ requirements.txt              # 相关依赖包联系方式pfzhou@gmail.com我们希望可以适配更多的模型，也欢迎您提出宝贵意见，一起为开发者提供更好的产品！