为了在 Python 的 FastAPI 项目中使用 Jina 进行向量化和重排序,您需要按照以下步骤安装和使用 Jina。
首先,确保您已经安装了 Jina。可以使用 pip
来安装。
pip install jina
如果需要特定的功能模块,例如自然语言处理相关的向量化模型,可以通过 Jina Hub
获取。
pip install jina[hub]
接下来,我们将 Jina 集成到 FastAPI 项目中,以执行向量化和重排序任务。假设我们使用的模型是 jinaai/jina-embeddings-v2-base-zh
。
/app
├── main.py # FastAPI 的主入口
├── services.py # Jina 向量化和重排序逻辑
├── models.py # 数据模型定义
from fastapi import FastAPI, HTTPException
from app.services import vectorize_query, rerank_results
app = FastAPI()
@app.post("/vectorize/")
async def vectorize(query: str):
try:
vector = vectorize_query(query)
return {"vector": vector}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.post("/rerank/")
async def rerank(queries: list[str], results: list[dict]):
try:
reranked_results = rerank_results(queries, results)
return {"reranked_results": reranked_results}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
from jina import Document, DocumentArray
# 模型定义,可以使用 jina-embeddings 或其他合适的模型
embedding_model = 'jinaai/jina-embeddings-v2-base-zh'
# 向量化查询
def vectorize_query(query: str):
doc = Document(text=query)
doc.embed(embed_model=embedding_model)
return doc.embedding.tolist()
# 重排序结果(可以根据向量化后的查询进行相似性计算,进行重排序)
def rerank_results(queries: list[str], results: list[dict]):
# 将查询向量化
query_docs = DocumentArray([Document(text=query) for query in queries])
query_docs.embed(embed_model=embedding_model)
# 将结果向量化
result_docs = DocumentArray([Document(text=result['text']) for result in results])
result_docs.embed(embed_model=embedding_model)
# 使用cosine similarity计算查询和结果之间的相似度,并进行重排序
for i, query_doc in enumerate(query_docs):
scores = []
for result_doc in result_docs:
similarity = query_doc.embedding @ result_doc.embedding # 计算内积作为相似度
scores.append(similarity)
# 根据相似度对结果进行排序
sorted_results = sorted(zip(results, scores), key=lambda x: x[1], reverse=True)
results = [item[0] for item in sorted_results] # 重新排序后的结果
return results
这部分可以根据需求定义 FastAPI 的输入输出模型,您可以使用 pydantic
来定义请求和响应的结构。
from pydantic import BaseModel
class Query(BaseModel):
text: str
class Result(BaseModel):
text: str
score: float
发送一个 POST 请求到 /vectorize/
,传递查询字符串,Jina 会将查询转换为向量。
请求示例:
curl -X 'POST' \
'http://127.0.0.1:8000/vectorize/' \
-H 'Content-Type: application/json' \
-d '{"query": "查询总资产"}'
响应示例:
{
"vector": [0.012, -0.023, 0.145, ...] # 这是查询向量化后的结果
}
发送查询和结果列表到 /rerank/
,Jina 会基于相似度计算对结果进行重排序。
请求示例:
curl -X 'POST' \
'http://127.0.0.1:8000/rerank/' \
-H 'Content-Type: application/json' \
-d '{"queries": ["查询总资产"], "results": [{"text": "公司资产报告"}, {"text": "公司负债情况"}]}'
响应示例:
{
"reranked_results": [
{"text": "公司资产报告", "score": 0.89},
{"text": "公司负债情况", "score": 0.67}
]
}
您可以使用 uvicorn
来运行 FastAPI 项目。
uvicorn app.main:app --reload
这将启动 FastAPI 服务,向量化和重排序功能将通过上述 API 端点公开。
这种架构非常灵活,您可以根据需要定制重排序算法(如使用 cosine similarity
或 dot product
),并根据项目需求选择不同的嵌入模型。