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)