1.大模型能做什么
用不严密但通俗的语言描述大模型的工作原理:
1.大模型阅读了人类曾说过的所有的话。这就是「机器学习」,这个过程叫「训练」
2.把一串 token后面跟着的不同token 的概率记了下来。记下的就是「参数」,也叫「权重」
3.当我们给它若干token,大模型就能算出概率最高的下一个token是什么。这就是「生成」,也叫「推理」
4.用生成的 token,再加上上文,就能继续生成下一个token。以此类推,生成更多文字。
2.LLM固有的局限性
1.LLM的知识不是实时的
2.LLM可能不知道你私有的领域/业务知识
3.RAG介绍
(Retrieval Augmented Generation - RAG) RAG 的核心是一个混合框架,它集成了检索模型和生成模型,生成的文本不仅上下文准确,而且信息丰富。

4.向量数据库
4.1文本向量库网站:https://www.sbert.net
4.2向量数据库
4.2.1 向量数据库介绍

这是一个7维变2维的过程的过程,向量维度越低,嵌入空间embeeding space中的特征表示就越紧凑,可能会影响下有任务或模型的训练质量。


4.2.2 向量数据库与传统数据库区别







4.3向量间相似度计算



4.4 RAG连接内存里的向量数据库的代码
距离计算代码形式:
def cos_sinia,b):
"余弦距离--越大越相似""|
return dot(a, b)/(norm(a)*norm(b))
def 12(a,b):
"""欧式距离--越小越相似""“
x=np.asarray(a)-np.asarray(b)
return norm(x)
调用openai提供的Embedding模型接口
def get_enbeddings(texts,model="text-embedding-ada-002"'):
"""封装0penAI的Embedding模型接口"""
data = client.embeddings.create(input=texts, model=mode1).data
return [x.embedding for x in data]
以向量数据库chromadb为例:
pip install chromadb
内存里构建向量数据库的写法:
#为了演示方便。我们只取文档两页(第一章)
paragraphs = extract_text_from_pdf("1lama2.pdf",page_numbers=[2,3],min_line_length=10)
import chromadb
from chromadb.config import Settings
class MyvectorDBConnector:
def _init_(self, collection_name,embedding_fn):
chroma_client = chromadb.Client(Settings(allow_reset=True))
#为了演示。实际不需要每次reset()
chroma_client.reset( )
#创建一个 collection
self.collection = chroma_client.get_or_create_collection(name=collection_name)
self.embedding_fn = embedding_fn
def add_documents(self, documents):
"""向collection中添加文档与向量"""
self.collection.add(
embeddings=self.embedding_fn(dacuments), #每个文档的向量
documents=documents, #文档的原文
ids=[f"id{i}" for i in range(len(documents))] #每个文格的id
)
def search(self, query, top_n):
""检索向量数据库" "
results = self.collection.query(
query _embeddings=self.embedding_fn([query]),
n_results=top_n
)
return results
#创建——个向量数据库对象
vector_db = MyvectorDBconnector ("deno", get_embeddings)
#往向量数据库中添加文档
vector_db.add_documents(paragraphs)
user_query = Llama 2有多少参数”
results = vector_db.search(user_query,2)
for para in results["documents"][0J:
print(para+"\n")
4.5 向量数据库服务代码
Server端
chroma run --path /db_path
Client端
import chromadb
chroma_client = chromadb.HttpClient(host='localhost', port=8000)
向量检索工具:
- FAISS: Meta开源的向量检索引擎 https://github.com/facebookresearch/faiss
- Pinecone:商用向量数据库,只有云服务https://www.pinecone.io/
- Milvus:开源向量数据库。同时有云服务https://milvus.io/
- Weaviate:开源向量数据库,同时有云服务https://weaviate.io/
- Qdrant:开源向量数据库,同时有云服务https://qdrant.tech/
- PGVector: Postgres的开源向量检索引擎 https://github.com/pgvector/pgvector
- 性能上不推荐这两:
- RediSearch:Redis 的开源向量检索引擎https//github.com/RediSearch/RediSearch.
- ElasticSearch 也支持向量检索 https:/ /www.elastic.coj/enterprise-search/vector-search
class RAG_Bot;
def _init_(self, vector_db,llm_api, n_results=2):
self.vector_db = vector_db
self.llm_api = llm_api
self.n_results = n_results
def chat(self, user_query) :
#1,检索
search_results = self.vector_db.search(user_query,self.n_results)
# 2、构建Prompt
prompt = build_prompt(
prompt_template, info=search_results['documents'][0],query=user_query)
# 3.调用LLM
response = self.llm_api(prompt)
return response
#创建一个RAG机器
bot =RAG_Bot(
vector_db,
llm_api=get_completion
)
user_query = “llama 2有多少参数?”
response = bot.chat(user_query)
print(response)
1246

被折叠的 条评论
为什么被折叠?



