当前位置: 首页 > web >正文

langchain 简单与ollama 关联使用

文章目录

    • ollama使用embedding模型,文本向量化
    • Ollama 模型查询

在这里插入图片描述

ollama使用embedding模型,文本向量化

获取 ollama Embedding 的 对应 模型, 访问连接

embeddings = OllamaEmbeddings(base_url= "http://127.0.0.1:11434",model="mxbai-embed-large:latest"
)

使用 LangChain 中的 OllamaEmbeddings 类来初始化一个本地运行的嵌入模型(embedding model)的实例。这个模型可以将文本数据转换为向量表示(即 embeddings),常用于语义搜索、相似性匹配、RAG(Retrieval-Augmented Generation)等场景。

# 准备文档
text = """对应文档信息知识
"""text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20)
chunks = text_splitter.split_text(text)

准备 测试 信息 文档或者 文本都可以, 然后通过对应处理 分成几个文本块

# 创建向量存储
# 将文本块(chunks)通过嵌入模型(embeddings)转化为向量表示,并建立一个可以快速查找相似向量的 FAISS 索引。
vectorstore = FAISS.from_texts(chunks, embeddings# vectorstore 是一个 FAISS 类型的对象,内部封装了:
# FAISS 索引(用于高效搜索)
# 原始文档列表(chunks)
# 可选的元数据信息
retriever = vectorstore.as_retriever()

你可以给 .as_retriever() 添加一些参数,例如:

retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 2})

search_type: 搜索类型,默认是 “similarity”(相似性搜索)
search_kwargs: 控制搜索行为的参数:
“k”: 表示每次检索返回几个最相似的文档块(默认是 4)
总结流程
文本 → 分割成 chunks → 文本嵌入 → FAISS 索引 → Retriever(可检索)→ 查询 → 相关文档结果

可以使用 对应的向量化数据库去存储对应出来的向量化数据,方便后续查找
当前使用 psycopg2 库连接到 PostgreSQL 数据库
docker 安装 pg 数据库

docker run --name postgresql -e POSTGRES_USER=postgres -v E:/docker/postgres/pgvector_data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=password -p 5436:5432 -d ankane/pgvector:latest

连接 postgres 数据库

docker exec -it postgresql psql -h  127 .0.0.1 -p  5432  -U postgres

启用pgvector扩展:

create extension vector;

确认向量存在于扩展列表中:

select * from pg_extension;oid  | extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition
-------+---------+----------+--------------+----------------+------------+-----------+--------------13561 | plpgsql |       10 |           11 | f              | 1.0        |           |16388 | vector  |       10 |         2200 | t              | 0.5.1      |           |
(2 rows)
————————————————
# 初始化向量数据库
# 连接数据库
# dbname: 要连接的数据库名称,这里是 "test_db"。
# user: 连接数据库使用的用户名,这里是 "postgres"。
# password: 对应用户的密码。
# host: 数据库服务器的IP地址或主机名,这里是 "192.168.5.240".
# port: 数据库服务器监听的端口号,这里是 "5436"。
conn = psycopg2.connect(dbname="test_db",user="postgres",password="password",host="192.168.5.240",port="5436"
)
# 创建一个游标对象 cur,通过该对象可以执行 SQL 语句并处理结果集。
cur = conn.cursor()# 插入数据
for i, text in enumerate(texts):vector = document_vector[i]  # 获取向量cur.execute("""INSERT INTO public.embeddings (id, "text", embedding, created_at)VALUES(nextval('embeddings_id_seq'::regclass), %s, %s::VECTOR, CURRENT_TIMESTAMP);""", (text, vector))# 提交事务并关闭连接
conn.commit()
cur.close()
conn.close()

插入数据

for i, text in enumerate(texts):vector = document_vector[i]  # 获取向量cur.execute("""INSERT INTO public.embeddings (id, "text", embedding, created_at)VALUES(nextval('embeddings_id_seq'::regclass), %s, %s::VECTOR, CURRENT_TIMESTAMP);""", (text, vector))
  • 遍历 texts 列表,对于每个文本项获取对应的向量(假设 document_vector 是与 texts 相同长度的列表)。
  • 使用 cur.execute() 方法执行 SQL 的 INSERT 语句,将文本和对应的向量插入到 public.embeddings 表中。
  • %s 是占位符,用于动态地传入参数值 (text, vector),这有助于防止SQL注入攻击。
  • ‘embeddings_id_seq’::regclass 是用来生成唯一的ID,假定在数据库中已经定义了名为 embeddings_id_seq 的序列。
  • embedding 字段存储的是向量数据,注意到这里将其强制转换为 VECTOR 类型(假设数据库支持这种类型)。
  • CURRENT_TIMESTAMP 会自动填充当前的时间戳作为记录的创建时间。

提交事务并关闭连接

conn.commit()
cur.close()
conn.close()
  • conn.commit() 提交当前事务,使得所有对数据库的更改生效。
  • cur.close() 关闭游标,释放资源。
  • conn.close() 关闭数据库连接。

Ollama 模型查询

如上面 一样通过 text 提问获取到 以保存的 向量化 数据通过 ollama 的llm 提问生成对应回答,一个简易的问答知识流程

# 创建 OllamaEmbeddings 实例
embedding = OllamaEmbeddings(# 选择要使用的模型  以下两个模型均支持嵌入# model="deepseek-r1:7b",model="mxbai-embed-large:latest",   # ollama run llama3.1:8b  使用此命令下载模型,自己机器配置选择不同的模型base_url="http://127.0.0.1:11434"  # Ollama 服务的基础 URL
)
text = "用户问题有关上面的知识信息"## 开始向量化
document_vector = embedding.embed_documents(text)[0]
## 向量化数据信息
print("llama document Embedding:", document_vector)# 准备查询语句,使用 <-> 操作符进行L2距离计算
query = """
SELECT id, text, embedding, created_at,embedding <=> %s::VECTOR AS distance
FROM public.embeddings
ORDER BY distance
LIMIT 5;
"""# 执行查询
cur.execute(query, (list(document_vector),))results = cur.fetchall()
# for row in results:
#     print(f"ID: {row[0]}, Text: {row[1]}, Distance: {row[4]}")
shujuku = [row[1] for row in results]
print(shujuku)

使用 ChatOllama 加载本地运行的 Qwen 模型。
构建消息上下文:
将系统提示词 llm_prompt 和数据库内容 shujuku(应为字符串列表)拼接后作为系统消息。
用户输入 text 作为用户消息。
使用 stream() 方法获取模型的流式输出。
实时打印每个 chunk,并将其累积到 content 字符串中。
最后再次打印完整的 content。

# 初始化 LLM
model = ChatOllama(model="qwen2.5:32b-instruct-q5_K_S",base_url="http://127.0.0.1:11434"
)
messages = [("system", llm_prompt+', '.join(shujuku)),("user", text)
]
content = ""
for chunk in model.stream(messages):print(chunk.content, end='', flush=True)content = content + chunk.contentprint(content)
http://www.xdnf.cn/news/3024.html

相关文章:

  • Thinkphp开发自适应职业学生证书查询系统职业资格等级会员证书管理网站
  • SMPP协议解析
  • mysql数据库连接数不足导致 Bean 注入失败
  • 4月28号
  • TCP三次握手
  • [TxRxResult] There is no status packet! 及 Incorrect status packet! 问题修复
  • 第一章 应急响应- Linux入侵排查
  • 文件基础-----C语言经典题目(11)
  • 前端vue2修改echarts字体为思源黑体-避免侵权-可以更换为任意字体统一管理
  • Linux 权限管理
  • API文档生成与测试工具推荐
  • 提示词工程实战指南:解锁AI创作的隐藏技巧与实例
  • AI驱动全流程基于PLUS-InVEST模型的生态系统服务多情景智能模拟与土地利用优化、论文写作
  • Python3: 函数式编程特性
  • 基于Spring Boot 电商书城平台系统设计与实现(源码+文档+部署讲解)
  • Day16(贪心算法)——LeetCode45.跳跃游戏II763.划分字母区间
  • 异步IO与Tortoise-ORM的数据库
  • Markdown转WPS office工具pandoc实践笔记
  • 从 Pretrain 到 Fine-tuning:大模型迁移学习的核心原理剖析
  • 《数据结构之美--二叉树oj题练习》
  • 数据结构每日一题day13(链表)★★★★★
  • C语言教程(二十二):C 语言头文件详解
  • kafka消息的顺序性如何保持一致的
  • HTML Picture标签详细教程
  • 使用DDR4控制器实现多通道数据读写(十)
  • SpringBoot中获取系统及硬件信息
  • I2C、SPI、UART 协议详解:优缺点与使用场景
  • Git操作指令
  • Nacos源码—2.Nacos服务注册发现分析三
  • 数据库概论速成期中版