zhayujie / chatgpt-on-wechat

基于大模型搭建的聊天机器人,同时支持 微信公众号、企业微信应用、飞书、钉钉 等接入,可选择GPT3.5/GPT-4o/GPT4.0/ Claude/文心一言/讯飞星火/通义千问/ Gemini/GLM-4/Claude/Kimi/LinkAI,能处理文本、语音和图片,访问操作系统和互联网,支持基于自有知识库进行定制企业智能客服。
https://docs.link-ai.tech/cow
MIT License
29.48k stars 7.8k forks source link

支持Ollama部署的大模型服务 #1845

Open kaina404 opened 5 months ago

kaina404 commented 5 months ago

⚠️ 搜索是否存在类似issue

总结

Ollama本地服务目前支持了Qwen、Gemma、Mistral、Codellama等多种大模型,可参考Ollama支持的模型

这里我在现有的项目中做了如下更改以支持Ollama服务本地部署在本地的所有大模型。

Step1:

const.py文件中增加配置:OLLAMA = "ollama"

MODEL_LIST = [... , OLLAMA]

Step2:

创建 /bot/ollama/ollama_bot.py

from bot.bot import Bot
from bot.session_manager import SessionManager
from bridge.context import ContextType, Context
from bridge.reply import Reply, ReplyType
from common.log import logger
from config import conf
from bot.baidu.baidu_wenxin_session import BaiduWenxinSession
import ollama

# Ollama对话模型API (可用)
class OllamaBot(Bot):

    def __init__(self):
        super().__init__()
        self.model = conf().get("model") or "gemma:7b"
        # 复用文心的token计算方式
        self.sessions = SessionManager(BaiduWenxinSession, model=conf().get("model") or "gemma:7b")

    def reply(self, query, context: Context = None) -> Reply:
        try:
            if context.type != ContextType.TEXT:
                logger.warn(f"[Ollama] Unsupported message type, type={context.type}")
                return Reply(ReplyType.TEXT, None)
            logger.info(f"[Ollama] query={query}")
            session_id = context["session_id"]
            session = self.sessions.session_query(query, session_id)
            # 这里直接调用本地的Ollama服务
            response = ollama.chat(
                model=self.model,
                messages=self.filter_messages(session.messages))
            reply_text = response['message']['content']
            self.sessions.session_reply(reply_text, session_id)
            logger.info(f"[Ollama] reply={reply_text}")
            return Reply(ReplyType.TEXT, reply_text)
        except Exception as e:
            logger.error("[Ollama] fetch reply error, may contain unsafe content")
            logger.error(e)
            return Reply(ReplyType.ERROR, "invoke [Ollama] api failed!")

    def _convert_to_gemini_messages(self, messages: list):
        res = []
        for msg in messages:
            if msg.get("role") == "user":
                role = "user"
            elif msg.get("role") == "assistant":
                role = "model"
            else:
                continue
            res.append({
                "role": role,
                "parts": [{"text": msg.get("content")}]
            })
        return res

    @staticmethod
    def filter_messages(messages: list):
        res = []
        turn = "user"
        if not messages:
            return res
        for i in range(len(messages) - 1, -1, -1):
            message = messages[i]
            if message.get("role") != turn:
                continue
            res.insert(0, message)
            if turn == "user":
                turn = "assistant"
            elif turn == "assistant":
                turn = "user"
        return res

Step3:

修改bot_factory.py处理如下

def create_bot(bot_type):

    elif bot_type == const.OLLAMA:
        from bot.ollama.ollama_bot import OllamaBot
        return OllamaBot()

    raise RuntimeError

Step4:

requirements.txt增加ollama

Step5:

修改bridge.py

self.btype = {
  #....修改"chat": const.CHATGPT为下面.....
            "chat": conf().get("bot_type", const.CHATGPT)
  ...
}

Step6:

config.py文件中的available_setting增加配置:"bot_type":"ollama",修改"model": "gemma:7b "

Ollama支持的所有模型,执行命令: ollama list,然后将你想要用的NAME复制到model中,例如这里的NAME为gemma:7b 。

举例

ollama list

截屏2024-03-27 10 23 52

涉及修改的文件:

截屏2024-03-27 10 24 39

动机

Ollama支持将大部分模型能在本地快速部署或者服务端部署并运行,通过对Ollama的支持,能够减少对ChatGPT的依赖。能够将这个项目的底层大模型支持范围拓展的更广阔。

kaina404 commented 5 months ago

image

taozhiyuai commented 5 months ago

针对STEP6, 建议改成不需要修改MODEL,就用默认的gpt3.5 turbo. LM STUDIO做服务器时, COW只需要修改API和BASE,可以工作. 每次换模型还需要改MODEL,太麻烦了. @kaina404

taozhiyuai commented 5 months ago

STEP 1 除了你写的, # bot_type下面不需要加 OLLAMA="ollama"吗? @kaina404

taozhiyuai commented 5 months ago

我这边启动显示错误

Traceback (most recent call last): File "/Users/taozhiyu/Downloads/chatgpt-on-wechat/app.py", line 8, in from channel import channel_factory File "/Users/taozhiyu/Downloads/chatgpt-on-wechat/channel/channel_factory.py", line 4, in from common import const File "/Users/taozhiyu/Downloads/chatgpt-on-wechat/common/const.py", line 27, in "gpt-4-turbo-preview", "gpt-4-1106-preview", GPT4_TURBO_PREVIEW, QWEN, GEMINI, ZHIPU_AI, MOONSHOT, OLLAMA] ^^^^^^ NameError: name 'OLLAMA' is not defined

我修改的const.py如下

bot_type

OPEN_AI = "openAI" CHATGPT = "chatGPT" BAIDU = "baidu" XUNFEI = "xunfei" CHATGPTONAZURE = "chatGPTOnAzure" LINKAI = "linkai" CLAUDEAI = "claude" CLAUDEAPI= "claudeAPI" QWEN = "qwen" GEMINI = "gemini" ZHIPU_AI = "glm-4" MOONSHOT = "moonshot"

model

CLAUDE3 = "claude-3-opus-20240229" GPT35 = "gpt-3.5-turbo" GPT4 = "gpt-4" GPT4_TURBO_PREVIEW = "gpt-4-0125-preview" GPT4_VISION_PREVIEW = "gpt-4-vision-preview" WHISPER_1 = "whisper-1" TTS_1 = "tts-1" TTS_1_HD = "tts-1-hd"

MODEL_LIST = ["gpt-3.5-turbo", "gpt-3.5-turbo-16k", "gpt-4", "wenxin", "wenxin-4", "xunfei", "claude","claude-3-opus-20240229", "gpt-4-turbo", "gpt-4-turbo-preview", "gpt-4-1106-preview", GPT4_TURBO_PREVIEW, QWEN, GEMINI, ZHIPU_AI, MOONSHOT, OLLAMA]

channel

FEISHU = "feishu" DINGTALK = "dingtalk"

taozhiyuai commented 5 months ago

STEP 5少了逗号

taozhiyuai commented 5 months ago

我这边解决上面问题后运行成功. 建议吧STEP 6的model 解决下. 最好和lm studio一样, 忽略model, 否则每次换模型都改,太麻烦了.

成功运行截图

截屏2024-03-27 10 57 33
kaina404 commented 5 months ago

STEP 1 除了你写的, # bot_type下面不需要加 OLLAMA="ollama"吗? @kaina404

是的需要增加OLLAMA="ollama"

截屏2024-03-27 11 04 22
taozhiyuai commented 5 months ago

STEP 6 我没有在config.py里修改model, 只是在config.json里面按你说的修改了model. 运行成功. 还是如上说的,是否能像LM STUDIO, 用默认的模型设置

kaina404 commented 5 months ago

STEP 6 我没有在config.py里修改model, 只是在config.json里面按你说的修改了model. 运行成功. 还是如上说的,是否能像LM STUDIO, 用默认的模型设置 这里的config.json需要增加 "bot_type": "ollama", "model": "qwen:7b",

截屏2024-03-27 11 06 19
taozhiyuai commented 5 months ago

@zhayujie 建议合并代码,这样太好了.谢谢 @kaina404

kaina404 commented 5 months ago

针对STEP6, 建议改成不需要修改MODEL,就用默认的gpt3.5 turbo. LM STUDIO做服务器时, COW只需要修改API和BASE,可以工作. 每次换模型还需要改MODEL,太麻烦了. @kaina404

这里是为了将默认的chat模型切换到ollama部署支持的模型,当然你可以直接修改bot_type为之前的chat模型也是可以的。当你修改了bot_type然后,就可以修改model对应的值,这样就可以直接切换ollama支持的其他模型了,例如:Gemma、qwen、llava、mistral等等

taozhiyuai commented 5 months ago

STEP 6 我没有在config.py里修改model, 只是在config.json里面按你说的修改了model. 运行成功. 还是如上说的,是否能像LM STUDIO, 用默认的模型设置 这里的config.json需要增加 "bot_type": "ollama", "model": "qwen:7b",

截屏2024-03-27 11 06 19

WX20240327-110858@2x WX20240327-111047@2x 我没有在config.py里面改model, 如图改的,运行成功

kaina404 commented 5 months ago

config.py

config.py只是一个示例,真正的修改配置的地方是在config.json里面的,你修改的没错。

taozhiyuai commented 5 months ago

针对STEP6, 建议改成不需要修改MODEL,就用默认的gpt3.5 turbo. LM STUDIO做服务器时, COW只需要修改API和BASE,可以工作. 每次换模型还需要改MODEL,太麻烦了. @kaina404

这里是为了将默认的chat模型切换到ollama部署支持的模型,当然你可以直接修改bot_type为之前的chat模型也是可以的。当你修改了bot_type然后,就可以修改model对应的值,这样就可以直接切换ollama支持的其他模型了,例如:Gemma、qwen、llava、mistral等等

好复杂. 我用 lm studio + cow, 只需要修改config.json的api key 和api base,不需要改 model. 你看ollama + cow是否也可以这样.

kaina404 commented 5 months ago

修改的文件内容:

截屏2024-03-27 11 22 14 截屏2024-03-27 11 22 31 截屏2024-03-27 11 23 04 截屏2024-03-27 11 23 44 截屏2024-03-27 11 24 01

新增的文件--> ollam_bot.py 文件

kaina404 commented 5 months ago

@taozhiyuai 这是我本地的修改。

taozhiyuai commented 5 months ago

@kaina404 还遇到个问题.因为我是COW ,OLLAMA本机MAC环境部署. 我盒盖休息时,COW就断了.再也不能恢复.但是openwebui就可以直接回应消息. 能否解决这个问题呢?

kaina404 commented 5 months ago

@kaina404 还遇到个问题.因为我是COW ,OLLAMA本机MAC环境部署. 我盒盖休息时,COW就断了.再也不能恢复.但是openwebui就可以直接回应消息. 能否解决这个问题呢?

我这里是mac一直处理息屏状态,但是不会断掉的。你看看你的电源/电池相关的设置。

taozhiyuai commented 5 months ago

@taozhiyuai 这是我本地的修改。

能否实现像LM STUDIO一样,不用修改MODEL呢?

这个能解决吗?

kaina404 commented 5 months ago

@taozhiyuai 这是我本地的修改。

能否实现像LM STUDIO一样,不用修改MODEL呢?

这个能解决吗?

没有使用过LLM STUDIO ....

taozhiyuai commented 5 months ago

行吧.够好了.谢谢.希望还有其他开发者能进一步完善

jinghunsanzu commented 4 months ago

新版本的ollama的API变了,变成了http://localhost:11434/api/chat,我这边照着API填写进去,发送文字没回应,大佬有解决么

jinghunsanzu commented 4 months ago

有反应了,但是提示 [ERROR] invoke [Ollama] api failed!

kaina404 commented 4 months ago

有反应了,但是提示 [ERROR] invoke [Ollama] api failed! @jinghunsanzu

https://github.com/kaina404/chatgpt-on-wechat/tree/feature/ollama_support

taozhiyuai commented 3 months ago

有反应了,但是提示 [ERROR] invoke [Ollama] api failed! @jinghunsanzu

https://github.com/kaina404/chatgpt-on-wechat/tree/feature/ollama_support

快让cow合并这个代码吧

taozhiyuai commented 2 months ago

@zhayujie @6vision 麻烦尽快合并这个代码.实际使用没有问题.

gentte6666 commented 2 months ago

请问使用ollama 本地大语言模型, 是否支持运行插件,我直接修改api base 和chatgpt api key, 可以对话,但是无法调用插件

kaina404 commented 1 month ago

请问使用ollama 本地大语言模型, 是否支持运行插件,我直接修改api base 和chatgpt api key, 可以对话,但是无法调用插件

还真没测试过。

MoYingJiang commented 1 month ago

试了,总是失败,我是docker的ollama,端口给的5XXX

kaina404 commented 1 month ago

试了,总是失败,我是docker的ollama,端口给的5XXX

什么错误呢?