Spring AI Alibaba 1.0.0.2 踩坑经验
最近在扩展云图库项目,打算引入一些AI的功能,于是开始接触Spring AI Alibaba。这个库用起来确实简单,代码也很优雅,但是感觉官方文档写的比较乱。总的来说遇到了下面几个问题。
依赖问题
下面这个是1.0.0.2版本真正的依赖,官方文档里部分写的是“spring-ai-alibaba-starter”,老版本的依赖名。
▼text复制代码<dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud.ai</groupId> <artifactId>spring-ai-alibaba-bom</artifactId> <version>1.0.0.2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud.ai</groupId> <artifactId>spring-ai-alibaba-starter-dashscope</artifactId> </dependency> </dependencies>
部分API有变动
关于使用云平台上的知识库,构建Advisor的相关逻辑,官网上的代码还是下面这样写的:
但实际代码种如果真的也这样写,就会发现报错了,因为1.0.0.2版本这个类需要7个参数:
这个时候如果尝试其他的类,比如"DashScopeAgentApi",这行代码确实不会报错,但是下面那一行就……
实际解决方法:
▼java复制代码@Bean public Advisor xxxAdvisor(){ DashScopeApi dashScopeApi = DashScopeApi.builder() .apiKey(dashScopeApiKey) .build(); DocumentRetriever documentRetriever = new DashScopeDocumentRetriever(dashScopeApi, DashScopeDocumentRetrieverOptions.builder() .withIndexName(ragName) .build()); return RetrievalAugmentationAdvisor.builder() .documentRetriever(documentRetriever) .build(); }
新版用builder这种方法来拿到一个实例。这里感谢鱼皮。超级智能体那个开源项目在Spring AI Alibaba出了正式版之后是维护到了1.0.0.2版本。我直接在那个代码里找到了办法。不然还是要自己去扒源码。
401 Invalid API-key
这个问题属于天灾人祸俱全。省流解决思路:全局搜索哪里用了ApiKey,全部仔细排查一遍。
问题
我打算做一个AI客服,写一个markdown文档记录一些问题,然后用知识库给大模型提供一些问题和回复的思路。云图库项目之前有用HTTP调扩图模型的功能,所以我也就省略了写个demo测试这一步。想着也没几行代码,都开发出来再看。
结果等开发完了,写个测试方法验证,直接就一句话,告诉我ApiKey无效……
▼text复制代码{"code":"InvalidApiKey","message":"Invalid API-key provided."……}
解决过程
当时第一时间想到验证一下扩图功能,然后发现它是正常的。之后去翻Spring AI Alibaba的官方文档,没发现这个问题。去百炼平台翻文档:
试过之后发现没用。
从这一步开始,我意识到这个问题很可能不是因为我真的写错了ApiKey。我的思路就已经从解决问题,转变成怎么让它报一个其他的错,也就是定位问题原因。
不断尝试之后,我发现超级智能体项目里有个demo代码,是可以跑通的。
▼java复制代码// 取消注释即可在 SpringBoot 项目启动时执行 @Component public class SpringAiAiInvoke implements CommandLineRunner { @Resource private ChatModel dashscopeChatModel; @Override public void run(String... args) throws Exception { AssistantMessage output = dashscopeChatModel.call(new Prompt("你好,我是鱼皮")) .getResult() .getOutput(); System.out.println(output.getText()); } }
之后我就发现,这个问题的原因很可能是在某一个地方,没有把ApiKey传过去。想着之前看官网文档写的乱,感觉是不是因为哪里API换了,所以有坑,于是翻了2小时源码。 2小时以后,直觉上认为排查方向出错了。就开始想“他这个代码,从传prompt,到记录日志,到调用知识库,再到获取Response,一行代码就结束了,而且似乎也没有报是在哪个步骤出的错误,就只有一个401 Invalid API-key,要不试着删掉一些步骤,看看有没有什么变化?” 最能删的,就是.advisors(),记录日志,调用知识库都要用这个,一个一个的试,直到我把调用知识库的那行去掉,再运行,发现它好了…… 然后我盯着知识库构建那里的代码看……
本来应该是${},我手打成了$()……
