发现ai练中学是直接调自家的api(毕竟嘛。。。:) 想用openai官网的要一个非163非qq的邮箱&国外手机号(因为获取api必须验证手机号,好像也可以通过一些网站提供的国外手机号接收验证码服务,但是大概率被绑定过,最重要的是要钱)
秉持着白嫖至上的原则,让我想起之前在冲浪的时候,发现在github上的一个开源免费项目的openai接口以及代理,虽然4o啥的有限制,但是我们只用3.5练练手绰绰有余。当然也可以将这个api用到其他地方,readme文件中也提供了很多例子,有兴趣可以自己去看。
然后借助豆包(手动滑稽)的辅助下,开始了我的配置之旅。
首先在githhub上授权获取api,需要github账号(因为必须授权登录)完成后界面如下:
可能界面会有所不同,但是大差不差吧。
这个api要保存好,被别人知道就不好了 网上的建议是将api和base_url都配置到环境变量上,这样做可以确保代码更加安全和易于管理。
完成
接着以“易速鲜花”本地知识库的智能问答系统为例,文件结构与练中学一致,html、静态图和相关的材料直接拷贝就行。
有关代码TIPS
然后就是代码部分。注意导包时需将部分langchain改成langchain_community(可能是langchain版本太新:)
需要注意的是上述免费的api好像并不能调用课程中提到的OpenAI的Embedding Model做嵌入,所以我问豆包推荐了一个叫SentenceTransformers开源库,提供了大量的预训练模型,适用于各种NLP任务,包括文本嵌入,当然需要pip下载,现在万事俱备,只差运行。如果报错,则根据提示pip下载缺失的包即可(记得用清华源,否则会下的很慢)如:qdrant-client等等等
# 3.Store 将分割嵌入并存储在矢量数据库Qdrant中
from langchain_community.vectorstores import Qdrant
from sentence_transformers import SentenceTransformer
# 加载 SentenceTransformers 模型
model = SentenceTransformer('all-MiniLM-L6-v2')
class CustomEmbedding:
def embed_documents(self, documents):
return model.encode(documents).tolist()
def __call__(self, texts):
return self.embed_documents(texts)
custom_embedding = CustomEmbedding()
vectorstore = Qdrant.from_documents(
documents=chunked_documents, # 以分块的文档
# embedding=OpenAIEmbeddin gs(), # 用OpenAI的Embedding Model做嵌入
embedding=custom_embedding,
location=":memory:", # in-memory 存储e
collection_name="my_documents",) # 指定collection_name
为啥要用CustomEmbedding 类,原因则是用来包装 SentenceTransformer 模型,这样做是为了提供一个统一的接口,使得不同的嵌入模型能够以相同的方式被调用,从而提高代码的模块化和易于维护性。这种封装还能让我们灵活地替换或更新底层嵌入模型,而无需修改使用这些嵌入的代码。此外,封装还允许在类中添加额外的性能优化逻辑、错误处理机制和配置管理,确保嵌入过程中的错误能够被优雅地处理,并且可以管理模型参数和预处理步骤,使得模型的使用更加灵活和高效。
其他代码就不用大改,除了相关的文件路径。最后,右键启动就行,但是要等一会(还挺久的)等待终端有如下网址:
点击访问即可,加载页面也要等好一会(不知道为啥几行html要渲染这么久),接下来,在文本框中输入你想询问的问题(我这里输入的是花语),又要好一会,最终结果返回如下:
这样子就完成了(虽然大部分代码都是cv的),我们可以仿照课程代码思路,用自己电脑上的非结构化资料,也搞一个问答系统,有空的话可能发博客(看心情:)
项目总结
开发框架:
- 整个框架分为三个部分:数据源(包括非结构化数据、结构化数据和代码)、大模型应用(LLM App,即逻辑引擎,用于生成回答)、用例(基于大模型生成的回答构建QA/聊天机器人等系统)。
核心实现机制:
- 数据处理管道(Pipeline),包括五个步骤:文档加载(Loading)、文本分割(Splitting)、存储(Storage)、检索(Retrieval)和输出(Output)。
- 文档加载:使用LangChain的document_loaders加载不同格式的文本文件。
- 文本分割:使用RecursiveCharacterTextSplitter将文档切分成小块。
- 存储:将分割好的文档块以嵌入形式存储到向量数据库中。
- 检索:应用程序从存储中检索分割后的文档,通过比较余弦相似度找到与输入问题类似的嵌入片。
- 输出:将问题和相似的嵌入片传递给语言模型(LLM),生成答案。
技术细节:
- 使用OpenAI的API Key,利用OpenAI的Embedding模型为文档做嵌入,并调用OpenAI的GPT模型生成问答系统中的回答。
- 文档被切成200字符左右的文档块,以便进行嵌入和向量存储。
- 使用OpenAIEmbeddings生成嵌入,并使用Qdrant向量数据库存储嵌入。
- 向量数据库用于存储和搜索向量形式的数据,特别适合处理非结构化数据。
- 比较向量之间的距离或相似度,使用余弦相似度作为度量标准。
课程中的其他需要用到api的地方应该都可以这样做