最近OpenAI限制了国内对ChatGPT的接入,作者与身边许多朋友都在抱怨,许多基于OpenAI进行落地的AI项目看这个情况也得大改(无奈)。基于这种情况,作者尝试使用讯飞星火大模型进行项目实现,以下是作者尝试的方案情况。
目录
一、使用讯飞星火API
首先,需要进入讯飞开放平台注册一个账号讯飞开放平台-以语音交互为核心的人工智能开放平台科大讯飞推出的移动互联网智能交互平台,为开发者免费提供:涵盖语音能力增强型SDK,一站式人机智能语音交互解决方案,专业全面的移动应用分析;https://www.xfyun.cn/目前讯飞有一个SparkMax大模型一个亿token的免费方案,创建项目之后开源免费购买,Max模型对于非科研类项目还是够用的,如果觉得效果不行Ultra版模型也有相应的token赠送。
进入讯飞官网的文档可以了解到初步的API调用方法星火认知大模型Web API文档 | 讯飞开放平台文档中心
首先,安装讯飞星火官方包
pip install --upgrade spark_ai_python
然后就可以运行下面代码实现最基础的chat调用
from sparkai.llm.llm import ChatSparkLLM, ChunkPrintHandler
from sparkai.core.messages import ChatMessage
#星火认知大模型Spark Max的URL值,其他版本大模型URL值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看
SPARKAI_URL = 'wss://spark-api.xf-yun.com/v3.5/chat'
#星火认知大模型调用秘钥信息,请前往讯飞开放平台控制台(https://console.xfyun.cn/services/bm35)查看
SPARKAI_APP_ID = ''
SPARKAI_API_SECRET = ''
SPARKAI_API_KEY = ''
#星火认知大模型Spark Max的domain值,其他版本大模型domain值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看
SPARKAI_DOMAIN = 'generalv3.5'
if __name__ == '__main__':
spark = ChatSparkLLM(
spark_api_url=SPARKAI_URL,
spark_app_id=SPARKAI_APP_ID,
spark_api_key=SPARKAI_API_KEY,
spark_api_secret=SPARKAI_API_SECRET,
spark_llm_domain=SPARKAI_DOMAIN,
streaming=False,
)
messages = [ChatMessage(
role="user",
content='你好呀'
)]
handler = ChunkPrintHandler()
a = spark.generate([messages], callbacks=[handler])
print(a)
二、实现RAG外挂知识库
首先我们需要创建一个知识库,作者这边使用langchain库进行创建
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain.document_loaders import DirectoryLoader
from langchain_community.embeddings import HuggingFaceEmbeddings
# 加载文件夹中的所有txt类型的文件
loader = DirectoryLoader('./', glob='*.txt')
# 将数据转成 document 对象,每个文件会作为一个 document
documents = loader.load()
# 初始化加载器
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
# 切割加载的 document
split_docs = text_splitter.split_documents(documents)
# 这边的model_name可以根据自己需要选择,运行时会根据模型自动在线拉取
model_name = "all-MiniLM-L6-v2"
embeddings = HuggingFaceEmbeddings(
model_name=model_name,
)
# 将 document 通过 openai 的 embeddings 对象计算 embedding 向量信息并临时存入 Chroma 向量数据库,用于后续匹配查询
docsearch = Chroma.from_documents(split_docs, embeddings, persist_directory="./vector_store")
docsearch.persist()
# 加载数据
docsearch = Chroma(persist_directory="./vector_store", embedding_function=embeddings)
之后就可以使用我们的知识库对我们的问题进行向量化的相似度匹配,然后将输出结果转化为提示词,与问题结合,进行chat调用就可以简单的实现RAG外挂知识库的功能,如果使用其他的API也可以参考这种方法(如使用OpenAI进行模型调用还可以直接使用langchain库建议调用)
question = "什么是组织创新网络"
# 加载之前持久化数据(k值为选取4个最匹配结果输出)
similarDocs = docsearch.similarity_search(question, k=4)
info = ""
for similardoc in similarDocs:
info = info + similardoc.page_content
question = "结合以下信息:" + info + "回答" + question
from sparkai.llm.llm import ChatSparkLLM, ChunkPrintHandler
from sparkai.core.messages import ChatMessage
#星火认知大模型Spark Max的URL值,其他版本大模型URL值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看
SPARKAI_URL = 'wss://spark-api.xf-yun.com/v3.5/chat'
#星火认知大模型调用秘钥信息,请前往讯飞开放平台控制台(https://console.xfyun.cn/services/bm35)查看
SPARKAI_APP_ID = ''
SPARKAI_API_SECRET = ''
SPARKAI_API_KEY = ''
#星火认知大模型Spark Max的domain值,其他版本大模型domain值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看
SPARKAI_DOMAIN = 'generalv3.5'
if __name__ == '__main__':
spark = ChatSparkLLM(
spark_api_url=SPARKAI_URL,
spark_app_id=SPARKAI_APP_ID,
spark_api_key=SPARKAI_API_KEY,
spark_api_secret=SPARKAI_API_SECRET,
spark_llm_domain=SPARKAI_DOMAIN,
streaming=False,
max_tokens=500
)
messages = [ChatMessage(
role="user",
content=question
)]
handler = ChunkPrintHandler()
a = spark.generate([messages], callbacks=[handler]).generations[0][0].text
print(a)
作者这边使用的是一篇论文作为知识库文档,也可以使用其他格式,如doc、pdf等,只要将其转化为document类型就可以。
Output:组织创新网络是一种由多个组织构成的网络,这些组织通过复杂的关系相互连接,共同致力于创新活动。这种网络的目的是获取更多的异质性资源,汇聚不同类型组织的优势资源,促进信息及知识在网络中的实时流动,弥补单一企业内部知识资源的不足,发挥个体的知识创新资源,从而提高企业创新质量。
总结
以上是接入讯飞星火大模型API结合RAG实现外挂知识库的简单实现,在线搜索等也可以使用将结果转化为提示词,同问题一起向AI提问的思路。