上篇已经配置好es数据库链接了,那么离构建query集确实是越来越近了,接下来咱们就先把模型配置做好,后面直接调用就可以输出query集了,第一步先写好出题模板的提示词。
新建一个models.py文件
def question_prompt(context:str) -> str:
"""把文档内容塞进出题模板,返回完整提示词"""
template="""
###角色
你是一个问答对的专家
###任务
(定任务,客官自己写)
###返回格式
你只能以json格式返回数据
###给定文本
```{context}```
"""
return template.replace("{context}", context)
提示词模板四大要素,立角色⁺定任务⁺给格式⁺给约束,其实怎么写大家都可以随意发挥的,不过这里我写了个给定文本{context},为什么写在这最后面再讲,接下来接上面代码配置出题模型,使用request直调。
from config import configs
import request , json
def ask_llm(prompt: str) ->str:
#出题模型和裁判模型都调用config配置的模型
conf=configs["llm"]
url=conf["base_url"]
payload={
"model": conf["model"],
"message":[{"role":"user" , "content":prompt}],
"stream" : True,
}
headers={"Authorization":f"Bearer {conf['api_key']"}
res=request.post(url, json=payload, headers=headers,timeout=60,stream=True)
#通过请求大模型接口传递请求头请求体等,因为是流失输出,返回的真实数据长这样 data : {"choices": [{"delta": {"content":"正文chunk"}}]}
data : {"choices": [{"delta": {"content":"正文chunk"}}]{},所以接下来需要继续从每行里扣出增量,最后拼起来给到parts。
parts=[]
for line in res.iter_lines():
'''下面的代码因为特别原因不好全写出来,核心逻辑是剥前缀,跳过空行,解析json,扣增量字段,再拼接起来,这个大家可以用ai写,核心逻辑就是这样'''
return " ".join(parts)
写到这里就把基础的模型配置写好了,且拿到了文本内容。接下来就开始正式的构建query集了
前面说为什么在prompt里写上给定文本{context},而不是写一个没有值的提示词,把context写在message里,比如这样
"message" : [
{"role": "user","content":"prompt"},
{"role": "user","content":context}
]
其实这样写也行,但最主要的原因是前面的写法更加清晰,进一个文档出一个文档,模板逻辑锁在函数make_question_prompt(context)里,谁调用都不需要模板长啥样,后面这个调用需要发送模板和context两样东西反而会变复杂,后续几百个测试集输出容易上下文边界混乱,所以更推荐直接写在提示词模板中。


