示例选择器超时问题及如何免费接大模型api
·


一、超时问题
1、SemanticSimilarityExampleSelector,MaxMarginalRelevanceExampleSelector
对于这两个代码,如果直接使用书上这种写法,有可能就会导致超时的问题,原因是
当使用 OpenAIEmbeddings() 时:
-
默认会调用 OpenAI 的嵌入 API
-
需要 OpenAI API Key
-
需要能访问 OpenAI 服务器(可能需要翻墙)
-
如果不指定
openai_api_base,会使用官方 OpenAI 端点
实质上是因为需要用openai的嵌入模型 (embeddings) ,让ai去在线选择,因此首先要有梯子进入openai,其次要有额度,把openai的api key填到环境变量里。
2、解决方法
可以用硅基流动的轻量小模型,新用户可以免费送2000万token,仅供个人学习langchain的话是非常充足的(填我邀请码博主也能白嫖2000万token嘻嘻)https://cloud.siliconflow.cn/i/oucdpgKw
注册好之后新建一个api密钥,编辑系统环境变量新加一个 OPENAI_API_KEY,然后输入你api的值
3、代码
from langchain_core.prompts import ChatPromptTemplate
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector,LengthBasedExampleSelector,MaxMarginalRelevanceExampleSelector
from langchain_community.vectorstores import Chroma,FAISS
from langchain.prompts import PromptTemplate,HumanMessagePromptTemplate,SystemMessagePromptTemplate,AIMessagePromptTemplate
from langchain.prompts.few_shot import FewShotPromptTemplate
from langchain_openai import ChatOpenAI,OpenAIEmbeddings
import os
chat = ChatOpenAI(
model="Qwen/Qwen2.5-72B-Instruct",
temperature=0.3,
openai_api_key=os.getenv('OPENAI_API_KEY'),
openai_api_base="https://api.siliconflow.cn/v1"
)
examples = [
{
"question": "谁的寿命更长,穆罕默德·阿里还是艾伦·图灵?",
"answer":"""这里需要跟进问题吗:是的。
跟进:穆罕默德·阿里去世时多大?
中间答案:穆罕默德·阿里去世时74岁。
跟进:艾伦·图灵去世时多大?
中间答案:艾伦·图灵去世时41岁。
所以最终答案是:穆罕默德·阿里
"""
},
{
"question": "craigslist的创始人是什么时候出生的?",
"answer":"""这里需要跟进问题吗:是的。
跟进:craigslist的创始人是谁?
中间答案:craigslist由Craig Newmark创立。
跟进:Craig Newmark是什么时候出生的?
中间答案:Craig Newmark于1952年12月6日出生。
所以最终答案是:1952年12月6日
"""
},
{
"question": "乔治·华盛顿的祖父母中的母亲是谁?",
"answer":"""这里需要跟进问题吗:是的。
跟进:乔治·华盛顿的母亲是谁?
中间答案:乔治·华盛顿的母亲是Mary Ball Washington。
跟进:Mary Ball Washington的父亲是谁?
中间答案:Mary Ball Washington的父亲是Joseph Ball。
所以最终答案是:Joseph Ball
"""
},
{
"question": "《大白鲨》和《皇家赌场》的导演都来自同一个国家吗?",
"answer":"""这里需要跟进问题吗:是的。
跟进:《大白鲨》的导演是谁?
中间答案:《大白鲨》的导演是Steven Spielberg。
跟进:Steven Spielberg来自哪里?
中间答案:美国。
跟进:《皇家赌场》的导演是谁?
中间答案:《皇家赌场》的导演是Martin Campbell。
跟进:Martin Campbell来自哪里?
中间答案:新西兰。
所以最终答案是:不是
"""
}
]
embeddings = OpenAIEmbeddings(
openai_api_base="https://api.siliconflow.cn/v1",
model="BAAI/bge-large-zh-v1.5", # 中文优化的嵌入模型
)
example_prompt=PromptTemplate.from_template('question:{question}\n{answer}')
example_selector = MaxMarginalRelevanceExampleSelector.from_examples(examples,embeddings,FAISS,k=2)
prompt = FewShotPromptTemplate(example_selector=example_selector,example_prompt=example_prompt,example_separator='\n',prefix='gogogo\n',suffix='question:{input}',input_variables=['input'])
print(prompt.format(input='黄月英的老公是刘备的军师吗'))
result=chat.invoke(prompt.format(input='黄月英的老公是刘备的军师吗'))
print(result.content)
博主用的是
| Qwen/Qwen2.5-72B-Instruct 模型 |
当然也可以选择你自己想用的
openai_api_key=os.getenv('OPENAI_API_KEY')从环境变量中获取是一种比较安全的做法,如果你的代码之后要开源,不用担心你的密钥会泄露
4、运行结果
这个例子如果不用示例选择器其实反而效果更好,因为例子够多,ai能学习到通用回答的模式:
这里需要跟进问题吗:xx
跟进:xx
中间答案:xx
跟进:xx
中间答案:xx
所以最终答案是:xx
prompt = FewShotPromptTemplate(examples=examples,example_prompt=example_prompt,example_separator='\n',prefix='gogogo\n',suffix='question:{input}',input_variables=['input'])
只需要改这么一行,不选择数据,就会生成下面的效果
gogogo
question:谁的寿命更长,穆罕默德·阿里还是艾伦·图灵?
这里需要跟进问题吗:是的。
跟进:穆罕默德·阿里去世时多大?
中间答案:穆罕默德·阿里去世时74岁。
跟进:艾伦·图灵去世时多大?
中间答案:艾伦·图灵去世时41岁。
所以最终答案是:穆罕默德·阿里
question:craigslist的创始人是什么时候出生的?
这里需要跟进问题吗:是的。
跟进:craigslist的创始人是谁?
中间答案:craigslist由Craig Newmark创立。
跟进:Craig Newmark是什么时候出生的?
中间答案:Craig Newmark于1952年12月6日出生。
所以最终答案是:1952年12月6日
question:乔治·华盛顿的祖父母中的母亲是谁?
这里需要跟进问题吗:是的。
跟进:乔治·华盛顿的母亲是谁?
中间答案:乔治·华盛顿的母亲是Mary Ball Washington。
跟进:Mary Ball Washington的父亲是谁?
中间答案:Mary Ball Washington的父亲是Joseph Ball。
所以最终答案是:Joseph Ball
question:《大白鲨》和《皇家赌场》的导演都来自同一个国家吗?
这里需要跟进问题吗:是的。
跟进:《大白鲨》的导演是谁?
中间答案:《大白鲨》的导演是Steven Spielberg。
跟进:Steven Spielberg来自哪里?
中间答案:美国。
跟进:《皇家赌场》的导演是谁?
中间答案:《皇家赌场》的导演是Martin Campbell。
跟进:Martin Campbell来自哪里?
中间答案:新西兰。
所以最终答案是:不是
question:黄月英的老公是刘备的军师吗
这里需要跟进问题吗:是的。
跟进:黄月英的老公是谁?
中间答案:黄月英的老公是诸葛亮。
跟进:诸葛亮是刘备的军师吗?
中间答案:是的,诸葛亮是刘备的主要军师之一。
所以最终答案是:是的。
如果按原代码,加了选择器,ai还没法学习到要采用的通用回答模式,就会输出下面的结果
gogogo
question:《大白鲨》和《皇家赌场》的导演都来自同一个国家吗?
这里需要跟进问题吗:是的。
跟进:《大白鲨》的导演是谁?
中间答案:《大白鲨》的导演是Steven Spielberg。
跟进:Steven Spielberg来自哪里?
中间答案:美国。
跟进:《皇家赌场》的导演是谁?
中间答案:《皇家赌场》的导演是Martin Campbell。
跟进:Martin Campbell来自哪里?
中间答案:新西兰。
所以最终答案是:不是
question:craigslist的创始人是什么时候出生的?
这里需要跟进问题吗:是的。
跟进:craigslist的创始人是谁?
中间答案:craigslist由Craig Newmark创立。
跟进:Craig Newmark是什么时候出生的?
中间答案:Craig Newmark于1952年12月6日出生。
所以最终答案是:1952年12月6日
question:黄月英的老公是刘备的军师吗
是的,黄月英的老公是诸葛亮,而诸葛亮正是刘备的军师。所以最终答案是:是的。
更多推荐



所有评论(0)