给大语言模型插上翅膀

1.引言 有人说,智慧是 知识 + 运用知识的能力。从这个角度来看,大语言模型(如ChatGPT) 在某种程度上可以被认为具有一定形式的智慧。然而现在针对大语言模型的使用有一个问题, 就是模型所具有的知识无法保持实时更新。比如某个API文档发生变化,大语言模型仍然只能基于历史知识进行回答。 有没有办法让大语言模型获取最新的知识,而不至于stale。 显然如果它能够调用搜索引擎,获取最新知识,就可以解决这个问题。 事实上,现在kimi的联网搜索和ChatGPT的搜索网页都是为了解决这个问题。 下面让我们看看如何利用function calling来实现大语言模型从搜索引擎获取数据,继而回答用户的提问。 2. 大语言模型通过搜索引擎获取数据 首先,我们来看一个问题:“今天武汉和上海的气温,哪一个更高?” 对于人类而言,我们要解决这个问题,必须经过以下步骤 1)获取武汉和上海的气温数据 2)比较武汉和上海的最高气温,得出结论 下面萌叔提供一个完整的Python程序,看看如何使用function calling来回答这个提问 import json from email.policy import strict from openai import OpenAI import requests from openai._utils import maybe_transform from openai.types.chat import ChatCompletion base_url = "{此处请自行替换}" api_key = "{此处请自行替换}" google_search_key = "{此处请自行替换}" google_search_engine = "{此处请自行替换}" # 定义 google_search 函数(示例) def google_search(query: str) -> str: url = "https://www.googleapis.com/customsearch/v1" query_params = { "key": google_search_key, "cx": google_search_engine, "q": query, "num": 5, } response = requests.get(url, params=query_params) print(response.url) return response.text # 调用大模型 def send_messages(messages): # 函数信息,用于 Function Calling tools = [ { "type": "function", "function": { "name": "google_search", "description": "通过 Google 搜索获取信息", "parameters": { # 参数类型必须是object "type": "object", "properties": { "query": { "type": "string", "description": "需要搜索的关键词或短语", } }, "required": ["query"], "additionalProperties": False, }, "strict": True } }, ] client = OpenAI(api_key=api_key, base_url=base_url) response = client.chat.completions.create( model="gpt-4o-mini", # 确保使用支持 Function Calling 的模型 messages=messages, tools=tools, max_tokens=4096, parallel_tool_calls=True, ) dd = maybe_transform(response, ChatCompletion) data = json.dumps(dd, ensure_ascii=False) print(data) return response.choices[0].message if __name__ == "__main__": # 示例对话 # input_text = input("请输入您的问题:") messages = [ {"role": "system", "content": "你是一个智能搜索机器人。你根据用户提出的问题,利用google_search函数,获取额外信息,然后回答用户的提问"}, {"role": "user", "content": "今天武汉和上海的气温,哪一个更高?"}, ] # 1. **第1次调用AI接口** message = send_messages(messages) call_cout = len(message.tool_calls) print(f"将会发起{call_cout}次调用...") # 2. **在client端调用google_search()** messages.append(message) for tool in message.tool_calls: if tool.function.name == "google_search": parsed_arguments = json.loads(tool.function.arguments) query = parsed_arguments.get("query", None) # 获取 query 值 print("query:", query) content = google_search(query) messages.append({"role": "tool", "tool_call_id": tool.id, "content": content}) # 3. **第2次调用AI接口** message = send_messages(messages) print(f"Model>\t {message.content}") 0) 函数说明 这里我们给出了函数google_search()说明, 并把它传递给大模型, 告诉它在处理问题的时候,可以考虑使用上我们提供的函数。 ...

January 14, 2025 · 3 min

JetBrains IDE整合DeepSeek API实现辅助编程:使用篇

1.引言 在前一篇文章《JetBrains IDE整合DeepSeek API实现辅助编程》中, 萌叔介绍了在JetBrains IDE中安装CodeGPT插件来,借助AI来辅助编程。 这篇文章,萌叔将介绍CodeGPT的使用技巧,方便新手直接上手。 2.使用技巧 2.1 找Bug&代码优化&解释 CodeGPT可以帮助你优化代码。选中一段代码,右键 -> “CodeGPT” -> “Optimize”,CodeGPT会提供优化建议。 Find Bugs/Optimize/Explain 实际调用后端的API是相同的,只是提示词有所不同 示例 上图中的代码中的ioutil.Discard已经不再推荐使用了,我们可以直接让AI帮我们修改一下 上图中是AI给出的回答中,已经帮我们重构了一下。 代码框右上角的几个图标都非常有用。 Diff Selection 对边优化前和优化后的代码,你可以根据需要Accept改动 其它我不再赘述,按字面意思理解即可 2.2 对话 这里的技巧是可以使用 @ 提交文件或者某个文件夹下的所有文件给AI 注意: 请保护隐私数据,不要把敏感数据提交给AI 提交文件,将会消耗更多的token,也就意味着更多的money 作者: vearne 文章标题: JetBrains IDE整合DeepSeek API实现辅助编程:使用篇 发表时间: 2025年01月10日 文章链接: https://vearne.cc/archives/40240 版权说明: CC BY-NC-ND 4.0 DEED

January 10, 2025 · 1 min

JetBrains IDE整合DeepSeek API实现辅助编程

1.起因: 萌叔工作中经常用到JetBrains的IDE,比如Goland和IDEA,最近也在尝试使用AI辅助编程。 JetBrains自带的AI编程助手价格比较昂贵,使用网页版的Kimi和chatGPT咨询编程问题, 需要反复粘贴代码,也不很方便。正好幻方的DeepSeek-V3发布,从它公布数据来看性能非常强,且价格非常便宜。 因此萌叔试着用JetBrains IDE整合DeepSeek API实现辅助编程 2.安装和配置 注意:DeepSeek的API接口兼容openAI的接口 只需找一个可以配置compatible openAI接口的插件即可,这里使用CodeGPT 2.1 安装插件 2.2 配置插件 2.2.1 对话配置 这一步需要你自己去Deepseek创建API Key 传送门 URL地址为 https://api.deepseek.com/chat/completions 注意: 请求Body体中的模型名称需要修改 2.2.2 代码补全配置 注意:这里的URL地址与 2.2.1 对话配置中的不同。 URL地址为 https://api.deepseek.com/beta/completions 实践下来,感觉代码补全功能比较鸡肋,建议直接关闭。 3. 使用 注意:修改一下实际使用的模型 参考资料 1.DeepSeek-V3 正式发布 2.DeepSeek API 文档 3.DeepSeek代码补全 后记 2025年07月14日,插件的名字已经变更为Proxy AI https://plugins.jetbrains.com/plugin/21056-proxyai 作者: vearne 文章标题: JetBrains IDE整合DeepSeek API实现辅助编程 发表时间: 2024年12月31日 文章链接: https://vearne.cc/archives/40235 版权说明: CC BY-NC-ND 4.0 DEED

December 31, 2024 · 1 min

AI预测模型工程化性能调优

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 1. 前言 最近经历了一次AI预测模型工程化性能调优,这里分享出来,希望对大家有所启发。 模型是keras训练的神经网络预测模型,输入一段文本,输出文本的分类结果。为了对外提供服务,已经将模型用 gunicorn + flask对模型进行封装,提供http接口。 环境 OS:ubuntu 18.04 CPU:32核 内存: 256GB 显卡: Tesla P100 前期的压测结果 wrk -t4 -c100 -d30s --script=post.lua --latency http://localhost:8080/api/predict 类型 CPU GPU QPS 2.4 12.41 2. 观察性能指标 QPS过低不能满足业务方的要求,所以萌叔尝试对封装好的服务进行调优。 仔细观察了各项系统指标之后(cpu、load、磁盘IO、内存使用率、虚拟内存页换入换出) 萌叔发现了一个疑点。 2.1 keras 使用CPU 在压测的过程中,CPU的使用率只能达到70%左右 2.2 keras 使用GPU 在压测的过程中,GPU的使用率只能达到30%左右 神经网络模型对文本分类的预测过程,实际就是将输入文本转换成数值,再带入神经网络,进行的2次计算的过程。这是一个计算密集型的场景,性能瓶颈应该是CPU/GPU; 如果CPU、GPU没有打满,则说明性能仍有提升的空间。 3. 调优 3.1 初始协程模式 web使用Flask开发,启动脚本如下: gunicorn -k gevent -t 300 -b 0.0.0.0:8080 run:app gunicorn有几种工作模式 sync (进程模式) eventlet gevent (协程模式) tornado gthread gevent是一种协程模式,它的特点是在请求的处理过程中有IO调用时(或者当前的协程主动让出CPU),会自动触发切换上下文切换,启动另一个协程,提高CPU的利用率。它特别适用于IO密集型的场景,尤其是对于处理过程中有对数据库的调用,第三方服务调用的情况。 ...

March 17, 2020 · 2 min