从例子开始:寻找一篇为大模型设计专用编程语言的文章
我将该问题翻译为:
1 | Can you find me some papers about designing a new programming language for LLM model? |
Perplexity.ai 的表现
Perplexity.ai 是 AI 搜索行业的龙头企业之一,其搜索服务分为普通模式和 Pro 模式,其中 Pro 模式更强大,但限制了免费体验的次数。
下面是普通模式的表现:
1 | Unfortunately... |
嗯,先帝创业未半而骈死于槽枥之间了。看看后面说了什么:
1 | Unfortunately, I could not find any papers specifically about designing a new programming language for LLM models in the given search results. |
全回答中只有低代码论文勉强和「代码」和「大语言模型」相关,但显然不是给大语言模型用的编程语言。
如果使用 Pro 模式,则会得到:
1 | The query you've posed about finding papers on designing new programming languages for Large Language Models (LLMs) is addressed by two significant contributions in the field: |
这里得到了两篇真正相关的论文,一篇是设计提示词的编程语言 LMP,一篇是编排大模型的 SGLang,效果比基础版好一些。
注意到 Pro 模式的步骤中有一步是谷歌搜索 site:arxiv.org programming language for large language models
,搜索得到的前两个结果正是回答中推荐的两篇文章。但 Pro 模式亦止步于此。
我的 AI 助理的表现
我的 本地搜索助理(怎么没人 Star 呢?)用 1 小时得到了 18 篇可能相关的文章,其中多数文章也并不符合要求,但得到的部分文章比传统 AI 搜索更符合需求。下面的文章推荐按照生成时间排序,最先生成的在最上面:
- CuMo: Scaling Multimodal LLM with Co-Upcycled Mixture-of-Experts
- 不相关,但大模型把减少计算消耗和新编程语言联系在一起
- Does Fine-Tuning LLMs on New Knowledge Encourage Hallucinations?
- 不相关,但大模型幻觉出 LLM-Script
- Lumina-T2X: Transforming Text into Any Modality, Resolution, and Duration via Flow-based Large Diffusion Transformers
- 不相关,但大模型把框架理解为编程语言
- Learned harmonic mean estimation of the Bayesian evidence with normalizing flows
- 不相关,但这是一篇纯数学文章,大模型认为这为编程语言奠定基础
- Quantum Communication and Mixed-State Order in Decohered Symmetry-Protected Topological States
- 不相关,但大模型认为这为硬件实现提供基础
- SPML: A DSL for Defending Language Models Against Prompt Attacks
- 和新编程语言、大模型同时相关,专用于抵御提示词攻击的编程语言
- Designing LLM Chains by Adapting Techniques from Crowdsourcing Workflows
- 不相关,大模型也知道不直接相关,但还是推荐了
- TypeFly: Flying Drones with Large Language Model
- 和新编程语言、大模型同时相关,让大模型能控制无人机
- What Algorithms can Transformers Learn? A Study in Length Generalization
- 和新编程语言、大模型同时相关,并且大模型可以被解释为在使用这个编程语言
- AutoScrum: Automating Project Planning Using Large Language Models
- 不相关,但大模型幻觉出 LLM-Script
- Prompting Is Programming: A Query Language for Large Language Models
- 和新编程语言、大模型同时相关,前面 Perplexity.ai 推荐过
- Efficient LLM Comparative Assessment: a Product of Experts Framework for Pairwise Comparisons
- 不相关,但大模型幻觉出 LLM-Script
- A Survey on Visualization Approaches in Political Science for Social and Political Factors: Progress to Date and Future Opportunities
- 不相关,大模型没说相关,但还是推荐了
- A Controlled Experiment on the Energy Efficiency of the Source Code Generated by Code Llama
- 不相关,但大模型幻觉出 LLM-Script
- Large Language Models Synergize with Automated Machine Learning
- 不相关,但大模型幻觉出 LlamaScript
- Generating Situated Reflection Triggers about Alternative Solution Paths: A Case Study of Generative AI for Computer-Supported Collaborative Learning
- 不相关,但这是一篇辅助思考的文章,大模型认为这可以辅助构思新编程语言
- AI Coders Are Among Us: Rethinking Programming Language Grammar Towards Efficient Code Generation
- 和新编程语言、大模型同时相关,是对原有编程语言适配大模型的改良
- Evaluating LLMs for Hardware Design and Test
- 不相关,但里面涉及 HDL(硬件设计语言)使得大模型认为相关
虽然大部分文章都不相关,但找到的相关文章也更多!要知道在「信息检索」的场景下,得到一些无关信息是无伤大雅的,但漏掉真正相关的信息则是大问题!
同时你会注意到,其实很多无关信息大模型本完全可以筛选掉,比如那些幻觉。但是! 我其实是做了筛选的,而且事实上有 90% 左右的无关文章会被筛掉,但有关文章被筛掉的概率几乎为 0。剩下的文章以无关文章为主,是因为关键词检索出来的无关文章太多了……
你可能注意到 SGLang 没有被推荐,这是因为我还没实现分页查询的功能(昨天才开始写这玩意的代码……),所以比较早的文章不会被查询到。这个问题会在后面被讨论。
你可能会发现,几篇相关的文章几乎是连在一起出现的,这是因为对于同一个「检索词想法」搜索到的论文会被放在一起被判断。好的检索词想法更容易带来相关的文章。
我是怎么做到的?
通过头脑风暴产生搜索关键字
这个节点会源源不断地产生新的搜索想法。怎么确保产生的想法都是新的?
我在实践中发现,如果把已经生成过的关键字放到提示词里面,反而会让大模型倾向于重复已有的内容。只需把模型温度设置为 1,并在提示词中引导「要有创意」,便能获得足够多样的关键字。
关键字校验
一次正常的和大模型的对话大概长这样:
1 | user: |
这个回答人能看得懂,但如果直接把这个回答交给搜索 arXiv 论文的程序,这个程序怎么知道实际上应该搜索什么关键词呢?即使知道搜索什么关键词,程序也需要能校验关键词的格式,如果错误的话则需要让大模型重新输出一份。
产生这个问题是因为,目前设定的大模型的输出类型是宽泛的「文本」,而不是具体的「合法的搜索关键字」。我使用了 Instructor 库来解决这个问题,这个库允许我定义「合法的搜索关键字」需要满足的要求,即符合 arXiv 的检索格式,并要求大模型输出这一类型的回复。如果不满足,校验者则会先尝试修复格式,如果无法修复则会告诉大模型为什么不合法,并且请求重新生成。
校验者事实上也是大模型,这里就用到了多智能体的思想。
论文搜索
直接使用 arxiv.py 库即可。
我计划加入通过搜索引擎搜索的功能,但目前还在调研各 API 的价格和性能。由于 API 调用次数将较多,我希望能尽可能减少消费。
目前对于论文我暂未实现分页查询,因此每次只是查询某关键字下最近发表的 10 篇论文。下一次迭代中,我计划使用任务池架构,对于所有搜索关键字,由调度器根据其结果接纳率决定「翻页」还是「产生新的搜索想法」。
推荐卡片撰写
这里我令大模型尝试输出一份对「文章符合用户要求」的证明,包括相关段落、相关理由和相关度打分。其中,相关段落会被校验是否引自原始文章,相关理由则会被校验是否能证明文章和用户要求相关,并且不包含幻觉。正如前面提到,这种校验在大部分情况下有效,但仍有少量情况下无法检验出幻觉。
要解决这个问题,需要在完善提示工程和提高模型质量之间权衡。我可能会尝试以下方案:
- 允许用户为「文章符合要求」的证明添加更多字段,以加入更有针对性的校验
- 允许大模型生成「不推荐」的推荐卡片(虽然直接给推荐卡片加
Optional
没用) - 完善提示工程……(这玩意没数据集,不太方便测试性能,只能自己感觉了)
如何开始使用?
找到大模型解决方案
随便找个和 OpenAI API 兼容的即可,不兼容的话用 LiteLLM 反向代理一下就行。找不到的话可以看看下面的建议:
如果你有一张显存在 4.7 GB 以上的显卡,可以通过 Ollama 下载 LLaMA3-8b 模型并在本地运行。此时,你的 OPENAI_API_URL
是 http://localhost:11434/v1
,OPENAI_API_KEY
是任意。我的上述测试结果是使用该模型得到的。
如果你能接受 1 天约 10 元的 API 调用费,可以考虑使用 深度求索 平台提供的 deepseek-chat-v2 模型。该模型的价格为每 1,000,000 令牌 1 元钱。上述消费估计假设了 1 分钟发送 6 次 API 请求,但该速率只是我的直觉估计,我无法保证准确。此时,你的 OPENAI_API_URL
是 https://api.deepseek.com/v1
,OPENAI_API_KEY
是控制台中显示的 API Key。
但是, 我测试发现该模型和 Instructor 库的相性并不好,经常给出错误的 JSON 格式导致不断重试,因此如果你需要使用本模型,可能会需要手动调整提示词。
本地部署
欢迎 Star 本仓库!
本 AI 助理目前正在频繁开发的阶段,暂时没有封装 Docker 版本,建议通过克隆本仓库的方式部署。如果使用 Miniconda,使用下面的命令来配置开发环境:
1 | # 克隆仓库 |
亦可以手动安装需要的包,然后使用相似的方法部署:
1 | # 克隆仓库 |
如果需要更新仓库,使用 git pull
即可。
如果部署遇到问题,请提交 Issue。